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-10-08 13:28:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/topgrade (Old) and /work/SRC/openSUSE:Factory/.topgrade.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "topgrade" Thu Oct 8 13:28:06 2026 rev:35 rq:1383253 version:17.12.3 Changes: -------- --- /work/SRC/openSUSE:Factory/topgrade/topgrade.changes 2026-09-22 15:52:07.155499973 +0200 +++ /work/SRC/openSUSE:Factory/.topgrade.new.3698736/topgrade.changes 2026-10-08 13:28:49.567403594 +0200 @@ -1,0 +2,18 @@ +Thu Oct 08 08:12:12 UTC 2026 - Gerald Chen <[email protected]> + +- Update to version 17.12.3: + * chore: release v17.12.3 (#2383) + * fix: restore old working directory when opening a shell (#2391) + * chore(deps): update rust to v1.99.0 (#2386) + * chore(pre-commit): autoupdate (#2384) + * chore(deps): update github/codeql-action action to v4.38.2 (#2375) + * chore(deps): update vmactions/openbsd-vm action to v1.4.8 (#2378) + * chore(deps): lock file maintenance (#2381) + * fix(mise): skip self-update when disabled by the package manager (#2374) + * chore: release v17.12.2 (#2369) + * fix(hyprpm): run hyprpm at the end to avoid dropping cached sudo credentials for other steps + * fix(brew): run brew at the end to avoid dropping cached sudo credentials for other steps + * fix(zed): support preview channel (#2372) + * chore(pre-commit): autoupdate (#2368) + +------------------------------------------------------------------- Old: ---- topgrade-17.12.1.tar.zst New: ---- topgrade-17.12.3.tar.zst ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ topgrade.spec ++++++ --- /var/tmp/diff_new_pack.9qPHX7/_old 2026-10-08 13:28:52.818539652 +0200 +++ /var/tmp/diff_new_pack.9qPHX7/_new 2026-10-08 13:28:52.820539736 +0200 @@ -17,7 +17,7 @@ Name: topgrade -Version: 17.12.1 +Version: 17.12.3 Release: 0 Summary: Upgrade all the things License: GPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.9qPHX7/_old 2026-10-08 13:28:52.946545009 +0200 +++ /var/tmp/diff_new_pack.9qPHX7/_new 2026-10-08 13:28:52.956545428 +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.12.1</param> + <param name="revision">v17.12.3</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.9qPHX7/_old 2026-10-08 13:28:53.046549195 +0200 +++ /var/tmp/diff_new_pack.9qPHX7/_new 2026-10-08 13:28:53.062549864 +0200 @@ -1,7 +1,7 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/topgrade-rs/topgrade.git</param> - <param name="changesrevision">25e20b9e0e1d035b1e731d7fa913ad9463f21c8f</param></service><service name="tar_scm"> + <param name="changesrevision">710856320124b85228e42846d133b3fd1a3ab5ae</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.12.1.tar.zst -> topgrade-17.12.3.tar.zst ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/.github/workflows/check_security_vulnerability.yml new/topgrade-17.12.3/.github/workflows/check_security_vulnerability.yml --- old/topgrade-17.12.1/.github/workflows/check_security_vulnerability.yml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/.github/workflows/check_security_vulnerability.yml 2026-10-02 19:59:59.000000000 +0200 @@ -32,6 +32,6 @@ uses: microsoft/DevSkim-Action@4b5047945a44163b94642a1cecc0d93a3f428cc6 # v1.0.16 - name: Upload DevSkim scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 + uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: sarif_file: devskim-results.sarif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/.github/workflows/create_release_assets.yml new/topgrade-17.12.3/.github/workflows/create_release_assets.yml --- old/topgrade-17.12.1/.github/workflows/create_release_assets.yml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/.github/workflows/create_release_assets.yml 2026-10-02 19:59:59.000000000 +0200 @@ -307,7 +307,7 @@ persist-credentials: false - name: Start OpenBSD VM - uses: vmactions/openbsd-vm@86cdc08415d9d0865267e686561e276c52d62530 # v1.4.7 + uses: vmactions/openbsd-vm@5f7b2c933b8846a138361d6843c52af4bef5d945 # v1.4.8 with: arch: x86_64 sync: nfs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/.github/workflows/scorecards.yml new/topgrade-17.12.3/.github/workflows/scorecards.yml --- old/topgrade-17.12.1/.github/workflows/scorecards.yml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/.github/workflows/scorecards.yml 2026-10-02 19:59:59.000000000 +0200 @@ -71,6 +71,6 @@ # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1 + uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 with: sarif_file: results.sarif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/.pre-commit-config.yaml new/topgrade-17.12.3/.pre-commit-config.yaml --- old/topgrade-17.12.1/.pre-commit-config.yaml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/.pre-commit-config.yaml 2026-10-02 19:59:59.000000000 +0200 @@ -17,7 +17,7 @@ - id: trailing-whitespace - repo: https://github.com/adhtruong/mirrors-typos - rev: v1.50.1 + rev: v1.50.3 hooks: - id: typos args: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/CHANGELOG.md new/topgrade-17.12.3/CHANGELOG.md --- old/topgrade-17.12.1/CHANGELOG.md 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/CHANGELOG.md 2026-10-02 19:59:59.000000000 +0200 @@ -7,6 +7,19 @@ ## [Unreleased] +## [17.12.3](https://github.com/topgrade-rs/topgrade/compare/v17.12.2...v17.12.3) - 2026-10-02 + +### Fixed +- restore old working directory when opening a shell ([#2391](https://github.com/topgrade-rs/topgrade/pull/2391)) +- *(mise)* skip self-update when disabled by the package manager ([#2374](https://github.com/topgrade-rs/topgrade/pull/2374)) + +## [17.12.2](https://github.com/topgrade-rs/topgrade/compare/v17.12.1...v17.12.2) - 2026-09-26 + +### Fixed +- *(hyprpm)* run hyprpm at the end to avoid dropping cached sudo credentials for other steps +- *(brew)* run brew at the end to avoid dropping cached sudo credentials for other steps +- *(zed)* support preview channel ([#2372](https://github.com/topgrade-rs/topgrade/pull/2372)) + ## [17.12.1](https://github.com/topgrade-rs/topgrade/compare/v17.12.0...v17.12.1) - 2026-09-21 ### Fixed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/Cargo.lock new/topgrade-17.12.3/Cargo.lock --- old/topgrade-17.12.1/Cargo.lock 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/Cargo.lock 2026-10-02 19:59:59.000000000 +0200 @@ -412,9 +412,9 @@ [[package]] name = "cc" -version = "1.4.7" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +checksum = "f360145194ee8e21db5ee7f3fcd4fe52210864c75c985dae33218202c8bbe040" dependencies = [ "find-msvc-tools", "jobserver", @@ -961,13 +961,12 @@ [[package]] name = "encoding_rs" -version = "0.8.41" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" dependencies = [ "cfg-if", "core_detect", - "multiversion", "multiversion_no_op", "rustversion", "scopeguard", @@ -1102,9 +1101,9 @@ [[package]] name = "find-msvc-tools" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "flate2" @@ -1141,7 +1140,7 @@ "bstr", "log", "memchr", - "thiserror 2.0.20", + "thiserror 2.0.21", "unicase", "xdg", ] @@ -1485,16 +1484,17 @@ [[package]] name = "hyper-util" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" dependencies = [ - "base64 0.22.1", + "base64 0.23.1", "bytes", "futures-channel", "futures-util", "http", "http-body", + "httparse", "hyper", "ipnet", "libc", @@ -1753,7 +1753,7 @@ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.20", + "thiserror 2.0.21", "walkdir", "windows-link 0.2.1", ] @@ -1802,9 +1802,9 @@ [[package]] name = "js-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -1825,9 +1825,9 @@ [[package]] name = "libredox" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ "libc", ] @@ -1997,27 +1997,6 @@ ] [[package]] -name = "multiversion" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" -dependencies = [ - "multiversion-macros", -] - -[[package]] -name = "multiversion-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" -dependencies = [ - "proc-macro2", - "quote", - "rustversion", - "syn 3.0.6", -] - -[[package]] name = "multiversion_no_op" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2384,7 +2363,7 @@ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "tracing", "web-time", @@ -2407,7 +2386,7 @@ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.20", + "thiserror 2.0.21", "tinyvec", "tracing", "web-time", @@ -2499,7 +2478,7 @@ checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" dependencies = [ "libredox", - "thiserror 2.0.20", + "thiserror 2.0.21", ] [[package]] @@ -2746,9 +2725,9 @@ [[package]] name = "rustls-platform-verifier" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +checksum = "1167586491e2b18b8bfbb293e8180ec17c201c4f076d7cb3070ca964e7598f98" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", @@ -2767,9 +2746,9 @@ [[package]] name = "rustls-platform-verifier-android" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" +checksum = "eec689c0bc40ff2458a5977b6619cb718087084a18e02a131c599b62d05e1a5f" [[package]] name = "rustls-webpki" @@ -3076,9 +3055,9 @@ [[package]] name = "siphasher" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" [[package]] name = "slab" @@ -3275,7 +3254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed071c670382e85fc2f48ae706492d8c338f4f89bf72520d32f8abfe880aade" dependencies = [ - "thiserror 2.0.20", + "thiserror 2.0.21", "windows 0.61.3", "windows-version", ] @@ -3304,11 +3283,11 @@ [[package]] name = "thiserror" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl 2.0.20", + "thiserror-impl 2.0.21", ] [[package]] @@ -3324,9 +3303,9 @@ [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", @@ -3530,7 +3509,7 @@ [[package]] name = "topgrade" -version = "17.12.1" +version = "17.12.3" dependencies = [ "chrono", "clap", @@ -3570,7 +3549,7 @@ "sysinfo", "system_shutdown", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.21", "tokio", "toml 1.1.6+spec-1.1.0", "tracing", @@ -3894,9 +3873,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -3907,19 +3886,20 @@ [[package]] name = "wasm-bindgen-futures" -version = "0.4.78" +version = "0.4.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" dependencies = [ "js-sys", + "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3927,9 +3907,9 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", @@ -3940,18 +3920,18 @@ [[package]] name = "wasm-bindgen-shared" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -4500,18 +4480,18 @@ [[package]] name = "zerocopy" -version = "0.8.57" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "6df92bf3d9227be3d53173901ddbffac2babc27ae50f397776ffd6dc33f800cb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.57" +version = "0.8.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "ac4f328cf2f05d084e496c3e9c3f33ed0a183656a16e1fcec4d464d8373aec82" dependencies = [ "proc-macro2", "quote", @@ -4601,7 +4581,7 @@ dependencies = [ "base64 0.22.1", "ed25519-dalek", - "thiserror 2.0.20", + "thiserror 2.0.21", ] [[package]] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/Cargo.toml new/topgrade-17.12.3/Cargo.toml --- old/topgrade-17.12.1/Cargo.toml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/Cargo.toml 2026-10-02 19:59: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.12.1" +version = "17.12.3" exclude = ["doc/screenshot.gif", "BREAKINGCHANGES_dev.md"] edition = "2024" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/locales/app.yml new/topgrade-17.12.3/locales/app.yml --- old/topgrade-17.12.1/locales/app.yml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/locales/app.yml 2026-10-02 19:59:59.000000000 +0200 @@ -1554,3 +1554,19 @@ zh_CN: "已删除已废弃的扩展目录:%{path}" zh_TW: "已刪除已淘汰的擴充功能目錄:%{path}" de: "Veraltetes Erweiterungsverzeichnis entfernt: %{path}" +"Updates unsupported for the Zed {channel} channel": + en: "Updates unsupported for the Zed %{channel} channel" + lt: "Zed %{channel} kanalo atnaujinimai nepalaikomi" + es: "No se admiten actualizaciones para el canal %{channel} de Zed" + fr: "Les mises à jour ne sont pas prises en charge pour le canal %{channel} de Zed" + zh_CN: "不支持更新 Zed %{channel} 渠道" + zh_TW: "不支援更新 Zed %{channel} 通道" + de: "Updates für den Zed-Kanal %{channel} werden nicht unterstützt" +"No Zed preview release found on GitHub": + en: "No Zed preview release found on GitHub" + lt: "GitHub'e nerasta Zed preview leidimo" + es: "No se encontró ninguna versión preview de Zed en GitHub" + fr: "Aucune version preview de Zed trouvée sur GitHub" + zh_CN: "在 GitHub 上找不到 Zed preview 版本" + zh_TW: "在 GitHub 上找不到 Zed preview 版本" + de: "Keine Zed-Preview-Version auf GitHub gefunden" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/rust-toolchain.toml new/topgrade-17.12.3/rust-toolchain.toml --- old/topgrade-17.12.1/rust-toolchain.toml 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/rust-toolchain.toml 2026-10-02 19:59:59.000000000 +0200 @@ -1,2 +1,2 @@ [toolchain] -channel = "1.98.1" +channel = "1.99.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/command.rs new/topgrade-17.12.3/src/command.rs --- old/topgrade-17.12.1/src/command.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/command.rs 2026-10-02 19:59:59.000000000 +0200 @@ -115,9 +115,6 @@ /// /// Returns an `Err` if the command failed to execute, if `succeeded` returns an `Err`, or if /// the output contains invalid UTF-8. - // This function is currently unused, but is useful and makes sense with `output_checked_with` - // and `output_checked_utf8` existing. - #[allow(dead_code)] #[track_caller] fn output_checked_with_utf8( &mut self, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/main.rs new/topgrade-17.12.3/src/main.rs --- old/topgrade-17.12.1/src/main.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/main.rs 2026-10-02 19:59:59.000000000 +0200 @@ -17,7 +17,7 @@ #[cfg(unix)] use etcetera::base_strategy::Xdg; use rust_i18n::{i18n, t}; -use std::sync::LazyLock; +use std::sync::{LazyLock, OnceLock}; use tempfile::{TempDir, tempdir}; use tracing::debug; @@ -59,6 +59,8 @@ // Init and load the i18n files i18n!("locales", fallback = "en"); +pub(crate) static OLD_CWD: OnceLock<PathBuf> = OnceLock::new(); + struct TempCwd { #[allow(unused)] temp_dir: TempDir, @@ -154,7 +156,8 @@ // Some steps (like mise or pi) have different behavior when ran in a project directory. // Since Topgrade only handles global updates, run all commands in a temporary directory. - let _temp_cwd = TempCwd::new()?; + let temp_cwd = TempCwd::new()?; + OLD_CWD.set(temp_cwd.old_cwd.clone()).unwrap(); let elevated = is_elevated(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/step.rs new/topgrade-17.12.3/src/step.rs --- old/topgrade-17.12.1/src/step.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/step.rs 2026-10-02 19:59:59.000000000 +0200 @@ -827,8 +827,6 @@ Winget, System, MicrosoftStore, - BrewFormula, - BrewCask, Zerobrew, Macports, Xcodes, @@ -880,7 +878,6 @@ Rcm, Maza, Adless, - Hyprpm, Atuin, Atom, Fossil, @@ -1003,6 +1000,11 @@ AntigravityCli, Zed, // Steps that should run last + // Runs `sudo -k` at startup, which drops cached sudo credentials for every later step + BrewFormula, + BrewCask, + // Runs `sudo -k` at the end, which drops cached sudo credentials for every later step + Hyprpm, // Last out of convention CustomCommands, // Last because it prompts for restart diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/steps/generic.rs new/topgrade-17.12.3/src/steps/generic.rs --- old/topgrade-17.12.1/src/steps/generic.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/steps/generic.rs 2026-10-02 19:59:59.000000000 +0200 @@ -2827,6 +2827,38 @@ pull_result } +#[derive(Deserialize)] +struct MiseDoctor { + // Added in mise 2025.7.2 + self_update_available: Option<bool>, +} + +/// Packagers can disable `mise self-update` without removing the subcommand (e.g. the APT package +/// ships a `mise-self-update-instructions.toml`), in which case it still shows up in `mise --help` +/// but fails when run. `mise doctor` reports whether self-update is actually available. +fn mise_supports_self_update(ctx: &ExecutionContext, mise: &Path) -> Result<bool> { + // `mise doctor` exits with 1 when it finds problems, so don't check the exit code. + let output = ctx + .execute(mise) + .always() + .args(["doctor", "--json"]) + .output_checked_with_utf8(|_| Ok(()))?; + let doctor: MiseDoctor = serde_json::from_str(&output.stdout) + .wrap_err_with(|| output_changed_message!("mise doctor --json", "json output invalid"))?; + if let Some(available) = doctor.self_update_available { + return Ok(available); + } + + // Older versions don't report it, but omit the subcommand when built without self-update. + Ok(ctx + .execute(mise) + .always() + .arg("--help") + .output_checked_utf8()? + .stdout + .contains("self-update")) +} + pub fn run_mise(ctx: &ExecutionContext) -> Result<()> { let mise = require("mise")?; @@ -2839,15 +2871,7 @@ } else { // This used to run self-update and check for exit code 1 and the string 'cannot update' in stderr. // However, this caused issues with mise's y/n prompt (https://github.com/topgrade-rs/topgrade/issues/2307). - let supports_self_update = ctx - .execute(&mise) - .always() - .arg("--help") - .output_checked_utf8()? - .stdout - .contains("self-update"); - - if supports_self_update { + if mise_supports_self_update(ctx, &mise)? { ctx.execute(&mise) .args(["self-update"]) .arg_if(ctx.config().yes(Step::Mise), "--yes") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/steps/os/linux.rs new/topgrade-17.12.3/src/steps/os/linux.rs --- old/topgrade-17.12.1/src/steps/os/linux.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/steps/os/linux.rs 2026-10-02 19:59:59.000000000 +0200 @@ -1209,47 +1209,71 @@ print_separator("Zed"); - let version = Version::parse( - ctx.execute(zed) - .always() - .arg("--version") - .output_checked_utf8()? - .stdout - .split(' ') - .nth(1) - .ok_or_else(|| { - eyre!(output_changed_message!( - "zed --version", - "Should be in 'Zed x.y.z <...>' format" - )) - })?, - ) - .wrap_err_with(|| output_changed_message!("zed --version", "Should be a valid version"))?; + let output = ctx.execute(zed).always().arg("--version").output_checked_utf8()?.stdout; + let mut words = output.split_whitespace(); + // Stable prints `Zed x.y.z <...>`, other channels print `Zed <channel> x.y.z <...>` + let (channel, version) = match (words.next(), words.next(), words.next()) { + (Some("Zed"), Some(channel @ ("preview" | "nightly" | "dev")), Some(version)) => (channel, version), + (Some("Zed"), Some(version), _) => ("stable", version), + _ => { + return Err(eyre!(output_changed_message!( + "zed --version", + "Should be in 'Zed [channel] x.y.z <...>' format" + ))); + } + }; + let version = Version::parse(version) + .wrap_err_with(|| output_changed_message!("zed --version", "Should be a valid version"))?; + + if channel != "stable" && channel != "preview" { + return Err( + SkipStep(t!("Updates unsupported for the Zed {channel} channel", channel = channel).to_string()).into(), + ); + } let client = reqwest::blocking::Client::builder().user_agent("Topgrade").build()?; #[derive(Deserialize)] struct Response { tag_name: String, + prerelease: bool, } - let latest = Version::parse( + let release = if channel == "stable" { client .get("https://api.github.com/repos/zed-industries/zed/releases/latest") .send() .wrap_err("Failed to get latest version")? .json::<Response>()? - .tag_name - .strip_prefix('v') - .ok_or_eyre("Tag on GitHub doesn't start with 'v'")?, - )?; + } else { + // Preview releases are GitHub prereleases tagged `vx.y.z-pre`; the list is sorted newest first + client + .get("https://api.github.com/repos/zed-industries/zed/releases") + .send() + .wrap_err("Failed to fetch releases")? + .json::<Vec<Response>>()? + .into_iter() + .find(|release| release.prerelease && release.tag_name.ends_with("-pre")) + .ok_or_else(|| eyre!(t!("No Zed preview release found on GitHub")))? + }; + + let tag = release + .tag_name + .strip_prefix('v') + .ok_or_eyre("Tag on GitHub doesn't start with 'v'")?; + // The installed preview reports `x.y.z` without the `-pre` suffix + let latest = Version::parse(tag.strip_suffix("-pre").unwrap_or(tag))?; if version < latest { let mut response = client .get("https://zed.dev/install.sh") .send() .wrap_err("Failed to download install script")?; - let child = ctx.execute("sh").stdin(Stdio::piped()).spawn()?; + let child = ctx + .execute("sh") + .env("ZED_CHANNEL", channel) + .stdin(Stdio::piped()) + .spawn()?; let mut child = match child { ExecutorChild::Wet(child) => child, ExecutorChild::Dry => return Ok(()), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/topgrade-17.12.1/src/terminal.rs new/topgrade-17.12.3/src/terminal.rs --- old/topgrade-17.12.1/src/terminal.rs 2026-09-21 20:30:21.000000000 +0200 +++ new/topgrade-17.12.3/src/terminal.rs 2026-10-02 19:59:59.000000000 +0200 @@ -17,6 +17,7 @@ #[cfg(windows)] use which_crate::which; +use crate::OLD_CWD; use crate::command::CommandExt; use crate::runner::StepResult; @@ -34,7 +35,10 @@ #[expect(clippy::disallowed_methods)] pub fn run_shell() -> eyre::Result<()> { - Command::new(shell()).env("IN_TOPGRADE", "1").status_checked() + Command::new(shell()) + .env("IN_TOPGRADE", "1") + .current_dir(OLD_CWD.get().expect("OLD_CWD should be set at this point")) + .status_checked() } struct Terminal { ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/topgrade/vendor.tar.zst /work/SRC/openSUSE:Factory/.topgrade.new.3698736/vendor.tar.zst differ: char 7, line 1
