Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package topgrade for openSUSE:Factory 
checked in at 2026-06-22 17:28:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/topgrade (Old)
 and      /work/SRC/openSUSE:Factory/.topgrade.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "topgrade"

Mon Jun 22 17:28:02 2026 rev:27 rq:1360726 version:17.6.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/topgrade/topgrade.changes        2026-06-11 
17:29:20.931331756 +0200
+++ /work/SRC/openSUSE:Factory/.topgrade.new.1956/topgrade.changes      
2026-06-22 17:29:05.753027825 +0200
@@ -1,0 +2,16 @@
+Sat Jun 20 12:16:12 UTC 2026 - Gerald Chen <[email protected]>
+
+- Update to version 17.6.2:
+  * chore: release v17.6.2 (#2089)
+  * fix(brew): add assume_yes support (#2090)
+  * chore(deps): update actions/checkout action to v7 (#2096)
+  * chore(deps): update rust crate itertools to 0.15.0 (#2095)
+  * chore(deps): lock file maintenance (#2093)
+  * docs: fix winget_silent_install key name in config.example.toml (#2092)
+  * fix(powershell): skip step if there is a wrapper script (#2087)
+  * fix(brew): don't panic when linuxbrew owner uid has no passwd entry (#2063)
+  * fix(pip3): skip self-update on Termux (#2065)
+  * fix(nix): don't skip self-upgrade on non-NixOS Linux (#2072)
+  * chore(deps): update release-plz/action action to v0.5.130 (#2084)
+
+-------------------------------------------------------------------

Old:
----
  topgrade-17.6.1.tar.zst

New:
----
  topgrade-17.6.2.tar.zst

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ topgrade.spec ++++++
--- /var/tmp/diff_new_pack.twYTDT/_old  2026-06-22 17:29:07.405085373 +0200
+++ /var/tmp/diff_new_pack.twYTDT/_new  2026-06-22 17:29:07.405085373 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           topgrade
-Version:        17.6.1
+Version:        17.6.2
 Release:        0
 Summary:        Upgrade all the things
 License:        GPL-3.0-only
@@ -26,7 +26,6 @@
 Source0:        %{name}-%{version}.tar.zst
 Source1:        vendor.tar.zst
 BuildRequires:  cargo-packaging
-BuildRequires:  zstd
 ExclusiveArch:  %{rust_tier1_arches}
 
 %description

++++++ _service ++++++
--- /var/tmp/diff_new_pack.twYTDT/_old  2026-06-22 17:29:07.441086627 +0200
+++ /var/tmp/diff_new_pack.twYTDT/_new  2026-06-22 17:29:07.445086767 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/topgrade-rs/topgrade.git</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="scm">git</param>
-    <param name="revision">v17.6.1</param>
+    <param name="revision">v17.6.2</param>
     <param name="match-tag">*</param>
     <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.twYTDT/_old  2026-06-22 17:29:07.473087742 +0200
+++ /var/tmp/diff_new_pack.twYTDT/_new  2026-06-22 17:29:07.477087881 +0200
@@ -1,7 +1,7 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/topgrade-rs/topgrade.git</param>
-              <param 
name="changesrevision">171d0b608b5e0a603cf3b365b6a069e351ec0279</param></service><service
 name="tar_scm">
+              <param 
name="changesrevision">67c2d3a79188f94f17407274f2c9a1e35e6d028d</param></service><service
 name="tar_scm">
                 <param 
name="url">https://ghproxy.net/https://github.com/topgrade-rs/topgrade.git</param>
               <param 
name="changesrevision">ef0a0d69bbe0cb08d6c4930ee18b734e03c215fb</param></service></servicedata>
 (No newline at EOF)

++++++ topgrade-17.6.1.tar.zst -> topgrade-17.6.2.tar.zst ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-17.6.1/.github/workflows/check_config_creation_if_not_exists.yml 
new/topgrade-17.6.2/.github/workflows/check_config_creation_if_not_exists.yml
--- 
old/topgrade-17.6.1/.github/workflows/check_config_creation_if_not_exists.yml   
    2026-06-10 20:08:38.000000000 +0200
+++ 
new/topgrade-17.6.2/.github/workflows/check_config_creation_if_not_exists.yml   
    2026-06-20 12:13:59.000000000 +0200
@@ -14,7 +14,7 @@
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/.github/workflows/check_i18n.yml 
new/topgrade-17.6.2/.github/workflows/check_i18n.yml
--- old/topgrade-17.6.1/.github/workflows/check_i18n.yml        2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/check_i18n.yml        2026-06-20 
12:13:59.000000000 +0200
@@ -14,7 +14,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-17.6.1/.github/workflows/check_security_vulnerability.yml 
new/topgrade-17.6.2/.github/workflows/check_security_vulnerability.yml
--- old/topgrade-17.6.1/.github/workflows/check_security_vulnerability.yml      
2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/check_security_vulnerability.yml      
2026-06-20 12:13:59.000000000 +0200
@@ -24,7 +24,7 @@
       security-events: write
     steps:
       - name: Checkout code
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/.github/workflows/ci.yml 
new/topgrade-17.6.2/.github/workflows/ci.yml
--- old/topgrade-17.6.1/.github/workflows/ci.yml        2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/ci.yml        2026-06-20 
12:13:59.000000000 +0200
@@ -28,7 +28,7 @@
     name: Format (cargo fmt)
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -41,7 +41,7 @@
     name: Custom checks
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -119,7 +119,7 @@
 
           # Ignores the cross-compiled targets for simplicity; they contain a 
minimal amount of code anyway.
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -180,7 +180,7 @@
       cargo_cmd: ${{ matrix.use_cross == true && 'cross' || 'cargo' }}
       matrix_target: ${{ matrix.target }}
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-17.6.1/.github/workflows/create_release_assets.yml 
new/topgrade-17.6.2/.github/workflows/create_release_assets.yml
--- old/topgrade-17.6.1/.github/workflows/create_release_assets.yml     
2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/create_release_assets.yml     
2026-06-20 12:13:59.000000000 +0200
@@ -33,7 +33,7 @@
     env:
       tag: ${{ github.event.client_payload.tag }}
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -170,7 +170,7 @@
       matrix_target: ${{ matrix.target }}
       tag: ${{ github.event.client_payload.tag }}
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -302,7 +302,7 @@
         shell: openbsd {0}
 
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -382,7 +382,7 @@
     permissions:
       contents: write # `gh release edit`
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
       - name: Publish release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-17.6.1/.github/workflows/dependency-review.yml 
new/topgrade-17.6.2/.github/workflows/dependency-review.yml
--- old/topgrade-17.6.1/.github/workflows/dependency-review.yml 2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/dependency-review.yml 2026-06-20 
12:13:59.000000000 +0200
@@ -17,7 +17,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: 'Checkout Repository'
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/.github/workflows/release-plz.yml 
new/topgrade-17.6.2/.github/workflows/release-plz.yml
--- old/topgrade-17.6.1/.github/workflows/release-plz.yml       2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/release-plz.yml       2026-06-20 
12:13:59.000000000 +0200
@@ -18,7 +18,7 @@
       id-token: write  # For trusted publishing
     steps:
       - name: Checkout repository
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           fetch-depth: 0
           persist-credentials: false
@@ -28,7 +28,7 @@
           toolchain: stable
       - name: Run release-plz
         id: release-plz
-        uses: release-plz/action@064f4d1e36c843611ddf013be726beaa4ad804db # 
v0.5.129
+        uses: release-plz/action@e8792575c7f2366cf6ff3ccc33ead9ace5b691c7 # 
v0.5.130
         with:
           command: release
         env:
@@ -57,7 +57,7 @@
       cancel-in-progress: false
     steps:
       - name: Checkout repository
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           fetch-depth: 0
           persist-credentials: false
@@ -66,7 +66,7 @@
         with:
           toolchain: stable
       - name: Run release-plz
-        uses: release-plz/action@064f4d1e36c843611ddf013be726beaa4ad804db # 
v0.5.129
+        uses: release-plz/action@e8792575c7f2366cf6ff3ccc33ead9ace5b691c7 # 
v0.5.130
         with:
           command: release-pr
         env:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-17.6.1/.github/workflows/release_to_pypi.yml 
new/topgrade-17.6.2/.github/workflows/release_to_pypi.yml
--- old/topgrade-17.6.1/.github/workflows/release_to_pypi.yml   2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/release_to_pypi.yml   2026-06-20 
12:13:59.000000000 +0200
@@ -15,7 +15,7 @@
       matrix:
         target: [x86_64, x86, aarch64]
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -37,7 +37,7 @@
       matrix:
         target: [x64, x86]
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -58,7 +58,7 @@
       matrix:
         target: [x86_64, aarch64]
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
@@ -76,7 +76,7 @@
   sdist:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/.github/workflows/scorecards.yml 
new/topgrade-17.6.2/.github/workflows/scorecards.yml
--- old/topgrade-17.6.1/.github/workflows/scorecards.yml        2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/.github/workflows/scorecards.yml        2026-06-20 
12:13:59.000000000 +0200
@@ -36,7 +36,7 @@
 
     steps:
       - name: "Checkout code"
-        uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # 
v6.0.3
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 
v7.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/CHANGELOG.md 
new/topgrade-17.6.2/CHANGELOG.md
--- old/topgrade-17.6.1/CHANGELOG.md    2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/CHANGELOG.md    2026-06-20 12:13:59.000000000 +0200
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [17.6.2](https://github.com/topgrade-rs/topgrade/compare/v17.6.1...v17.6.2) 
- 2026-06-20
+
+### Fixed
+
+- *(brew)* add assume_yes support 
([#2090](https://github.com/topgrade-rs/topgrade/pull/2090))
+- *(powershell)* skip step if there is a wrapper script 
([#2087](https://github.com/topgrade-rs/topgrade/pull/2087))
+- *(brew)* don't panic when linuxbrew owner uid has no passwd entry 
([#2063](https://github.com/topgrade-rs/topgrade/pull/2063))
+- *(pip3)* skip self-update on Termux 
([#2065](https://github.com/topgrade-rs/topgrade/pull/2065))
+- *(nix)* don't skip self-upgrade on non-NixOS Linux 
([#2072](https://github.com/topgrade-rs/topgrade/pull/2072))
+
 ## [17.6.1](https://github.com/topgrade-rs/topgrade/compare/v17.5.1...v17.6.1) 
- 2026-06-10
 
 ### Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/Cargo.lock 
new/topgrade-17.6.2/Cargo.lock
--- old/topgrade-17.6.1/Cargo.lock      2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/Cargo.lock      2026-06-20 12:13:59.000000000 +0200
@@ -381,9 +381,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.63"
+version = "1.2.64"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f"
+checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
 dependencies = [
  "find-msvc-tools",
  "jobserver",
@@ -757,9 +757,6 @@
 version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
-dependencies = [
- "powerfmt",
-]
 
 [[package]]
 name = "derive_arbitrary"
@@ -1335,9 +1332,9 @@
 
 [[package]]
 name = "http"
-version = "1.4.1"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0"
+checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
 dependencies = [
  "bytes",
  "itoa",
@@ -1643,9 +1640,9 @@
 
 [[package]]
 name = "itertools"
-version = "0.14.0"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc"
 dependencies = [
  "either",
 ]
@@ -1730,13 +1727,12 @@
 
 [[package]]
 name = "js-sys"
-version = "0.3.99"
+version = "0.3.102"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
+checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
 dependencies = [
  "cfg-if",
  "futures-util",
- "once_cell",
  "wasm-bindgen",
 ]
 
@@ -1814,14 +1810,16 @@
 
 [[package]]
 name = "mac-notification-sys"
-version = "0.6.13"
+version = "0.6.14"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "50efa634682b3fc5a1ab6f3dd5b2bce7b848011fc485b53b063dc68f2f74feae"
+checksum = "04fd0110fd05744c3c904acf1a8ca624a721d75a35638f127cd5fb6b7ccfb1bf"
 dependencies = [
  "cc",
+ "log",
  "objc2",
  "objc2-foundation",
  "time",
+ "uuid",
 ]
 
 [[package]]
@@ -1835,9 +1833,9 @@
 
 [[package]]
 name = "memchr"
-version = "2.8.1"
+version = "2.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
+checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
 
 [[package]]
 name = "memoffset"
@@ -2403,9 +2401,9 @@
 
 [[package]]
 name = "regex"
-version = "1.12.3"
+version = "1.12.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
+checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -2435,9 +2433,9 @@
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.10"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
 
 [[package]]
 name = "reqwest"
@@ -2986,9 +2984,9 @@
 
 [[package]]
 name = "smallvec"
-version = "1.15.1"
+version = "1.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
 
 [[package]]
 name = "socket2"
@@ -3211,12 +3209,11 @@
 
 [[package]]
 name = "time"
-version = "0.3.47"
+version = "0.3.49"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
+checksum = "711a53c2d47bbd818258c498c8dbfe186a2526c631495cfe7e078567f86b8469"
 dependencies = [
  "deranged",
- "itoa",
  "num-conv",
  "powerfmt",
  "serde_core",
@@ -3226,15 +3223,15 @@
 
 [[package]]
 name = "time-core"
-version = "0.1.8"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
+checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
 
 [[package]]
 name = "time-macros"
-version = "0.2.27"
+version = "0.2.29"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
+checksum = "71c652a3727a9cbb9a02f707f530b618ce00d0ccd762009c8c23bd191df3c17d"
 dependencies = [
  "num-conv",
  "time-core",
@@ -3406,7 +3403,7 @@
 
 [[package]]
 name = "topgrade"
-version = "17.6.1"
+version = "17.6.2"
 dependencies = [
  "chrono",
  "clap",
@@ -3422,7 +3419,7 @@
  "glob",
  "indexmap",
  "is_elevated",
- "itertools 0.14.0",
+ "itertools 0.15.0",
  "jetbrains-toolbox-updater",
  "merge",
  "nix",
@@ -3721,10 +3718,11 @@
 
 [[package]]
 name = "uuid"
-version = "1.23.2"
+version = "1.23.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7"
+checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
 dependencies = [
+ "getrandom 0.4.2",
  "js-sys",
  "serde_core",
  "wasm-bindgen",
@@ -3769,9 +3767,9 @@
 
 [[package]]
 name = "wasip2"
-version = "1.0.3+wasi-0.2.9"
+version = "1.0.4+wasi-0.2.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
+checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
 dependencies = [
  "wit-bindgen 0.57.1",
 ]
@@ -3787,9 +3785,9 @@
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.122"
+version = "0.2.125"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
+checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -3800,9 +3798,9 @@
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.72"
+version = "0.4.75"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f"
+checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -3810,9 +3808,9 @@
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.122"
+version = "0.2.125"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
+checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -3820,9 +3818,9 @@
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.122"
+version = "0.2.125"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
+checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
 dependencies = [
  "bumpalo",
  "proc-macro2",
@@ -3833,9 +3831,9 @@
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.122"
+version = "0.2.125"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
+checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
 dependencies = [
  "unicode-ident",
 ]
@@ -3876,9 +3874,9 @@
 
 [[package]]
 name = "web-sys"
-version = "0.3.99"
+version = "0.3.102"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436"
+checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -4580,18 +4578,18 @@
 
 [[package]]
 name = "zerocopy"
-version = "0.8.50"
+version = "0.8.52"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
+checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.8.50"
+version = "0.8.52"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
+checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -4621,9 +4619,9 @@
 
 [[package]]
 name = "zeroize"
-version = "1.8.2"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
+checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
 
 [[package]]
 name = "zerotrie"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/Cargo.toml 
new/topgrade-17.6.2/Cargo.toml
--- old/topgrade-17.6.1/Cargo.toml      2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/Cargo.toml      2026-06-20 12:13:59.000000000 +0200
@@ -6,7 +6,7 @@
 license = "GPL-3.0-or-later"
 repository = "https://github.com/topgrade-rs/topgrade";
 rust-version = "1.88.0"
-version = "17.6.1"
+version = "17.6.2"
 exclude = ["doc/screenshot.gif", "BREAKINGCHANGES_dev.md"]
 edition = "2024"
 
@@ -46,7 +46,7 @@
 jetbrains-toolbox-updater = "6.0.0"
 indexmap = { version = "2.9.0", features = ["serde"] }
 serde_json = "1.0.145"
-itertools = "0.14.0"
+itertools = "0.15.0"
 clap-cargo = "0.18.0"
 edit = "0.1.5"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/config.example.toml 
new/topgrade-17.6.2/config.example.toml
--- old/topgrade-17.6.1/config.example.toml     2026-06-10 20:08:38.000000000 
+0200
+++ new/topgrade-17.6.2/config.example.toml     2026-06-20 12:13:59.000000000 
+0200
@@ -298,9 +298,9 @@
 
 # wsl_update_use_web_download = true
 
-# The default for winget_install_silently is true,
+# The default for winget_silent_install is true,
 # this example turns off silent install.
-# winget_install_silently = false
+# winget_silent_install = false
 
 # Causes Topgrade to rename itself during the run to allow package managers
 # to upgrade it. Use this only if you installed Topgrade by using a package
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/locales/app.yml 
new/topgrade-17.6.2/locales/app.yml
--- old/topgrade-17.6.1/locales/app.yml 2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/locales/app.yml 2026-06-20 12:13:59.000000000 +0200
@@ -152,6 +152,22 @@
   zh_CN: "未安装 Powershell"
   zh_TW: "未安裝 Powershell"
   de: "Powershell ist nicht installiert"
+"Cannot detect PowerShell in a dumb terminal":
+  en: "Cannot detect PowerShell in a dumb terminal"
+  lt: "Nepavyko aptikti PowerShell ribotame terminale"
+  es: "No se puede detectar PowerShell en un terminal limitado"
+  fr: "Impossible de détecter PowerShell dans un terminal limité"
+  zh_CN: "无法在简易终端中检测 PowerShell"
+  zh_TW: "無法在簡易終端機中偵測 PowerShell"
+  de: "PowerShell kann in einem eingeschränkten Terminal nicht erkannt werden"
+"{binary} at {path} is a wrapper script":
+  en: "%{binary} at %{path} is a wrapper script"
+  lt: "%{binary} kelyje %{path} yra apvalkalo scenarijus"
+  es: "%{binary} en %{path} es un script contenedor"
+  fr: "%{binary} à %{path} est un script d'encapsulation"
+  zh_CN: "%{path} 处的 %{binary} 是一个包装脚本"
+  zh_TW: "%{path} 處的 %{binary} 是一個包裝指令稿"
+  de: "%{binary} unter %{path} ist ein Wrapper-Skript"
 "PowerShellGet Update-Module is unavailable or could not be loaded. Skipping 
PowerShell module updates.":
   en: "PowerShellGet Update-Module is unavailable or could not be loaded. 
Skipping PowerShell module updates."
   lt: "PowerShellGet Update-Module nepasiekiama arba jos nepavyko įkelti. 
Praleidžiamas PowerShell modulių atnaujinimas."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/execution_context.rs 
new/topgrade-17.6.2/src/execution_context.rs
--- old/topgrade-17.6.1/src/execution_context.rs        2026-06-10 
20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/src/execution_context.rs        2026-06-20 
12:13:59.000000000 +0200
@@ -6,18 +6,16 @@
 
 use clap::ValueEnum;
 use color_eyre::eyre::Result;
-use rust_i18n::t;
 use serde::Deserialize;
 use strum::EnumString;
 
 use crate::config::Config;
-use crate::error::MissingSudo;
+use crate::error::{MissingSudo, SkipStep};
 use crate::executor::{DryCommand, Executor};
 use crate::powershell::Powershell;
 #[cfg(target_os = "linux")]
 use crate::steps::linux::Distribution;
 use crate::sudo::Sudo;
-use crate::utils::require_option;
 
 /// An enum telling whether Topgrade should perform dry runs or actually 
perform the steps.
 #[derive(Clone, Copy, Debug, Deserialize, Default, EnumString, ValueEnum)]
@@ -66,7 +64,7 @@
     under_ssh: bool,
     #[cfg(target_os = "linux")]
     distribution: &'a Result<Distribution>,
-    powershell: OnceLock<Option<Powershell>>,
+    powershell: OnceLock<Result<Powershell, SkipStep>>,
 }
 
 impl<'a> ExecutionContext<'a> {
@@ -131,14 +129,14 @@
         self.distribution
     }
 
-    pub fn powershell(&self) -> &Option<Powershell> {
+    pub fn powershell(&self) -> &Result<Powershell, SkipStep> {
         self.powershell.get_or_init(|| Powershell::new(self))
     }
 
     pub fn require_powershell(&self) -> Result<&Powershell> {
-        require_option(
-            self.powershell().as_ref(),
-            t!("Powershell is not installed").to_string(),
-        )
+        self.powershell()
+            .as_ref()
+            // necessary because `skip` is a `&SkipStep` borrowed from `self` 
(`skip.into()` gives E0521)
+            .map_err(|skip| SkipStep(skip.0.clone()).into())
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/steps/generic.rs 
new/topgrade-17.6.2/src/steps/generic.rs
--- old/topgrade-17.6.1/src/steps/generic.rs    2026-06-10 20:08:38.000000000 
+0200
+++ new/topgrade-17.6.2/src/steps/generic.rs    2026-06-20 12:13:59.000000000 
+0200
@@ -832,6 +832,10 @@
         .output_checked_utf8()
         .map_err(|_| SkipStep("pip does not exist".to_string()))?;
 
+    if cfg!(target_os = "android") {
+        return Err(SkipStep("pip is managed by termux".to_string()).into());
+    }
+
     let check_extern_managed_script = "import sysconfig; from os import path; 
print('Y') if path.isfile(path.join(sysconfig.get_path('stdlib'), 
'EXTERNALLY-MANAGED')) else print('N')";
     let output = ctx
         .execute(&python3)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/steps/git.rs 
new/topgrade-17.6.2/src/steps/git.rs
--- old/topgrade-17.6.1/src/steps/git.rs        2026-06-10 20:08:38.000000000 
+0200
+++ new/topgrade-17.6.2/src/steps/git.rs        2026-06-20 12:13:59.000000000 
+0200
@@ -58,7 +58,7 @@
                 repos.insert_if_repo(ctx, HOME_DIR.join(".dotfiles"));
             }
 
-            if let Some(powershell) = ctx.powershell()
+            if let Ok(powershell) = ctx.powershell()
                 && let Some(profile) = powershell.profile()
             {
                 repos.insert_if_repo(ctx, profile);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/steps/os/unix.rs 
new/topgrade-17.6.2/src/steps/os/unix.rs
--- old/topgrade-17.6.1/src/steps/os/unix.rs    2026-06-10 20:08:38.000000000 
+0200
+++ new/topgrade-17.6.2/src/steps/os/unix.rs    2026-06-20 12:13:59.000000000 
+0200
@@ -56,14 +56,14 @@
     #[cfg(target_os = "linux")]
     {
         let sudo_uid = brew_linux_sudo_uid();
-        // if brew is owned by another user, execute "sudo -Hu <uid> brew 
update"
+        // if brew is owned by another user, execute "sudo -Hu <user> brew 
update"
         if let Some(user_id) = sudo_uid {
             let uid = nix::unistd::Uid::from_raw(user_id);
-            let user = nix::unistd::User::from_uid(uid)
-                .expect("failed to call getpwuid()")
-                .expect("this user should exist");
-
-            return Some(user.name);
+            match nix::unistd::User::from_uid(uid) {
+                Ok(Some(user)) => return Some(user.name),
+                Ok(None) => warn!("no matching owner of linuxbrew found; 
running brew as the current user"),
+                Err(err) => warn!("getpwuid() failed for UID {user_id}: {err}; 
running brew as the current user"),
+            }
         }
     }
     None
@@ -382,6 +382,10 @@
     let mut command = brew.execute(ctx)?;
     command.args(["upgrade", "--formula"]);
 
+    if ctx.config().yes(Step::BrewFormula) {
+        command.arg("-y");
+    }
+
     if ctx.config().brew_fetch_head() {
         command.arg("--fetch-HEAD");
     }
@@ -459,6 +463,9 @@
         }
     } else {
         brew_args.extend(["upgrade", "--cask"]);
+        if ctx.config().yes(Step::BrewCask) {
+            brew_args.push("-y");
+        }
         if ctx.config().brew_cask_greedy() {
             brew_args.push("--greedy");
         }
@@ -631,16 +638,14 @@
     let nix = require("nix")?;
 
     // Should we attempt to upgrade Nix with `nix upgrade-nix`?
-    #[allow(unused_mut)]
-    let mut should_self_upgrade = cfg!(target_os = "macos");
-
     #[cfg(target_os = "linux")]
-    {
+    let should_self_upgrade = match ctx.distribution() {
         // We can't use `nix upgrade-nix` on NixOS.
-        if let Ok(Distribution::NixOS) = Distribution::detect() {
-            should_self_upgrade = false;
-        }
-    }
+        Ok(Distribution::NixOS) => false,
+        _ => true,
+    };
+    #[cfg(not(target_os = "linux"))]
+    let should_self_upgrade = cfg!(target_os = "macos");
 
     if !should_self_upgrade {
         return Err(SkipStep(t!("`nix upgrade-nix` can only be used on macOS or 
non-NixOS Linux").to_string()).into());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/steps/powershell.rs 
new/topgrade-17.6.2/src/steps/powershell.rs
--- old/topgrade-17.6.1/src/steps/powershell.rs 2026-06-10 20:08:38.000000000 
+0200
+++ new/topgrade-17.6.2/src/steps/powershell.rs 2026-06-20 12:13:59.000000000 
+0200
@@ -4,9 +4,11 @@
 use color_eyre::eyre::Result;
 #[cfg(windows)]
 use color_eyre::eyre::eyre;
+use rust_i18n::t;
 use tracing::debug;
 
 use crate::command::CommandExt;
+use crate::error::SkipStep;
 use crate::execution_context::ExecutionContext;
 use crate::executor::Executor;
 use crate::terminal;
@@ -19,25 +21,49 @@
 }
 
 impl Powershell {
-    pub fn new(ctx: &ExecutionContext) -> Option<Self> {
+    /// Detects a usable PowerShell. The `Err` carries the reason so the step 
can
+    /// surface it as its skip message instead of a generic "not installed"
+    pub fn new(ctx: &ExecutionContext) -> Result<Self, SkipStep> {
         if terminal::is_dumb() {
-            return None;
+            return Err(SkipStep(t!("Cannot detect PowerShell in a dumb 
terminal").to_string()));
         }
 
-        let (path, is_pwsh) = which("pwsh")
-            .map(|p| (Some(p), true))
-            .or_else(|| which("powershell").map(|p| (Some(p), false)))
-            .unwrap_or((None, false));
-
-        path.map(|path| {
-            let mut ret = Self {
-                path,
-                profile: None,
-                is_pwsh,
+        let (path, is_pwsh) = Self::detect_path()?;
+
+        let mut ret = Self {
+            path,
+            profile: None,
+            is_pwsh,
+        };
+        ret.set_profile(ctx);
+        Ok(ret)
+    }
+
+    fn detect_path() -> Result<(PathBuf, bool), SkipStep> {
+        let mut skip_reason = SkipStep(t!("Powershell is not 
installed").to_string());
+
+        for (binary, is_pwsh) in [("pwsh", true), ("powershell", false)] {
+            let Some(path) = which(binary) else {
+                continue;
             };
-            ret.set_profile(ctx);
-            ret
-        })
+
+            if path.has_shebang() {
+                skip_reason = SkipStep(
+                    t!(
+                        "{binary} at {path} is a wrapper script",
+                        binary = binary,
+                        path = path.display()
+                    )
+                    .to_string(),
+                );
+                debug!("{skip_reason}");
+                continue;
+            }
+
+            return Ok((path, is_pwsh));
+        }
+
+        Err(skip_reason)
     }
 
     pub fn profile(&self) -> Option<&PathBuf> {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-17.6.1/src/utils.rs 
new/topgrade-17.6.2/src/utils.rs
--- old/topgrade-17.6.1/src/utils.rs    2026-06-10 20:08:38.000000000 +0200
+++ new/topgrade-17.6.2/src/utils.rs    2026-06-20 12:13:59.000000000 +0200
@@ -25,6 +25,9 @@
     fn if_exists(self) -> Option<Self>;
     fn is_descendant_of(&self, ancestor: &Path) -> bool;
 
+    /// Used to check for UNIX launcher shims that shadow a real executable
+    fn has_shebang(&self) -> bool;
+
     /// Returns the path if it exists or ErrorKind::SkipStep otherwise
     fn require(self) -> Result<Self>;
 }
@@ -47,6 +50,17 @@
         self.as_ref().iter().zip(ancestor.iter()).all(|(a, b)| a == b)
     }
 
+    fn has_shebang(&self) -> bool {
+        use std::io::Read;
+
+        // checks for `#!` by the reading the first 2 bytes of the file
+        let mut magic = [0u8; 2];
+        std::fs::File::open(self.as_ref())
+            .and_then(|mut file| file.read_exact(&mut magic))
+            .is_ok()
+            && &magic == b"#!"
+    }
+
     fn require(self) -> Result<Self> {
         if self.as_ref().exists() {
             debug!("Path {:?} exists", self.as_ref());

++++++ vendor.tar.zst ++++++
/work/SRC/openSUSE:Factory/topgrade/vendor.tar.zst 
/work/SRC/openSUSE:Factory/.topgrade.new.1956/vendor.tar.zst differ: char 7, 
line 1

Reply via email to