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, &current) && 
!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

Reply via email to