Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package topgrade for openSUSE:Factory 
checked in at 2025-11-26 18:51:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/topgrade (Old)
 and      /work/SRC/openSUSE:Factory/.topgrade.new.14147 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "topgrade"

Wed Nov 26 18:51:03 2025 rev:14 rq:1320204 version:16.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/topgrade/topgrade.changes        2025-11-19 
14:54:54.754616538 +0100
+++ /work/SRC/openSUSE:Factory/.topgrade.new.14147/topgrade.changes     
2025-11-26 18:51:05.160948803 +0100
@@ -1,0 +2,36 @@
+Wed Nov 26 14:04:57 UTC 2025 - [email protected]
+
+- Update to version 16.5.0:
+  * chore: release v16.5.0 (#1547)
+  * fix(auto-cpufreq): fix skipping on systems with merged bin/sbin (#1556)
+  * chore(pre-commit): autoupdate (#1560)
+  * chore(deps): update release-plz/action digest to 1efcf74 (#1561)
+  * chore(deps): lock file maintenance (#1555)
+  * chore(deps): update github/codeql-action action to v4.31.5 (#1559)
+  * feat: add colors to --help/-h (#1553)
+  * feat(mise): add support for parallel job configuration in mise (#1548)
+  * feat(brew): add Homebrew cask support for Linux (#1539)
+  * chore(deps): update rust crate indexmap to v2.12.1 (#1550)
+  * chore(deps): update actions/checkout action to v6 (#1551)
+  * docs: Add metadata to Python package for PyPI (#1549)
+  * docs(installation): update copr repo info in readme (#1545)
+  * feat(mise): add mise configuration options for bump and interactive modes 
(#1546)
+- Update to version 16.4.2:
+  * chore: release v16.4.2 (#1544)
+  * chore(deps): update dawidd6/action-homebrew-bump-formula action to v6 
(#1543)
+  * chore: release v16.4.1 (#1542)
+  * refactor: refactor run_containers error handling (#1541)
+  * chore: release v16.4.0 (#1528)
+  * chore(deps): update clap, clap_builder, clap_complete (#1540)
+  * chore(deps): update github/codeql-action action to v4.31.4 (#1531)
+  * test(config): add custom commands order test (#1536)
+  * fix(deps): restore custom commands order (#1535)
+  * refactor: make Config methods more consistent by utilizing 
`#[derive(Default)]` (#1534)
+  * docs(issue templates): use issue types (#1533)
+  * feat(os): add Origami Linux support (#1530)
+  * chore(deps): lock file maintenance (#1505)
+  * chore(deps): update actions/checkout digest to 93cb6ef (#1526)
+  * chore(deps): update actions/checkout action to v5.0.1 (#1527)
+  * feat(containers): add option to run `system prune` (#1523)
+
+-------------------------------------------------------------------

Old:
----
  topgrade-16.3.0.tar.zst

New:
----
  topgrade-16.5.0.tar.zst

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

Other differences:
------------------
++++++ topgrade.spec ++++++
--- /var/tmp/diff_new_pack.2Qnb4I/_old  2025-11-26 18:51:08.221078441 +0100
+++ /var/tmp/diff_new_pack.2Qnb4I/_new  2025-11-26 18:51:08.221078441 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           topgrade
-Version:        16.3.0
+Version:        16.5.0
 Release:        0
 Summary:        Upgrade all the things
 License:        GPL-3.0-only

++++++ _service ++++++
--- /var/tmp/diff_new_pack.2Qnb4I/_old  2025-11-26 18:51:08.269080474 +0100
+++ /var/tmp/diff_new_pack.2Qnb4I/_new  2025-11-26 18:51:08.273080644 +0100
@@ -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">v16.3.0</param>
+    <param name="revision">v16.5.0</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.2Qnb4I/_old  2025-11-26 18:51:08.301081830 +0100
+++ /var/tmp/diff_new_pack.2Qnb4I/_new  2025-11-26 18:51:08.305081999 +0100
@@ -1,7 +1,7 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/topgrade-rs/topgrade.git</param>
-              <param 
name="changesrevision">f9735f3b3187d55b80deb749e93bfaacccb14d7a</param></service><service
 name="tar_scm">
+              <param 
name="changesrevision">eb68a2d8034364b2cba64b22aea11d3bda1a8b12</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-16.3.0.tar.zst -> topgrade-16.5.0.tar.zst ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/bug_report.md 
new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/bug_report.md
--- old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/bug_report.md    2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/bug_report.md    2025-11-26 
14:27:49.000000000 +0100
@@ -2,7 +2,7 @@
 name: Bug report
 about: Topgrade is misbehaving
 title: ''
-labels: 'C-bug'
+type: Bug
 assignees: ''
 
 ---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/feature_request.md 
new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/feature_request.md
--- old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/feature_request.md       
2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/feature_request.md       
2025-11-26 14:27:49.000000000 +0100
@@ -2,7 +2,7 @@
 name: General feature request
 about: Suggest a general feature, or feature within an already existing step
 title: ''
-labels: C-feature request
+type: Feature
 assignees: ''
 
 ---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/step_request.md 
new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/step_request.md
--- old/topgrade-16.3.0/.github/ISSUE_TEMPLATE/step_request.md  2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/ISSUE_TEMPLATE/step_request.md  2025-11-26 
14:27:49.000000000 +0100
@@ -2,7 +2,8 @@
 name: New step request
 about: Suggest a new step/package manager to update
 title: ''
-labels: C-feature request, request step
+type: Feature
+labels: request step
 assignees: ''
 
 ---
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/check_config_creation_if_not_exists.yml 
new/topgrade-16.5.0/.github/workflows/check_config_creation_if_not_exists.yml
--- 
old/topgrade-16.3.0/.github/workflows/check_config_creation_if_not_exists.yml   
    2025-11-17 16:39:39.000000000 +0100
+++ 
new/topgrade-16.5.0/.github/workflows/check_config_creation_if_not_exists.yml   
    2025-11-26 14:27:49.000000000 +0100
@@ -15,7 +15,7 @@
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.github/workflows/check_i18n.yml 
new/topgrade-16.5.0/.github/workflows/check_i18n.yml
--- old/topgrade-16.3.0/.github/workflows/check_i18n.yml        2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/check_i18n.yml        2025-11-26 
14:27:49.000000000 +0100
@@ -14,7 +14,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/check_security_vulnerability.yml 
new/topgrade-16.5.0/.github/workflows/check_security_vulnerability.yml
--- old/topgrade-16.3.0/.github/workflows/check_security_vulnerability.yml      
2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/check_security_vulnerability.yml      
2025-11-26 14:27:49.000000000 +0100
@@ -24,7 +24,7 @@
       security-events: write
     steps:
       - name: Checkout code
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -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@014f16e7ab1402f30e7c3329d33797e7948572db # 
v4.31.3
+        uses: 
github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # 
v4.31.5
         with:
           sarif_file: devskim-results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.github/workflows/ci.yml 
new/topgrade-16.5.0/.github/workflows/ci.yml
--- old/topgrade-16.3.0/.github/workflows/ci.yml        2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/ci.yml        2025-11-26 
14:27:49.000000000 +0100
@@ -23,7 +23,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -39,7 +39,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -135,7 +135,7 @@
       matrix_target: ${{ matrix.target }}
     steps:
       - name: Checkout code
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/create_release_assets.yml 
new/topgrade-16.5.0/.github/workflows/create_release_assets.yml
--- old/topgrade-16.3.0/.github/workflows/create_release_assets.yml     
2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/create_release_assets.yml     
2025-11-26 14:27:49.000000000 +0100
@@ -33,7 +33,7 @@
     env:
       tag: ${{ github.event.client_payload.tag }}
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -169,7 +169,7 @@
       matrix_target: ${{ matrix.target }}
       tag: ${{ github.event.client_payload.tag }}
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/dependency-review.yml 
new/topgrade-16.5.0/.github/workflows/dependency-review.yml
--- old/topgrade-16.3.0/.github/workflows/dependency-review.yml 2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/dependency-review.yml 2025-11-26 
14:27:49.000000000 +0100
@@ -17,7 +17,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: 'Checkout Repository'
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.github/workflows/release-plz.yml 
new/topgrade-16.5.0/.github/workflows/release-plz.yml
--- old/topgrade-16.3.0/.github/workflows/release-plz.yml       2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/release-plz.yml       2025-11-26 
14:27:49.000000000 +0100
@@ -17,7 +17,7 @@
       id-token: write  # For trusted publishing
     steps:
       - name: Checkout repository
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
         with:
           fetch-depth: 0
           persist-credentials: false
@@ -25,7 +25,7 @@
         uses: dtolnay/rust-toolchain@stable
       - name: Run release-plz
         id: release-plz
-        uses: release-plz/action@d529f731ae3e89610ada96eda34e5c6ba3b12214 # 
v0.5
+        uses: release-plz/action@1efcf74dfcd6e500990dad806e286899ae384064 # 
v0.5
         with:
           command: release
         env:
@@ -53,14 +53,14 @@
       cancel-in-progress: false
     steps:
       - name: Checkout repository
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6
         with:
           fetch-depth: 0
           persist-credentials: false
       - name: Install Rust toolchain
         uses: dtolnay/rust-toolchain@stable
       - name: Run release-plz
-        uses: release-plz/action@d529f731ae3e89610ada96eda34e5c6ba3b12214 # 
v0.5
+        uses: release-plz/action@1efcf74dfcd6e500990dad806e286899ae384064 # 
v0.5
         with:
           command: release-pr
         env:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/release_to_homebrew.yml 
new/topgrade-16.5.0/.github/workflows/release_to_homebrew.yml
--- old/topgrade-16.3.0/.github/workflows/release_to_homebrew.yml       
2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/release_to_homebrew.yml       
2025-11-26 14:27:49.000000000 +0100
@@ -12,7 +12,7 @@
     runs-on: ubuntu-latest
     steps:
     - name: Bump formulae
-      uses: 
dawidd6/action-homebrew-bump-formula@3428a0601bba3173ec0bdcc945be23fa27aa4c31 # 
v5
+      uses: 
dawidd6/action-homebrew-bump-formula@c5ddc585e75f0f750a8b4f610688b4bec9e80915 # 
v6
       with:
         # Custom GitHub access token with only the 'public_repo' scope enabled
         token: ${{secrets.HOMEBREW_ACCESS_TOKEN}}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/.github/workflows/release_to_pypi.yml 
new/topgrade-16.5.0/.github/workflows/release_to_pypi.yml
--- old/topgrade-16.3.0/.github/workflows/release_to_pypi.yml   2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/release_to_pypi.yml   2025-11-26 
14:27:49.000000000 +0100
@@ -15,7 +15,7 @@
       matrix:
         target: [x86_64, x86, aarch64]
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -37,7 +37,7 @@
       matrix:
         target: [x64, x86]
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -58,7 +58,7 @@
       matrix:
         target: [x86_64, aarch64]
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -76,7 +76,7 @@
   sdist:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+      - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.github/workflows/scorecards.yml 
new/topgrade-16.5.0/.github/workflows/scorecards.yml
--- old/topgrade-16.3.0/.github/workflows/scorecards.yml        2025-11-17 
16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/.github/workflows/scorecards.yml        2025-11-26 
14:27:49.000000000 +0100
@@ -36,7 +36,7 @@
 
     steps:
       - name: "Checkout code"
-        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # 
v5.0.0
+        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 
v6.0.0
         with:
           persist-credentials: false
 
@@ -71,6 +71,6 @@
 
       # Upload the results to GitHub's code scanning dashboard.
       - name: "Upload to code-scanning"
-        uses: 
github/codeql-action/upload-sarif@014f16e7ab1402f30e7c3329d33797e7948572db # 
v4.31.3
+        uses: 
github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # 
v4.31.5
         with:
           sarif_file: results.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/.pre-commit-config.yaml 
new/topgrade-16.5.0/.pre-commit-config.yaml
--- old/topgrade-16.3.0/.pre-commit-config.yaml 2025-11-17 16:39:39.000000000 
+0100
+++ new/topgrade-16.5.0/.pre-commit-config.yaml 2025-11-26 14:27:49.000000000 
+0100
@@ -1,6 +1,6 @@
 repos:
 - repo: https://github.com/gitleaks/gitleaks
-  rev: v8.29.0
+  rev: v8.29.1
   hooks:
   - id: gitleaks
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/CHANGELOG.md 
new/topgrade-16.5.0/CHANGELOG.md
--- old/topgrade-16.3.0/CHANGELOG.md    2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/CHANGELOG.md    2025-11-26 14:27:49.000000000 +0100
@@ -7,6 +7,64 @@
 
 ## [Unreleased]
 
+## [16.5.0](https://github.com/topgrade-rs/topgrade/compare/v16.4.2...v16.5.0) 
- 2025-11-26
+
+### Added
+
+- add colors to --help/-h 
([#1553](https://github.com/topgrade-rs/topgrade/pull/1553))
+- *(mise)* add support for parallel job configuration in mise 
([#1548](https://github.com/topgrade-rs/topgrade/pull/1548))
+- *(brew)* add Homebrew cask support for Linux 
([#1539](https://github.com/topgrade-rs/topgrade/pull/1539))
+- *(mise)* add mise configuration options for bump and interactive modes 
([#1546](https://github.com/topgrade-rs/topgrade/pull/1546))
+
+### Fixed
+
+- *(auto-cpufreq)* fix skipping on systems with merged bin/sbin 
([#1556](https://github.com/topgrade-rs/topgrade/pull/1556))
+
+### Other
+
+- *(pre-commit)* autoupdate 
([#1560](https://github.com/topgrade-rs/topgrade/pull/1560))
+- *(deps)* update release-plz/action digest to 1efcf74 
([#1561](https://github.com/topgrade-rs/topgrade/pull/1561))
+- *(deps)* lock file maintenance 
([#1555](https://github.com/topgrade-rs/topgrade/pull/1555))
+- *(deps)* update github/codeql-action action to v4.31.5 
([#1559](https://github.com/topgrade-rs/topgrade/pull/1559))
+- *(deps)* update rust crate indexmap to v2.12.1 
([#1550](https://github.com/topgrade-rs/topgrade/pull/1550))
+- *(deps)* update actions/checkout action to v6 
([#1551](https://github.com/topgrade-rs/topgrade/pull/1551))
+- Add metadata to Python package for PyPI 
([#1549](https://github.com/topgrade-rs/topgrade/pull/1549))
+- *(installation)* update copr repo info in readme 
([#1545](https://github.com/topgrade-rs/topgrade/pull/1545))
+
+## [16.4.2](https://github.com/topgrade-rs/topgrade/compare/v16.4.1...v16.4.2) 
- 2025-11-20
+
+### Other
+
+- *(deps)* update dawidd6/action-homebrew-bump-formula action to v6 
([#1543](https://github.com/topgrade-rs/topgrade/pull/1543))
+
+## [16.4.1](https://github.com/topgrade-rs/topgrade/compare/v16.4.0...v16.4.1) 
- 2025-11-20
+
+### Other
+
+- refactor run_containers error handling 
([#1541](https://github.com/topgrade-rs/topgrade/pull/1541))
+
+## [16.4.0](https://github.com/topgrade-rs/topgrade/compare/v16.3.0...v16.4.0) 
- 2025-11-20
+
+### Added
+
+- *(os)* add Origami Linux support 
([#1530](https://github.com/topgrade-rs/topgrade/pull/1530))
+- *(containers)* add option to run `system prune` 
([#1523](https://github.com/topgrade-rs/topgrade/pull/1523))
+
+### Fixed
+
+- *(deps)* restore custom commands order 
([#1535](https://github.com/topgrade-rs/topgrade/pull/1535))
+
+### Other
+
+- *(deps)* update clap, clap_builder, clap_complete 
([#1540](https://github.com/topgrade-rs/topgrade/pull/1540))
+- *(deps)* update github/codeql-action action to v4.31.4 
([#1531](https://github.com/topgrade-rs/topgrade/pull/1531))
+- *(config)* add custom commands order test 
([#1536](https://github.com/topgrade-rs/topgrade/pull/1536))
+- make Config methods more consistent by utilizing `#[derive(Default)]` 
([#1534](https://github.com/topgrade-rs/topgrade/pull/1534))
+- *(issue templates)* use issue types 
([#1533](https://github.com/topgrade-rs/topgrade/pull/1533))
+- *(deps)* lock file maintenance 
([#1505](https://github.com/topgrade-rs/topgrade/pull/1505))
+- *(deps)* update actions/checkout digest to 93cb6ef 
([#1526](https://github.com/topgrade-rs/topgrade/pull/1526))
+- *(deps)* update actions/checkout action to v5.0.1 
([#1527](https://github.com/topgrade-rs/topgrade/pull/1527))
+
 ## [16.3.0](https://github.com/topgrade-rs/topgrade/compare/v16.2.1...v16.3.0) 
- 2025-11-16
 
 ### Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/Cargo.lock 
new/topgrade-16.5.0/Cargo.lock
--- old/topgrade-16.3.0/Cargo.lock      2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/Cargo.lock      2025-11-26 14:27:49.000000000 +0100
@@ -193,7 +193,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -228,7 +228,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -350,9 +350,9 @@
 
 [[package]]
 name = "cc"
-version = "1.2.46"
+version = "1.2.47"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36"
+checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07"
 dependencies = [
  "find-msvc-tools",
  "shlex",
@@ -385,19 +385,29 @@
 
 [[package]]
 name = "clap"
-version = "4.5.51"
+version = "4.5.53"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
+checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
 dependencies = [
  "clap_builder",
  "clap_derive",
 ]
 
 [[package]]
+name = "clap-cargo"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "d546f0e84ff2bfa4da1ce9b54be42285767ba39c688572ca32412a09a73851e5"
+dependencies = [
+ "anstyle",
+ "clap",
+]
+
+[[package]]
 name = "clap_builder"
-version = "4.5.51"
+version = "4.5.53"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
+checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
 dependencies = [
  "anstream",
  "anstyle",
@@ -407,9 +417,9 @@
 
 [[package]]
 name = "clap_complete"
-version = "4.5.60"
+version = "4.5.61"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8e602857739c5a4291dfa33b5a298aeac9006185229a700e5810a3ef7272d971"
+checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992"
 dependencies = [
  "clap",
 ]
@@ -423,7 +433,7 @@
  "heck",
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -625,7 +635,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -655,7 +665,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -707,7 +717,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -780,7 +790,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -985,7 +995,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -1118,9 +1128,9 @@
 
 [[package]]
 name = "hashbrown"
-version = "0.16.0"
+version = "0.16.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
 
 [[package]]
 name = "heck"
@@ -1402,12 +1412,12 @@
 
 [[package]]
 name = "indexmap"
-version = "2.12.0"
+version = "2.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
+checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
 dependencies = [
  "equivalent",
- "hashbrown 0.16.0",
+ "hashbrown 0.16.1",
  "serde",
  "serde_core",
 ]
@@ -2204,7 +2214,7 @@
  "serde",
  "serde_json",
  "serde_yaml",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2398,7 +2408,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2422,7 +2432,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2511,9 +2521,9 @@
 
 [[package]]
 name = "signal-hook-registry"
-version = "1.4.6"
+version = "1.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
+checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad"
 dependencies = [
  "libc",
 ]
@@ -2608,7 +2618,7 @@
  "heck",
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2630,9 +2640,9 @@
 
 [[package]]
 name = "syn"
-version = "2.0.110"
+version = "2.0.111"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
+checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2656,7 +2666,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2744,7 +2754,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2755,7 +2765,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -2964,11 +2974,12 @@
 
 [[package]]
 name = "topgrade"
-version = "16.3.0"
+version = "16.5.0"
 dependencies = [
  "base64ct",
  "chrono",
  "clap",
+ "clap-cargo",
  "clap_complete",
  "clap_mangen",
  "color-eyre",
@@ -3076,7 +3087,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -3325,7 +3336,7 @@
  "bumpalo",
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
  "wasm-bindgen-shared",
 ]
 
@@ -3520,7 +3531,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -3531,7 +3542,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -3867,7 +3878,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
  "synstructure",
 ]
 
@@ -3914,7 +3925,7 @@
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
  "zbus_names",
  "zvariant",
  "zvariant_utils",
@@ -3934,22 +3945,22 @@
 
 [[package]]
 name = "zerocopy"
-version = "0.8.27"
+version = "0.8.28"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
+checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.8.27"
+version = "0.8.28"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
+checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -3969,7 +3980,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
  "synstructure",
 ]
 
@@ -4009,7 +4020,7 @@
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
 ]
 
 [[package]]
@@ -4076,7 +4087,7 @@
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn 2.0.110",
+ "syn 2.0.111",
  "zvariant_utils",
 ]
 
@@ -4089,6 +4100,6 @@
  "proc-macro2",
  "quote",
  "serde",
- "syn 2.0.110",
+ "syn 2.0.111",
  "winnow",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/Cargo.toml 
new/topgrade-16.5.0/Cargo.toml
--- old/topgrade-16.3.0/Cargo.toml      2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/Cargo.toml      2025-11-26 14:27:49.000000000 +0100
@@ -6,7 +6,7 @@
 license = "GPL-3.0-or-later"
 repository = "https://github.com/topgrade-rs/topgrade";
 rust-version = "1.84.1"
-version = "16.3.0"
+version = "16.5.0"
 authors = ["Roey Darwish Dror <[email protected]>", "Thomas Schönauer 
<[email protected]>"]
 exclude = ["doc/screenshot.gif", "BREAKINGCHANGES_dev.md"]
 edition = "2021"
@@ -17,7 +17,7 @@
 home = "=0.5.11"
 etcetera = "=0.10.0"
 serde = { version = "~1.0", features = ["derive"] }
-toml = "=0.9.8"
+toml = { version = "=0.9.8", features = ["preserve_order"] }
 which_crate = { version = "~8.0", package = "which" }
 shellexpand = "~3.1"
 clap = { version = "~4.5", features = ["cargo", "derive"] }
@@ -51,6 +51,7 @@
 ignore = "=0.4.23"
 globset = "=0.4.16"
 base64ct = "<1.8.0"
+clap-cargo = "0.15.2"
 
 [patch.crates-io]
 mac-notification-sys = { git = 
"https://github.com/h4llow3En/mac-notification-sys"; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/README.md 
new/topgrade-16.5.0/README.md
--- old/topgrade-16.3.0/README.md       2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/README.md       2025-11-26 14:27:49.000000000 +0100
@@ -3,10 +3,10 @@
     <img alt="Topgrade" src="doc/topgrade_transparent.png" width="850px">
   </h1>
 
-  <a href="https://github.com/topgrade-rs/topgrade/releases";><img alt="GitHub 
Release" 
src="https://img.shields.io/github/release/topgrade-rs/topgrade.svg";></a>
-  <a href="https://crates.io/crates/topgrade";><img alt="crates.io" 
src="https://img.shields.io/crates/v/topgrade.svg";></a>
-  <a href="https://aur.archlinux.org/packages/topgrade";><img alt="AUR" 
src="https://img.shields.io/aur/version/topgrade.svg";></a>
-  <a href="https://formulae.brew.sh/formula/topgrade";><img alt="Homebrew" 
src="https://img.shields.io/homebrew/v/topgrade.svg";></a>
+<a href="https://github.com/topgrade-rs/topgrade/releases";><img alt="GitHub 
Release" 
src="https://img.shields.io/github/release/topgrade-rs/topgrade.svg";></a>
+<a href="https://crates.io/crates/topgrade";><img alt="crates.io" 
src="https://img.shields.io/crates/v/topgrade.svg";></a>
+<a href="https://aur.archlinux.org/packages/topgrade";><img alt="AUR" 
src="https://img.shields.io/aur/version/topgrade.svg";></a>
+<a href="https://formulae.brew.sh/formula/topgrade";><img alt="Homebrew" 
src="https://img.shields.io/homebrew/v/topgrade.svg";></a>
 
   <img alt="Demo" src="doc/topgrade_demo.gif">
 </div>
@@ -37,6 +37,8 @@
 - Windows 
([Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)): [
   `winget install --id=topgrade-rs.topgrade  
-e`](https://winstall.app/apps/topgrade-rs.topgrade)
 - macOS or Linux ([Homebrew](https://brew.sh/)): [`brew install 
topgrade`](https://formulae.brew.sh/formula/topgrade)
+- Fedora/RHEL/AlmaLinux/CentOS-Stream 
([Copr](https://copr.fedorainfracloud.org/)): [
+  `sudo dnf copr enable lilay/topgrade && sudo dnf install 
topgrade`](https://copr.fedorainfracloud.org/coprs/lilay/topgrade/)
 
 ### Community-maintained
 
@@ -46,8 +48,6 @@
   `scoop bucket add main && scoop install 
main/topgrade`](https://scoop.sh/#/apps?q=topgrade)
 - macOS ([MacPorts](https://www.macports.org/)): [
   `sudo port install topgrade`](https://ports.macports.org/port/topgrade/)
-- Fedora ([Copr](https://copr.fedorainfracloud.org/)): [
-  `dnf copr enable lilay/topgrade && dnf install 
topgrade`](https://copr.fedorainfracloud.org/coprs/lilay/topgrade/)
 - NixOS or Nix (nixpkgs): 
[topgrade](https://search.nixos.org/packages?show=topgrade)
 - Void Linux: [`sudo xbps-install -S 
topgrade`](https://voidlinux.org/packages/?arch=x86_64&q=topgrade)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/config.example.toml 
new/topgrade-16.5.0/config.example.toml
--- old/topgrade-16.3.0/config.example.toml     2025-11-17 16:39:39.000000000 
+0100
+++ new/topgrade-16.5.0/config.example.toml     2025-11-26 14:27:49.000000000 
+0100
@@ -291,6 +291,20 @@
 # (default: false)
 # exclude_encrypted = false
 
+[mise]
+# Upgrades to the latest version available, bumping the version in mise.toml
+# (default: false)
+# bump = false
+
+# Number of jobs to run in parallel
+# (default: 4)
+# jobs = 4
+
+# Run interactively
+# (default: false)
+# interactive = false
+
+
 [npm]
 # Use sudo if the NPM directory isn't owned by the current user
 # use_sudo = true
@@ -342,6 +356,10 @@
 # Specify the runtime to use for containers (default: "docker", allowed 
values: "docker", "podman")
 # runtime = "podman"
 
+# Run 'docker system prune' to clean up unused containers, networks, and build 
cache
+# (default: false)
+# system_prune = false
+
 [lensfun]
 # If disabled, Topgrade invokes `lensfun‑update‑data` without root privilege,
 # then the update will be only available to you. Otherwise, `sudo` is required,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/locales/app.yml 
new/topgrade-16.5.0/locales/app.yml
--- old/topgrade-16.3.0/locales/app.yml 2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/locales/app.yml 2025-11-26 14:27:49.000000000 +0100
@@ -694,6 +694,14 @@
   zh_CN: "不是专用的 macOS brew"
   zh_TW: "不是專門的 macOS brew"
   de: "Kein angepasstes Brew für macOS"
+"Homebrew cask support on Linux requires Homebrew 4.5.0 or later (found 
{version})":
+  en: "Homebrew cask support on Linux requires Homebrew 4.5.0 or later (found 
%{version})"
+  lt: "Homebrew cask palaikymas Linux sistemoje reikalauja Homebrew 4.5.0 arba 
naujesnes versijos (rasta %{version})"
+  es: "El soporte de cask de Homebrew en Linux requiere Homebrew 4.5.0 o 
posterior (encontrado %{version})"
+  fr: "Le support de cask Homebrew sur Linux nécessite Homebrew 4.5.0 ou 
supérieur (trouvé %{version})"
+  zh_CN: "Linux 上的 Homebrew cask 支持需要 Homebrew 4.5.0 或更高版本(找到 %{version})"
+  zh_TW: "Linux 上的 Homebrew cask 支援需要 Homebrew 4.5.0 或更高版本(找到 %{version})"
+  de: "Homebrew-Cask-Unterstützung unter Linux erfordert Homebrew 4.5.0 oder 
höher (gefunden %{version})"
 "Guix Pull Failed, Skipping":
   en: "Guix Pull Failed, Skipping"
   lt: "Guix traukti nepavyko, praleidžiama"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/pyproject.toml 
new/topgrade-16.5.0/pyproject.toml
--- old/topgrade-16.3.0/pyproject.toml  2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/pyproject.toml  2025-11-26 14:27:49.000000000 +0100
@@ -5,13 +5,20 @@
 [project]
 name = "topgrade"
 dynamic = ["version"]
+description = "Upgrade all the things"
+readme = "README.md"
+license = "GPL-3.0-or-later"
 requires-python = ">=3.7"
 classifiers = [
+    "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
     "Programming Language :: Rust",
     "Programming Language :: Python :: Implementation :: CPython",
     "Programming Language :: Python :: Implementation :: PyPy",
 ]
 
+urls.bugs = "https://github.com/topgrade-rs/topgrade/issues";
+urls.homepage = "https://github.com/topgrade-rs/topgrade";
+
 
 [tool.maturin]
 bindings = "bin"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/config.rs 
new/topgrade-16.5.0/src/config.rs
--- old/topgrade-16.3.0/src/config.rs   2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/src/config.rs   2025-11-26 14:27:49.000000000 +0100
@@ -60,6 +60,7 @@
     #[merge(strategy = crate::utils::merge_strategies::vec_prepend_opt)]
     ignored_containers: Option<Vec<String>>,
     runtime: Option<ContainerRuntime>,
+    system_prune: Option<bool>,
 }
 
 #[derive(Deserialize, Default, Debug, Merge)]
@@ -175,6 +176,15 @@
 #[derive(Deserialize, Default, Debug, Merge)]
 #[serde(deny_unknown_fields)]
 #[allow(clippy::upper_case_acronyms)]
+pub struct Mise {
+    bump: Option<bool>,
+    interactive: Option<bool>,
+    jobs: Option<u32>,
+}
+
+#[derive(Deserialize, Default, Debug, Merge)]
+#[serde(deny_unknown_fields)]
+#[allow(clippy::upper_case_acronyms)]
 pub struct Firmware {
     upgrade: Option<bool>,
 }
@@ -203,9 +213,10 @@
     fetch_head: Option<bool>,
 }
 
-#[derive(Debug, Deserialize, Clone, Copy)]
+#[derive(Debug, Deserialize, Clone, Copy, Default)]
 #[serde(rename_all = "snake_case")]
 pub enum ArchPackageManager {
+    #[default]
     Autodetect,
     Aura,
     GarudaUpdate,
@@ -217,9 +228,10 @@
     Yay,
 }
 
-#[derive(Clone, Copy, Debug, Deserialize)]
+#[derive(Clone, Copy, Debug, Deserialize, Default)]
 #[serde(rename_all = "snake_case")]
 pub enum ContainerRuntime {
+    #[default] // defaults to a popular choice
     Docker,
     Podman,
 }
@@ -357,10 +369,11 @@
     show_distribution_summary: Option<bool>,
 }
 
-#[derive(Clone, Copy, Debug, Deserialize, ValueEnum)]
+#[derive(Clone, Copy, Debug, Deserialize, ValueEnum, Default)]
 #[clap(rename_all = "snake_case")]
 #[serde(rename_all = "snake_case")]
 pub enum TmuxSessionMode {
+    #[default]
     AttachIfNotInSession,
     AttachAlways,
 }
@@ -468,6 +481,9 @@
     chezmoi: Option<Chezmoi>,
 
     #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)]
+    mise: Option<Mise>,
+
+    #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)]
     yarn: Option<Yarn>,
 
     #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)]
@@ -713,7 +729,7 @@
 // TODO: i18n of clap currently not easily possible. Waiting for 
https://github.com/clap-rs/clap/issues/380
 // Tracking issue for i18n: https://github.com/topgrade-rs/topgrade/issues/859
 #[derive(Parser, Debug)]
-#[command(name = "topgrade", version)]
+#[command(name = "topgrade", version, styles = 
clap_cargo::style::CLAP_STYLING)]
 pub struct CommandLineArgs {
     /// Edit the configuration file
     #[arg(long = "edit-config")]
@@ -955,7 +971,16 @@
             .containers
             .as_ref()
             .and_then(|containers| containers.runtime)
-            .unwrap_or(ContainerRuntime::Docker) // defaults to a popular 
choice
+            .unwrap_or_default()
+    }
+
+    /// Whether to run system prune for containers.
+    pub fn containers_system_prune(&self) -> bool {
+        self.config_file
+            .containers
+            .as_ref()
+            .and_then(|containers| containers.system_prune)
+            .unwrap_or(false)
     }
 
     /// Tell whether the specified step should run.
@@ -1027,7 +1052,7 @@
             .misc
             .as_ref()
             .and_then(|misc| misc.tmux_session_mode)
-            .unwrap_or(TmuxSessionMode::AttachIfNotInSession)
+            .unwrap_or_default()
     }
 
     /// Tell whether we should perform cleanup steps.
@@ -1281,7 +1306,7 @@
             .vim
             .as_ref()
             .and_then(|c| c.force_plug_update)
-            .unwrap_or_default()
+            .unwrap_or(false)
     }
 
     /// Whether to send a desktop notification at the beginning of every step
@@ -1354,7 +1379,7 @@
             .linux
             .as_ref()
             .and_then(|s| s.arch_package_manager)
-            .unwrap_or(ArchPackageManager::Autodetect)
+            .unwrap_or_default()
     }
 
     /// Extra yay arguments
@@ -1791,6 +1816,26 @@
             .unwrap_or(false)
     }
 
+    pub fn mise_bump(&self) -> bool {
+        self.config_file
+            .mise
+            .as_ref()
+            .and_then(|mise| mise.bump)
+            .unwrap_or(false)
+    }
+
+    pub fn mise_jobs(&self) -> u32 {
+        self.config_file.mise.as_ref().and_then(|mise| mise.jobs).unwrap_or(4)
+    }
+
+    pub fn mise_interactive(&self) -> bool {
+        self.config_file
+            .mise
+            .as_ref()
+            .and_then(|mise| mise.interactive)
+            .unwrap_or(false)
+    }
+
     pub fn vscode_profile(&self) -> Option<&str> {
         let vscode_cfg = self.config_file.vscode.as_ref()?;
         let profile = vscode_cfg.profile.as_ref()?;
@@ -1879,4 +1924,24 @@
         config.opt = CommandLineArgs::parse_from(["topgrade", 
"--remote-host-limit", "other_hostname"]);
         assert!(!config.should_execute_remote(Ok("hostname".to_string()), 
"user@remote_hostname"));
     }
+
+    /// Ensure that custom commands are stored in insertion order.
+    #[test]
+    fn test_custom_commands_order() {
+        let toml_str = r#"
+[commands]
+z = "cmd_z"
+y = "cmd_y"
+x = "cmd_x"
+"#;
+        let order: Vec<_> = toml::from_str::<ConfigFile>(toml_str)
+            .expect("toml parse error")
+            .commands
+            .expect("commands field missing")
+            .keys()
+            .cloned()
+            .collect();
+
+        assert_eq!(order, vec!["z", "y", "x"]);
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/step.rs 
new/topgrade-16.5.0/src/step.rs
--- old/topgrade-16.3.0/src/step.rs     2025-11-17 16:39:39.000000000 +0100
+++ new/topgrade-16.5.0/src/step.rs     2025-11-26 14:27:49.000000000 +0100
@@ -225,7 +225,7 @@
             Bin => runner.execute(*self, "bin", || generic::bin_update(ctx))?,
             Bob => runner.execute(*self, "Bob", || generic::run_bob(ctx))?,
             BrewCask => {
-                #[cfg(target_os = "macos")]
+                #[cfg(any(target_os = "linux", target_os = "macos"))]
                 runner.execute(*self, "Brew Cask", || unix::run_brew_cask(ctx, 
unix::BrewVariant::Path))?;
                 #[cfg(target_os = "macos")]
                 runner.execute(*self, "Brew Cask (Intel)", || {
@@ -750,6 +750,7 @@
         Restarts,
         Flatpak,
         BrewFormula,
+        BrewCask,
         Lure,
         Waydroid,
         AutoCpufreq,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/steps/containers.rs 
new/topgrade-16.5.0/src/steps/containers.rs
--- old/topgrade-16.3.0/src/steps/containers.rs 2025-11-17 16:39:39.000000000 
+0100
+++ new/topgrade-16.5.0/src/steps/containers.rs 2025-11-26 14:27:49.000000000 
+0100
@@ -11,7 +11,7 @@
 use wildmatch::WildMatch;
 
 use crate::command::CommandExt;
-use crate::error::{self, SkipStep, TopgradeError};
+use crate::error::{SkipStep, TopgradeError};
 use crate::terminal::print_separator;
 use crate::{execution_context::ExecutionContext, utils::require};
 use rust_i18n::t;
@@ -185,7 +185,6 @@
         ));
     }
 
-    let mut success = true;
     let containers =
         list_containers(&crt, 
ctx.config().containers_ignored_tags()).context("Failed to list Docker 
containers")?;
     debug!("Containers to inspect: {:?}", containers);
@@ -220,22 +219,21 @@
                 continue;
             }
 
-            success = false;
+            return Err(e);
         }
     }
 
-    if ctx.config().cleanup() {
+    if ctx.config().containers_system_prune() {
+        // Run system prune to clean up unused containers, networks, and build 
cache
+        ctx.execute(&crt)
+            .args(["system", "prune", "--force"])
+            .status_checked()?
+    // Only run `image prune` if we don't run `system prune`
+    } else if ctx.config().cleanup() {
         // Remove dangling images
         debug!("Removing dangling images");
-        if let Err(e) = ctx.execute(&crt).args(["image", "prune", 
"-f"]).status_checked() {
-            error!("Removing dangling images failed: {}", e);
-            success = false;
-        }
+        ctx.execute(&crt).args(["image", "prune", "-f"]).status_checked()?
     }
 
-    if success {
-        Ok(())
-    } else {
-        Err(eyre!(error::StepFailed))
-    }
+    Ok(())
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/steps/os/linux.rs 
new/topgrade-16.5.0/src/steps/os/linux.rs
--- old/topgrade-16.3.0/src/steps/os/linux.rs   2025-11-17 16:39:39.000000000 
+0100
+++ new/topgrade-16.5.0/src/steps/os/linux.rs   2025-11-26 14:27:49.000000000 
+0100
@@ -78,6 +78,8 @@
             Some("neon") => Distribution::KDENeon,
             Some("openmandriva") => Distribution::OpenMandriva,
             Some("pclinuxos") => Distribution::PCLinuxOS,
+            Some(id) if id.starts_with("origami") => 
Distribution::FedoraImmutable,
+
             _ => {
                 if let Some(name) = name {
                     if name.contains("Vanilla") {
@@ -1121,7 +1123,8 @@
 }
 
 pub fn run_auto_cpufreq(ctx: &ExecutionContext) -> Result<()> {
-    let auto_cpu_freq = require("auto-cpufreq")?;
+    let auto_cpu_freq = require("auto-cpufreq")?.canonicalize()?;
+
     if auto_cpu_freq != PathBuf::from("/usr/local/bin/auto-cpufreq") {
         return Err(SkipStep(String::from(
             "`auto-cpufreq` was not installed by the official installer, but 
presumably by a package manager.",
@@ -1341,4 +1344,11 @@
     fn test_cachyos() {
         test_template(include_str!("os_release/cachyos"), Distribution::Arch);
     }
+
+    #[test]
+    fn test_origami() {
+        test_template(include_str!("os_release/origami"), 
Distribution::FedoraImmutable);
+        test_template(include_str!("os_release/origami-nvidia"), 
Distribution::FedoraImmutable);
+        test_template(include_str!("os_release/origami-test"), 
Distribution::FedoraImmutable);
+    }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/steps/os/os_release/origami 
new/topgrade-16.5.0/src/steps/os/os_release/origami
--- old/topgrade-16.3.0/src/steps/os/os_release/origami 1970-01-01 
01:00:00.000000000 +0100
+++ new/topgrade-16.5.0/src/steps/os/os_release/origami 2025-11-26 
14:27:49.000000000 +0100
@@ -0,0 +1,23 @@
+NAME="Origami Linux"
+VERSION="43.20251117.0 (COSMIC Atomic)"
+RELEASE_TYPE="stable"
+ID="origami-linux"
+VERSION_ID="43"
+VERSION_CODENAME=""
+PRETTY_NAME="Origami 折り紙"
+ANSI_COLOR="0;38;2;60;110;180"
+LOGO="fedora-logo-icon"
+CPE_NAME="cpe:/o:fedoraproject:fedora:43"
+DEFAULT_HOSTNAME="origami"
+HOME_URL="https://origami.wf/";
+DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f43/";
+SUPPORT_URL="https://ask.fedoraproject.org/";
+BUG_REPORT_URL="https://gitlab.com/groups/origami-linux/-/issues";
+REDHAT_BUGZILLA_PRODUCT="Fedora"
+REDHAT_BUGZILLA_PRODUCT_VERSION="43"
+REDHAT_SUPPORT_PRODUCT="Fedora"
+REDHAT_SUPPORT_PRODUCT_VERSION="43"
+SUPPORT_END="2026-12-02"
+VARIANT="COSMIC Atomic"
+VARIANT_ID="cosmic-atomic"
+OSTREE_VERSION="43.20251117.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/topgrade-16.3.0/src/steps/os/os_release/origami-nvidia 
new/topgrade-16.5.0/src/steps/os/os_release/origami-nvidia
--- old/topgrade-16.3.0/src/steps/os/os_release/origami-nvidia  1970-01-01 
01:00:00.000000000 +0100
+++ new/topgrade-16.5.0/src/steps/os/os_release/origami-nvidia  2025-11-26 
14:27:49.000000000 +0100
@@ -0,0 +1,23 @@
+NAME="Origami Linux Nvidia"
+VERSION="43.20251117.0 (COSMIC Atomic)"
+RELEASE_TYPE="stable"
+ID="origami-linux-nvidia"
+VERSION_ID="43"
+VERSION_CODENAME=""
+PRETTY_NAME="Origami 折り紙"
+ANSI_COLOR="0;38;2;60;110;180"
+LOGO="fedora-logo-icon"
+CPE_NAME="cpe:/o:fedoraproject:fedora:43"
+DEFAULT_HOSTNAME="origami"
+HOME_URL="https://origami.wf/";
+DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f43/";
+SUPPORT_URL="https://ask.fedoraproject.org/";
+BUG_REPORT_URL="https://gitlab.com/groups/origami-linux/-/issues";
+REDHAT_BUGZILLA_PRODUCT="Fedora"
+REDHAT_BUGZILLA_PRODUCT_VERSION="43"
+REDHAT_SUPPORT_PRODUCT="Fedora"
+REDHAT_SUPPORT_PRODUCT_VERSION="43"
+SUPPORT_END="2026-12-02"
+VARIANT="COSMIC Atomic"
+VARIANT_ID="cosmic-atomic"
+OSTREE_VERSION="43.20251117.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/steps/os/os_release/origami-test 
new/topgrade-16.5.0/src/steps/os/os_release/origami-test
--- old/topgrade-16.3.0/src/steps/os/os_release/origami-test    1970-01-01 
01:00:00.000000000 +0100
+++ new/topgrade-16.5.0/src/steps/os/os_release/origami-test    2025-11-26 
14:27:49.000000000 +0100
@@ -0,0 +1,23 @@
+NAME="Origami Linux Test"
+VERSION="43.20251117.0 (COSMIC Atomic)"
+RELEASE_TYPE="stable"
+ID="origami-linux-test"
+VERSION_ID="43"
+VERSION_CODENAME=""
+PRETTY_NAME="Origami 折り紙"
+ANSI_COLOR="0;38;2;60;110;180"
+LOGO="fedora-logo-icon"
+CPE_NAME="cpe:/o:fedoraproject:fedora:43"
+DEFAULT_HOSTNAME="origami"
+HOME_URL="https://origami.wf/";
+DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f43/";
+SUPPORT_URL="https://ask.fedoraproject.org/";
+BUG_REPORT_URL="https://gitlab.com/groups/origami-linux/-/issues";
+REDHAT_BUGZILLA_PRODUCT="Fedora"
+REDHAT_BUGZILLA_PRODUCT_VERSION="43"
+REDHAT_SUPPORT_PRODUCT="Fedora"
+REDHAT_SUPPORT_PRODUCT_VERSION="43"
+SUPPORT_END="2026-12-02"
+VARIANT="COSMIC Atomic"
+VARIANT_ID="cosmic-atomic"
+OSTREE_VERSION="43.20251117.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/topgrade-16.3.0/src/steps/os/unix.rs 
new/topgrade-16.5.0/src/steps/os/unix.rs
--- old/topgrade-16.3.0/src/steps/os/unix.rs    2025-11-17 16:39:39.000000000 
+0100
+++ new/topgrade-16.5.0/src/steps/os/unix.rs    2025-11-26 14:27:49.000000000 
+0100
@@ -81,7 +81,6 @@
     /// Execute an "internal" brew command, i.e. one that should always be run
     /// even when dry-running. Basically just a wrapper around [`Command::new`]
     /// that uses `arch` to run using the correct architecture if needed.
-    #[cfg(target_os = "macos")]
     fn execute_internal(self) -> Command {
         match self {
             BrewVariant::MacIntel if cfg!(target_arch = "aarch64") => {
@@ -365,12 +364,48 @@
     Ok(())
 }
 
-#[cfg(target_os = "macos")]
+#[cfg(any(target_os = "linux", target_os = "macos"))]
 pub fn run_brew_cask(ctx: &ExecutionContext, variant: BrewVariant) -> 
Result<()> {
     let binary_name = require(variant.binary_name())?;
+
+    #[cfg(target_os = "macos")]
     if variant.is_path() && !BrewVariant::is_macos_custom(binary_name) {
         return Err(SkipStep(t!("Not a custom brew for 
macOS").to_string()).into());
     }
+
+    #[cfg(target_os = "linux")]
+    {
+        // Homebrew cask support was added in version 4.5.0
+        let version_output = 
Command::new(&binary_name).arg("--version").output_checked_utf8()?;
+
+        let version_line = version_output
+            .stdout
+            .lines()
+            .next()
+            .ok_or_else(|| eyre!(output_changed_message!("brew --version", "no 
output lines")))?;
+
+        let version_str = version_line.split_whitespace().nth(1).ok_or_else(|| 
{
+            eyre!(output_changed_message!(
+                "brew --version",
+                "Expected version after 'Homebrew'"
+            ))
+        })?;
+
+        let version = Version::parse(version_str)
+            .wrap_err_with(|| output_changed_message!("brew --version", 
"Invalid version"))?;
+
+        if version < Version::new(4, 5, 0) {
+            return Err(SkipStep(
+                t!(
+                    "Homebrew cask support on Linux requires Homebrew 4.5.0 or 
later (found {version})",
+                    version = version
+                )
+                .to_string(),
+            )
+            .into());
+        }
+    }
+
     print_separator(format!("{} - Cask", variant.step_title()));
 
     let cask_upgrade_exists = variant
@@ -824,7 +859,23 @@
         }
     }
 
-    ctx.execute(&mise).arg("upgrade").status_checked()
+    let mut cmd = ctx.execute(&mise);
+
+    cmd.arg("upgrade");
+
+    if ctx.config().mise_interactive() {
+        cmd.arg("--interactive");
+    }
+
+    if ctx.config().mise_bump() {
+        cmd.arg("--bump");
+    }
+
+    if ctx.config().mise_jobs() != 4 {
+        cmd.args(["--jobs", &ctx.config().mise_jobs().to_string()]);
+    }
+
+    cmd.status_checked()
 }
 
 pub fn run_home_manager(ctx: &ExecutionContext) -> Result<()> {

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

Reply via email to