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
