Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package artcraft-launcher for
openSUSE:Factory checked in at 2026-10-30 18:12:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/artcraft-launcher (Old)
and /work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "artcraft-launcher"
Fri Oct 30 18:12:15 2026 rev:2 rq:1393854 version:0.10.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/artcraft-launcher/artcraft-launcher.changes
2026-10-28 21:11:01.984315605 +0100
+++
/work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255/artcraft-launcher.changes
2026-10-30 18:20:54.332881281 +0100
@@ -1,0 +2,43 @@
+Fri Oct 30 08:16:48 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.10.0 (upstream tag v0.10.0, 2026-10-29):
+ * Per-app version choice: latest stable, nightly or a pinned
+ published version; pinned apps skip badges and Update all.
+ * Launcher version selectable in Settings, Updates; going
+ back uses a manual download, self-update moves forward.
+ * Windows: verified MSI downgrades with restore on failure,
+ Program Files default for new installs, batched prompts.
+ * SolidCraft joins the catalog as a community app with
+ Official and Community labels; refreshed descriptions.
+ * Re-vendored: dependency set unchanged (only the version
+ stamp moved), so the licence set is unchanged as well.
+ * Rebase artcraft-launcher-pkcon-first.patch for the new
+ sources; its remove hunk reuses upstream's package name.
+
+-------------------------------------------------------------------
+Thu Oct 29 12:39:39 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.9.0 (upstream tag v0.9.0, 2026-10-28):
+ * UI moved to egui 0.37; settings and sort dropdowns use the
+ shared craft-ui ComboBox; CJK text waits for its fonts.
+ * Self-update delegated to the shared craft-update helper.
+ * Windows: updates keep the installed copy's folder and scope
+ (per-user installs no longer duplicate per-machine and vice
+ versa); custom folders the account cannot write install for
+ everyone with an administrator prompt.
+ * Dependency refreshes (serde_json, winresource, plist, ureq,
+ tray-icon, egui stack).
+ * Re-vendored: new craft-update, craft-ui, craft-i18n and
+ craft-fonts-build (MIT OR Apache-2.0) plus ICU/Unicode crates
+ (Unicode-3.0); option-ext (MPL-2.0) still linked through dirs
+ 6, X11-only libxdo crates gone. Licence set unchanged, no new
+ system deps.
+ * Rebase artcraft-launcher-pkcon-first.patch for the new
+ upstream sources (doc-comment hunk).
+ * Add artcraft-launcher-no-self-update.patch: the rpm-managed
+ copy only announces a newer launcher (download link), it never
+ installs upstream builds over distro files.
+- Add artcraft-launcher-drop-unused-egui-patches.patch:
+ drop unused [patch.crates-io] pins the vendor omits
+
+-------------------------------------------------------------------
Old:
----
artcraft-launcher-0.8.1.tar.zst
New:
----
artcraft-launcher-0.10.0.tar.zst
artcraft-launcher-drop-unused-egui-patches.patch
artcraft-launcher-no-self-update.patch
----------(New B)----------
New: installs upstream builds over distro files.
- Add artcraft-launcher-drop-unused-egui-patches.patch:
drop unused [patch.crates-io] pins the vendor omits
New: upstream sources (doc-comment hunk).
* Add artcraft-launcher-no-self-update.patch: the rpm-managed
copy only announces a newer launcher (download link), it never
----------(New E)----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ artcraft-launcher.spec ++++++
--- /var/tmp/diff_new_pack.o8stQw/_old 2026-10-30 18:21:00.364133760 +0100
+++ /var/tmp/diff_new_pack.o8stQw/_new 2026-10-30 18:21:00.370134012 +0100
@@ -17,7 +17,7 @@
Name: artcraft-launcher
-Version: 0.8.1
+Version: 0.10.0
Release: 0
Summary: Install, update and launch the Craft App Suite
# Legal-Review-Notice: scope is the one shipped target (artcraft-launcher,
@@ -46,7 +46,7 @@
# present in the source tarball unmodified because the build needs it:
# crates/ui-egui/src/icons.rs and apps/artcraft-launcher/src/tray.rs embed
# five of its files at compile time (include_image!/include_bytes!), so a
-# tar_scm exclude breaks %build on every arch. Nothing from it is ever
+# tar_scm exclude breaks the build section on every arch. Nothing from it is
ever
# installed. The installed hicolor app icon is that same "A" mark rendered
unmodified
# by upstream packaging/icons.sh for use as this app's own icon
# (assets/app-icon/LICENSE.txt permits it unmodified as part of this
@@ -61,6 +61,14 @@
Source1: vendor.tar.zst
# PATCH-FIX-UPSTREAM artcraft-launcher-pkcon-first.patch -- Linux
install/update/remove through PackageKit when the distro carries the app
(storytold/craft-launcher#256, open): pkcon-first with download-flow fallback,
OCR-reviewed
Patch0: artcraft-launcher-pkcon-first.patch
+# PATCH-FIX-OPENSUSE artcraft-launcher-no-self-update.patch -- rpm-managed
copy must not replace itself from upstream: announce-only launcher update
(download link), install path refused
+Patch1: artcraft-launcher-no-self-update.patch
+# PATCH-FIX-OPENSUSE artcraft-launcher-drop-unused-egui-patches.patch -- drop
three
+# [patch.crates-io] pins (egui_demo_lib, egui_inspection,
+# egui_system_font_provider) that nothing uses (Cargo.lock [[patch.unused]]):
+# cargo_vendor omits them from vendor.tar.zst, so any --offline resolve
+# fails; upstreamable as cleanup once upstream drops the pins.
+Patch2: artcraft-launcher-drop-unused-egui-patches.patch
BuildRequires: appstream-glib
BuildRequires: c_compiler
BuildRequires: cargo >= 1.95
@@ -100,6 +108,10 @@
%build
%limit_build -m 2000
+# NOTE: keep the parameterized cargo macros in this spec in braced form
+# (cargo_build, cargo_test). The bare form misparses its arguments
+# in the Factory build root (Unknown option - in cargo_build(), adi:5);
+# spec-cleaner wants to unbrace them, so this is a --cleaner-deviation.
# Build only the desktop app; the web app (apps/artcraft-launcher-web) is
# wasm-only and out of scope for this package.
%{cargo_build} --locked -p artcraft-launcher
@@ -108,10 +120,10 @@
install -Dm0755 target/release/artcraft-launcher
%{buildroot}%{_bindir}/artcraft-launcher
install -Dm0644 packaging/linux/ai.storyteller.artcraft-launcher.desktop
%{buildroot}%{_datadir}/applications/ai.storyteller.artcraft-launcher.desktop
install -d -m 0755 %{buildroot}%{_datadir}/metainfo
-# Fixed upstream release date (v0.8.1, 2026-10-25): a build-time date would
+# Fixed upstream release date (v0.10.0, 2026-10-29): a build-time date would
# make the metainfo differ on every rebuild, and spec-cleaner macro-expands
-# the %-sequences of any date format string, so keep this a plain string.
-sed -e "s/@VERSION@/%{version}/g" -e "s/@DATE@/2026-10-25/g"
packaging/linux/ai.storyteller.artcraft-launcher.metainfo.xml.in >
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
+# the percent-sequences of any date format string, so keep this a plain string.
+sed -e "s/@VERSION@/%{version}/g" -e "s/@DATE@/2026-10-29/g"
packaging/linux/ai.storyteller.artcraft-launcher.metainfo.xml.in >
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
# Upstream declares the app icon as type="stock" but it is a custom hicolor
# icon, so declare it as cached for appstream validation.
sed -i 's|<icon type="stock">ai.storyteller.artcraft-launcher</icon>|<icon
type="cached" width="64"
height="64">ai.storyteller.artcraft-launcher.png</icon>|'
%{buildroot}%{_datadir}/metainfo/ai.storyteller.artcraft-launcher.metainfo.xml
++++++ _service ++++++
--- /var/tmp/diff_new_pack.o8stQw/_old 2026-10-30 18:21:00.533140835 +0100
+++ /var/tmp/diff_new_pack.o8stQw/_new 2026-10-30 18:21:00.545141338 +0100
@@ -2,7 +2,7 @@
<service mode="manual" name="tar_scm">
<param name="url">https://github.com/storytold/craft-launcher.git</param>
<param name="scm">git</param>
- <param name="revision">v0.8.1</param>
+ <param name="revision">v0.10.0</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="versionrewrite-replacement">\1</param>
@@ -22,7 +22,8 @@
<service mode="manual" name="set_version"/>
<service mode="manual" name="cargo_vendor">
<param name="src">artcraft-launcher-*.tar.zst</param>
- <param name="update">true</param>
+ <param name="update">false</param>
+ <param name="respect-lockfile">true</param>
</service>
<service mode="manual" name="cargo_audit"/>
</services>
++++++ artcraft-launcher-0.8.1.tar.zst -> artcraft-launcher-0.10.0.tar.zst
++++++
++++ 15385 lines of diff (skipped)
++++++ artcraft-launcher-drop-unused-egui-patches.patch ++++++
From: openSUSE Publishing <[email protected]>
Subject: [PATCH] Drop unused egui patch pins so the offline vendor build
resolves
Bug: none (downstream build fix, upstreamable as cleanup)
Upstream pins three egui crates (egui_demo_lib, egui_inspection,
egui_system_font_provider) in [patch.crates-io] that nothing in
the workspace uses (Cargo.lock lists all three under
[[patch.unused]]). cargo_vendor therefore omits them from
vendor.tar.zst, and any --offline/--locked resolve against the
vendor directory fails with "patch location ... does not contain
packages matching ...". Drop the three unused pins (plus their
[[patch.unused]] lock stanzas, so --locked stays satisfied); the
[[package]] set is unchanged. (egui_extras stays: crates/ui-egui
uses it, unlike in filmcraft where it was unused too.)
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -64,8 +64,5 @@
egui_glow = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
egui_extras = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
egui_kittest = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
-egui_system_font_provider = { git = "https://github.com/storytold/egui.git",
rev = "6d518fc799681571963842f95b55a6b68431b15a" }
eframe = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
-egui_demo_lib = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
-egui_inspection = { git = "https://github.com/storytold/egui.git", rev =
"6d518fc799681571963842f95b55a6b68431b15a" }
winit = { git = "https://github.com/storytold/winit.git", rev =
"a517b3846ee8457d84ee4975110bfda6797c44dc" }
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6558,17 +6558,5 @@
"winnow 1.0.4",
]
-[[patch.unused]]
-name = "egui_demo_lib"
-version = "0.37.0"
-source =
"git+https://github.com/storytold/egui.git?rev=6d518fc799681571963842f95b55a6b68431b15a#6d518fc799681571963842f95b55a6b68431b15a"
-[[patch.unused]]
-name = "egui_inspection"
-version = "0.37.0"
-source =
"git+https://github.com/storytold/egui.git?rev=6d518fc799681571963842f95b55a6b68431b15a#6d518fc799681571963842f95b55a6b68431b15a"
-[[patch.unused]]
-name = "egui_system_font_provider"
-version = "0.37.0"
-source =
"git+https://github.com/storytold/egui.git?rev=6d518fc799681571963842f95b55a6b68431b15a#6d518fc799681571963842f95b55a6b68431b15a"
++++++ artcraft-launcher-no-self-update.patch ++++++
--- a/crates/native/src/backend.rs
+++ b/crates/native/src/backend.rs
@@ -2,7 +2,7 @@
use std::collections::HashMap;
use std::sync::atomic::{AtomicBool, Ordering};
-use std::sync::{Arc, Mutex, OnceLock, PoisonError};
+use std::sync::{Arc, Mutex, PoisonError};
use std::time::{Duration, Instant};
use artcraft_launcher_core::catalog::{LAUNCHER, LAUNCHER_ID};
@@ -64,12 +64,9 @@
/// A detection pass is running; another request waits for the next one.
detecting: AtomicBool,
last_check: Mutex<Option<i64>>,
- /// The newer ArtCraft Launcher release, once a check has found one.
- launcher_release: Mutex<Option<Release>>,
- /// How this launcher is installed, when it can replace itself. Worked out
on the check thread
- /// just before a newer launcher is announced: finding out can ask the
host's Flatpak, which
- /// mustn't hold up the first frame.
- self_install: OnceLock<Option<crate::self_update::Install>>,
+ // PATCH-FIX-OPENSUSE: this copy is rpm-managed, so there is no
self-install
+ // state (no launcher_release/self_install): the backend can never offer
or run
+ // an in-place self-update; the UI falls back to a download link.
/// When GitHub was last asked about each app (Unix seconds), to keep the
fallback rare.
github_asked: Mutex<HashMap<String, i64>>,
/// Apps with an answer (a release or "none yet") from either service.
@@ -161,8 +158,6 @@
options: Mutex::new(BackendOptions::default()),
checking: AtomicBool::new(false),
detecting: AtomicBool::new(false),
- launcher_release: Mutex::new(None),
- self_install: OnceLock::new(),
github_asked: Mutex::new(HashMap::new()),
answered: Mutex::new(std::collections::HashSet::new()),
loaded: AtomicBool::new(false),
@@ -390,54 +385,16 @@
});
}
- /// Downloads the newer launcher, puts it in place and asks the UI to quit
so it can start.
+ /// Refuses a launcher self-update: this copy is rpm-managed, replacing it
from
+ /// upstream would clobber distro files.
+ ///
+ /// PATCH-FIX-OPENSUSE: `capabilities` reports `self_update: false`, so
the UI offers
+ /// a download link instead of reaching this; any `UpdateLauncher` command
arriving
+ /// anyway gets the same refusal.
fn update_launcher(&self) {
- let id = LAUNCHER_ID.to_string();
- let (Some(install), Some(platform)) =
(self.shared.self_install.get().cloned().flatten(), self.platform) else {
- self.shared.emit(Event::JobFinished {
- app: id,
- result: Err("this copy of ArtCraft Launcher can't update
itself; download the new version instead".into()),
- });
- return;
- };
- let Some(release) =
self.shared.launcher_release.lock().unwrap_or_else(PoisonError::into_inner).clone()
else { return };
- let stop = Arc::new(Stop::default());
- {
- let mut jobs =
self.shared.jobs.lock().unwrap_or_else(PoisonError::into_inner);
- if jobs.contains_key(&id) {
- return;
- }
- jobs.insert(id.clone(), stop.clone());
- }
- let job = JobGuard { shared: self.shared.clone(), app_id: id.clone() };
- let (shared, paths, http) = (self.shared.clone(), self.paths.clone(),
self.http.clone());
- std::thread::spawn(move || {
- let job = job;
- let mut last_emit = Instant::now() - Duration::from_secs(1);
- let mut phase = |p: JobPhase| {
- if matches!(p, JobPhase::Downloading { done, total } if done
!= total && done != 0) && last_emit.elapsed() < Duration::from_millis(50)
- {
- return;
- }
- last_emit = Instant::now();
- shared.emit(Event::Progress { app: LAUNCHER_ID.to_string(),
phase: p });
- };
- let last = || {
- let mut waiting = || shared.emit(Event::Progress { app:
LAUNCHER_ID.to_string(), phase: JobPhase::Waiting });
- claim_restart(&shared.jobs, &shared.restarting, &stop,
RESTART_WAIT, &mut waiting)
- };
- let result = match http.as_ref() {
- Some(http) => crate::self_update::update(&install, &release,
platform, http, &paths, &stop, &mut phase, &last),
- None => Err("secure connections aren't available on this
system".into()),
- };
- drop(job);
- match result {
- Ok(()) => shared.emit(Event::LauncherRestarting),
- Err(e) => {
- shared.restarting.store(false, Ordering::SeqCst);
- shared.emit(Event::JobFinished { app:
LAUNCHER_ID.to_string(), result: Err(e) });
- }
- }
+ self.shared.emit(Event::JobFinished {
+ app: LAUNCHER_ID.to_string(),
+ result: Err("this copy of ArtCraft Launcher can't update itself;
download the new version instead".into()),
});
}
@@ -715,12 +672,13 @@
}
/// Offers the launcher's own update when its answer is a newer release than
the running one.
+///
+/// PATCH-FIX-OPENSUSE: announces only, never arms an in-place install
(rpm-managed copy).
+/// The release event still reaches the UI, which then offers a download link.
fn launcher_update(paths: &Paths, latest: Option<LatestRelease>, shared:
&Arc<Shared>) {
let Some(LatestRelease::Found(r)) = latest else { return };
let (Some(newest), Some(current)) = (r.version.as_ref(),
crate::self_update::current_version()) else { return };
if version::is_newer(newest, ¤t) &&
!crate::self_update::just_updated_to(paths, &r) {
- shared.self_install.get_or_init(crate::self_update::current);
-
*shared.launcher_release.lock().unwrap_or_else(PoisonError::into_inner) =
Some(r.clone());
shared.emit(Event::LauncherUpdate(r));
}
}
@@ -1113,7 +1071,9 @@
Some(Os::Windows) => "Show in Explorer",
_ => "Show in Files",
};
- Capabilities { manage_apps: true, reveal_label, self_update:
self.shared.self_install.get().is_some_and(Option::is_some) }
+ // PATCH-FIX-OPENSUSE: rpm-managed copy, never offer in-place
self-update;
+ // the update dialog then offers a download link instead.
+ Capabilities { manage_apps: true, reveal_label, self_update: false }
}
fn platform(&self) -> Option<Platform> {
@@ -1178,8 +1138,6 @@
checking: AtomicBool::new(false),
detecting: AtomicBool::new(false),
last_check: Mutex::new(None),
- launcher_release: Mutex::new(None),
- self_install: OnceLock::new(),
github_asked: Mutex::new(HashMap::new()),
answered: Mutex::new(std::collections::HashSet::new()),
loaded: AtomicBool::new(false),
++++++ artcraft-launcher-pkcon-first.patch ++++++
--- /var/tmp/diff_new_pack.o8stQw/_old 2026-10-30 18:21:01.066163149 +0100
+++ /var/tmp/diff_new_pack.o8stQw/_new 2026-10-30 18:21:01.074163483 +0100
@@ -1,9 +1,9 @@
--- a/crates/native/src/backend.rs
+++ b/crates/native/src/backend.rs
-@@ -503,6 +503,30 @@
+@@ -556,6 +556,30 @@
shared.emit(Event::Progress { app: app.id.to_string(), phase: p });
};
- let mut job = Job { http, paths, stop, phase: &mut phase,
install_locations: &options.install_locations, replace };
+ let mut job = Job { http, paths, stop, phase: &mut phase,
install_locations: &options.install_locations, replace, downgrade };
+ // PackageKit: the distro's own package, installed and upgraded with the
distro's
+ // signature, dependencies and authentication. A distro carrying no such
package
+ // resolves to a miss and gets the download below, unchanged.
@@ -33,10 +33,10 @@
let mut updated = manifest.clone();
--- a/crates/native/src/install.rs
+++ b/crates/native/src/install.rs
-@@ -4,9 +4,11 @@
- //!
- //! - macOS: the signed `.app` from the release DMG into `/Applications`.
- //! - Windows: the release MSI (Windows Installer) into `C:\Program
Files\<App>`.
+@@ -6,9 +6,11 @@
+ //! - Windows: the release MSI (Windows Installer), for the current user into
+ //! `%LOCALAPPDATA%\Programs\ArtCraft\<App>` by default. An update keeps
the installed copy's folder
+ //! and scope (per-machine copies stay in `C:\Program
Files\ArtCraft\<App>`).
-//! - Linux: the distro's own package (`.deb` through apt on the Debian
family, `.rpm` through
-//! dnf/zypper/rpm on the Fedora, Red Hat and SUSE families, read from
`os-release`) with the
-//! system's polkit password prompt; otherwise a Flatpak, otherwise an
AppImage in
@@ -48,7 +48,7 @@
//! `~/Applications` (the AppImage convention), with a menu entry and icon
in
//! `~/.local/share` so it shows up like any other app. A Flatpak or
AppImage launcher prefers
//! its own format.
-@@ -770,6 +772,7 @@
+@@ -964,6 +966,7 @@
pub(crate) mod linux {
use std::ffi::{OsStr, OsString};
use std::os::unix::fs::PermissionsExt;
@@ -56,7 +56,7 @@
use artcraft_launcher_core::distro;
use artcraft_launcher_core::protocol::CANCELLED;
-@@ -796,6 +799,11 @@
+@@ -990,6 +993,11 @@
const SYSTEM: Root<'static> = Root { queue: &INSTALLER, run: &run_as_root
};
@@ -68,7 +68,7 @@
/// Runs `command target` as root. Jobs waiting for the same command go
into one call
/// (`apt-get install a.deb b.deb`), so the password is asked for once.
fn as_root(
-@@ -857,6 +865,10 @@
+@@ -1051,6 +1059,10 @@
let flatpak = process::is_flatpak_available();
let is_flatpak = process::in_sandbox();
let is_appimage = std::env::var_os("APPIMAGE").is_some();
@@ -79,7 +79,7 @@
let root = pkexec().is_some();
let os = ["/etc/os-release",
"/usr/lib/os-release"].iter().find_map(|p|
std::fs::read_to_string(p).ok()).unwrap_or_default();
let native = distro::native_package(&distro::parse_os_release(&os));
-@@ -954,8 +966,181 @@
+@@ -1148,9 +1160,181 @@
}
}
@@ -251,17 +251,17 @@
+
pub fn remove_package(app: &CraftApp, installed: &Installed, stop: &Stop,
phase: &mut dyn FnMut(JobPhase)) -> Result<(), String> {
let mut remove = |command: &[&str], package: &str| as_root(&SYSTEM,
command, OsStr::new(package), stop, phase, JobPhase::Removing);
+ let package = installed.package.as_deref().unwrap_or(app.id);
+ // PackageKit removes whatever put the package there — the launcher
from a file, an
+ // older launcher, the distro itself or the user's own `rpm -i` —
under the name the
+ // package manager gave it, and asks for permission itself.
+ if pkcon_available() && matches!(installed.source, InstallSource::Deb
| InstallSource::Rpm) {
-+ let package = installed.package.as_deref().unwrap_or(app.id);
+ return as_root(&PKCON, &["-y", "remove"], OsStr::new(package),
stop, phase, JobPhase::Removing);
+ }
match installed.source {
- InstallSource::Deb if system_tool("apt-get").is_some() =>
remove(&["apt-get", "-o", APT_WAITS, "remove", "-y"], app.id),
- InstallSource::Deb => remove(&["dpkg", "-r"], app.id),
-@@ -2672,6 +2857,104 @@
+ // The package detected (photocraft, or
ai.storyteller.photocraft).
+ InstallSource::Deb if system_tool("apt-get").is_some() =>
remove(&["apt-get", "-o", APT_WAITS, "remove", "-y"], package),
+@@ -3245,6 +3429,104 @@
}
}
++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/artcraft-launcher/vendor.tar.zst
/work/SRC/openSUSE:Factory/.artcraft-launcher.new.1255/vendor.tar.zst differ:
char 7, line 1