Compare commits
34 Commits
pre-commit
...
v17
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5bd5f10f0c | ||
|
|
bfaca61deb | ||
|
|
b00c4c1503 | ||
|
|
54a722be21 | ||
|
|
bf4555ed29 | ||
|
|
46eb74109e | ||
|
|
0bde798b4a | ||
|
|
ebb4448950 | ||
|
|
b2b51bc8d2 | ||
|
|
8840a273b4 | ||
|
|
50e55dea77 | ||
|
|
f7c9e42066 | ||
|
|
ef3ee7bea7 | ||
|
|
8eb300c4fb | ||
|
|
b7b99a725c | ||
|
|
df090a89c4 | ||
|
|
856fa0ed5b | ||
|
|
9bb5a680ac | ||
|
|
2d40f7bdb3 | ||
|
|
06b210d1c9 | ||
|
|
e0e714e7b5 | ||
|
|
dfb8342d8b | ||
|
|
9d662e36a1 | ||
|
|
45159c29fe | ||
|
|
a27c68a1dd | ||
|
|
cdee1c14d9 | ||
|
|
8de6a36d86 | ||
|
|
b03a8d53bb | ||
|
|
b0510cdade | ||
|
|
7945311b4b | ||
|
|
75de4dfd3b | ||
|
|
6a838bbcb7 | ||
|
|
ab2bab8c9b | ||
|
|
9a55278d32 |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -2,7 +2,7 @@
|
||||
name: Bug report
|
||||
about: Topgrade is misbehaving
|
||||
title: ''
|
||||
labels: 'C-bug'
|
||||
type: Bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -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: ''
|
||||
|
||||
---
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/step_request.md
vendored
3
.github/ISSUE_TEMPLATE/step_request.md
vendored
@@ -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: ''
|
||||
|
||||
---
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
2
.github/workflows/check_i18n.yml
vendored
2
.github/workflows/check_i18n.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
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
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4
|
||||
with:
|
||||
sarif_file: devskim-results.sarif
|
||||
|
||||
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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
|
||||
|
||||
|
||||
4
.github/workflows/create_release_assets.yml
vendored
4
.github/workflows/create_release_assets.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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
|
||||
|
||||
|
||||
2
.github/workflows/dependency-review.yml
vendored
2
.github/workflows/dependency-review.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
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
|
||||
|
||||
|
||||
4
.github/workflows/release-plz.yml
vendored
4
.github/workflows/release-plz.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
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
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
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
|
||||
|
||||
2
.github/workflows/release_to_homebrew.yml
vendored
2
.github/workflows/release_to_homebrew.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
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}}
|
||||
|
||||
8
.github/workflows/release_to_pypi.yml
vendored
8
.github/workflows/release_to_pypi.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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 @@ jobs:
|
||||
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 @@ jobs:
|
||||
sdist:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
4
.github/workflows/scorecards.yml
vendored
4
.github/workflows/scorecards.yml
vendored
@@ -36,7 +36,7 @@ jobs:
|
||||
|
||||
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 @@ jobs:
|
||||
|
||||
# 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@e12f0178983d466f2f6028f5cc7a6d786fd97f4b # v4.31.4
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
34
CHANGELOG.md
34
CHANGELOG.md
@@ -7,6 +7,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [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
|
||||
|
||||
69
Cargo.lock
generated
69
Cargo.lock
generated
@@ -272,9 +272,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||
|
||||
[[package]]
|
||||
name = "base64ct"
|
||||
version = "1.7.3"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
|
||||
checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
@@ -385,19 +385,29 @@ dependencies = [
|
||||
|
||||
[[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_builder"
|
||||
version = "4.5.51"
|
||||
name = "clap-cargo"
|
||||
version = "0.18.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
|
||||
checksum = "936551935c8258754bb8216aec040957d261f977303754b9bf1a213518388006"
|
||||
dependencies = [
|
||||
"anstyle",
|
||||
"clap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.53"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -407,9 +417,9 @@ dependencies = [
|
||||
|
||||
[[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",
|
||||
]
|
||||
@@ -807,13 +817,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "etcetera"
|
||||
version = "0.10.0"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26c7b13d0780cb82722fd59f6f57f925e143427e4a75313a6c77243bf5326ae6"
|
||||
checksum = "de48cc4d1c1d97a20fd819def54b890cadde72ed3ad0c614822a0a433361be96"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"home",
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1069,9 +1078,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.16"
|
||||
version = "0.4.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -1118,9 +1127,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[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"
|
||||
@@ -1140,15 +1149,6 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||
|
||||
[[package]]
|
||||
name = "home"
|
||||
version = "0.5.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "1.3.1"
|
||||
@@ -1380,9 +1380,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ignore"
|
||||
version = "0.4.23"
|
||||
version = "0.4.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
|
||||
checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a"
|
||||
dependencies = [
|
||||
"crossbeam-deque",
|
||||
"globset",
|
||||
@@ -1402,12 +1402,12 @@ checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5"
|
||||
|
||||
[[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",
|
||||
]
|
||||
@@ -2964,11 +2964,11 @@ checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2"
|
||||
|
||||
[[package]]
|
||||
name = "topgrade"
|
||||
version = "16.3.0"
|
||||
version = "16.4.2"
|
||||
dependencies = [
|
||||
"base64ct",
|
||||
"chrono",
|
||||
"clap",
|
||||
"clap-cargo",
|
||||
"clap_complete",
|
||||
"clap_mangen",
|
||||
"color-eyre",
|
||||
@@ -2976,9 +2976,6 @@ dependencies = [
|
||||
"etcetera",
|
||||
"futures",
|
||||
"glob",
|
||||
"globset",
|
||||
"home",
|
||||
"ignore",
|
||||
"indexmap",
|
||||
"is_elevated",
|
||||
"jetbrains-toolbox-updater",
|
||||
|
||||
18
Cargo.toml
18
Cargo.toml
@@ -5,19 +5,18 @@ categories = ["os"]
|
||||
keywords = ["upgrade", "update"]
|
||||
license = "GPL-3.0-or-later"
|
||||
repository = "https://github.com/topgrade-rs/topgrade"
|
||||
rust-version = "1.84.1"
|
||||
version = "16.3.0"
|
||||
rust-version = "1.87.0"
|
||||
version = "16.4.2"
|
||||
authors = ["Roey Darwish Dror <roey.ghost@gmail.com>", "Thomas Schönauer <t.schoenauer@hgs-wt.at>"]
|
||||
exclude = ["doc/screenshot.gif", "BREAKINGCHANGES_dev.md"]
|
||||
edition = "2021"
|
||||
edition = "2024"
|
||||
|
||||
readme = "README.md"
|
||||
|
||||
[dependencies]
|
||||
home = "=0.5.11"
|
||||
etcetera = "=0.10.0"
|
||||
etcetera = "~0.11.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"] }
|
||||
@@ -47,10 +46,7 @@ sys-locale = "0.3.1"
|
||||
jetbrains-toolbox-updater = "5.0.0"
|
||||
indexmap = { version = "2.9.0", features = ["serde"] }
|
||||
serde_json = "1.0.145"
|
||||
# Temporary transitive dependency pins
|
||||
ignore = "=0.4.23"
|
||||
globset = "=0.4.16"
|
||||
base64ct = "<1.8.0"
|
||||
clap-cargo = "0.18.0"
|
||||
|
||||
[patch.crates-io]
|
||||
mac-notification-sys = { git = "https://github.com/h4llow3En/mac-notification-sys" }
|
||||
@@ -64,7 +60,7 @@ git = "*"
|
||||
[package.metadata.deb]
|
||||
name = "topgrade"
|
||||
maintainer = "Chris Gelatt <kreeblah@gmail.com>"
|
||||
copyright = "2024, Topgrade Team"
|
||||
copyright = "2025, Topgrade Team"
|
||||
license-file = ["LICENSE", "0"]
|
||||
depends = "$auto"
|
||||
extended-description = "Keeping your system up to date usually involves invoking multiple package managers. This results in big, non-portable shell one-liners saved in your shell. To remedy this, Topgrade detects which tools you use and runs the appropriate commands to update them."
|
||||
|
||||
12
README.md
12
README.md
@@ -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 @@ To remedy this, **Topgrade** detects which tools you use and runs the appropriat
|
||||
- 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 @@ To remedy this, **Topgrade** detects which tools you use and runs the appropriat
|
||||
`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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -694,6 +694,14 @@ _version: 2
|
||||
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"
|
||||
|
||||
@@ -5,13 +5,20 @@ build-backend = "maturin"
|
||||
[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"
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
[toolchain]
|
||||
channel = "1.84.1"
|
||||
channel = "1.87.0"
|
||||
|
||||
@@ -4,17 +4,17 @@
|
||||
//! 1. The Topgrade being executed is a new major release
|
||||
//! 2. This is the first launch of that major release
|
||||
|
||||
use crate::terminal::print_separator;
|
||||
#[cfg(windows)]
|
||||
use crate::WINDOWS_DIRS;
|
||||
#[cfg(unix)]
|
||||
use crate::XDG_DIRS;
|
||||
use crate::terminal::print_separator;
|
||||
use color_eyre::eyre::Result;
|
||||
use etcetera::base_strategy::BaseStrategy;
|
||||
use rust_i18n::t;
|
||||
use std::{
|
||||
env::var,
|
||||
fs::{read_to_string, OpenOptions},
|
||||
fs::{OpenOptions, read_to_string},
|
||||
io::Write,
|
||||
path::PathBuf,
|
||||
str::FromStr,
|
||||
|
||||
@@ -5,8 +5,8 @@ use std::process::Child;
|
||||
use std::process::{Command, ExitStatus, Output};
|
||||
|
||||
use color_eyre::eyre;
|
||||
use color_eyre::eyre::eyre;
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::eyre;
|
||||
|
||||
use crate::error::TopgradeError;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
use std::fs::{write, File};
|
||||
use std::fs::{File, write};
|
||||
use std::io::Write;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::Command;
|
||||
@@ -60,6 +60,7 @@ pub struct Containers {
|
||||
#[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)]
|
||||
@@ -172,6 +173,15 @@ pub struct Chezmoi {
|
||||
exclude_encrypted: Option<bool>,
|
||||
}
|
||||
|
||||
#[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)]
|
||||
@@ -203,9 +213,10 @@ pub struct Brew {
|
||||
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 @@ pub enum ArchPackageManager {
|
||||
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 @@ pub struct Misc {
|
||||
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,
|
||||
}
|
||||
@@ -467,6 +480,9 @@ pub struct ConfigFile {
|
||||
#[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)]
|
||||
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>,
|
||||
|
||||
@@ -713,7 +729,7 @@ impl ConfigFile {
|
||||
// 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 @@ impl Config {
|
||||
.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 @@ impl Config {
|
||||
.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 @@ impl Config {
|
||||
.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 @@ impl Config {
|
||||
.linux
|
||||
.as_ref()
|
||||
.and_then(|s| s.arch_package_manager)
|
||||
.unwrap_or(ArchPackageManager::Autodetect)
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
/// Extra yay arguments
|
||||
@@ -1791,6 +1816,26 @@ impl Config {
|
||||
.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 @@ mod test {
|
||||
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"]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! SIGINT handling in Unix systems.
|
||||
use crate::ctrlc::interrupted::set_interrupted;
|
||||
use nix::sys::signal::{sigaction, SaFlags, SigAction, SigHandler, SigSet, Signal};
|
||||
use nix::sys::signal::{SaFlags, SigAction, SigHandler, SigSet, Signal, sigaction};
|
||||
|
||||
/// Handle SIGINT. Set the interruption flag.
|
||||
extern "C" fn handle_sigint(_: i32) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//! A stub for Ctrl + C handling.
|
||||
use crate::ctrlc::interrupted::set_interrupted;
|
||||
use tracing::error;
|
||||
use windows::Win32::System::Console::{CTRL_C_EVENT, SetConsoleCtrlHandler};
|
||||
use windows::core::BOOL;
|
||||
use windows::Win32::System::Console::{SetConsoleCtrlHandler, CTRL_C_EVENT};
|
||||
|
||||
extern "system" fn handler(ctrl_type: u32) -> BOOL {
|
||||
match ctrl_type {
|
||||
|
||||
@@ -7,7 +7,7 @@ use std::process::{Child, Command, ExitStatus, Output};
|
||||
|
||||
use color_eyre::eyre::Result;
|
||||
use rust_i18n::t;
|
||||
use tracing::{debug, enabled, Level};
|
||||
use tracing::{Level, debug, enabled};
|
||||
|
||||
use crate::command::CommandExt;
|
||||
use crate::error::DryRun;
|
||||
|
||||
13
src/main.rs
13
src/main.rs
@@ -1,6 +1,7 @@
|
||||
#![allow(clippy::cognitive_complexity)]
|
||||
|
||||
use std::env;
|
||||
use std::env::home_dir;
|
||||
use std::io;
|
||||
use std::path::PathBuf;
|
||||
use std::process::exit;
|
||||
@@ -8,7 +9,7 @@ use std::time::Duration;
|
||||
|
||||
use crate::breaking_changes::{first_run_of_major_release, print_breaking_changes, should_skip, write_keep_file};
|
||||
use clap::CommandFactory;
|
||||
use clap::{crate_version, Parser};
|
||||
use clap::{Parser, crate_version};
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
use console::Key;
|
||||
@@ -48,7 +49,7 @@ mod sudo;
|
||||
mod terminal;
|
||||
mod utils;
|
||||
|
||||
pub(crate) static HOME_DIR: LazyLock<PathBuf> = LazyLock::new(|| home::home_dir().expect("No home directory"));
|
||||
pub(crate) static HOME_DIR: LazyLock<PathBuf> = LazyLock::new(|| home_dir().expect("No home directory"));
|
||||
#[cfg(unix)]
|
||||
pub(crate) static XDG_DIRS: LazyLock<Xdg> = LazyLock::new(|| Xdg::new().expect("No home directory"));
|
||||
|
||||
@@ -98,7 +99,7 @@ fn run() -> Result<()> {
|
||||
let mut parts = env.split('=');
|
||||
let var = parts.next().unwrap();
|
||||
let value = parts.next().unwrap();
|
||||
env::set_var(var, value);
|
||||
unsafe { env::set_var(var, value) };
|
||||
}
|
||||
|
||||
if opt.edit_config() {
|
||||
@@ -321,11 +322,7 @@ fn run() -> Result<()> {
|
||||
);
|
||||
}
|
||||
|
||||
if failed {
|
||||
Err(StepFailed.into())
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
if failed { Err(StepFailed.into()) } else { Ok(()) }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
@@ -9,7 +9,7 @@ use crate::ctrlc;
|
||||
use crate::error::{DryRun, MissingSudo, SkipStep};
|
||||
use crate::execution_context::ExecutionContext;
|
||||
use crate::step::Step;
|
||||
use crate::terminal::{print_error, print_warning, should_retry, ShouldRetry};
|
||||
use crate::terminal::{ShouldRetry, print_error, print_warning, should_retry};
|
||||
|
||||
pub enum StepResult {
|
||||
Success,
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
use std::env;
|
||||
#[cfg(unix)]
|
||||
use std::os::unix::process::CommandExt as _;
|
||||
use std::process::Command;
|
||||
#[cfg(windows)]
|
||||
use std::process::exit;
|
||||
use std::process::Command;
|
||||
|
||||
use crate::step::Step;
|
||||
use color_eyre::eyre::Result;
|
||||
#[cfg(unix)]
|
||||
use color_eyre::eyre::bail;
|
||||
use color_eyre::eyre::Result;
|
||||
use rust_i18n::t;
|
||||
use self_update_crate::backends::github::Update;
|
||||
use self_update_crate::update::UpdateStatus;
|
||||
|
||||
@@ -225,7 +225,7 @@ impl Step {
|
||||
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 @@ pub(crate) fn default_steps() -> Vec<Step> {
|
||||
Restarts,
|
||||
Flatpak,
|
||||
BrewFormula,
|
||||
BrewCask,
|
||||
Lure,
|
||||
Waydroid,
|
||||
AutoCpufreq,
|
||||
|
||||
@@ -6,12 +6,12 @@ use std::process::Command;
|
||||
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
use color_eyre::eyre::{eyre, OptionExt};
|
||||
use color_eyre::eyre::{OptionExt, eyre};
|
||||
use tracing::{debug, error, warn};
|
||||
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 @@ pub fn run_containers(ctx: &ExecutionContext) -> Result<()> {
|
||||
));
|
||||
}
|
||||
|
||||
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 @@ pub fn run_containers(ctx: &ExecutionContext) -> Result<()> {
|
||||
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(())
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ use crate::command::CommandExt;
|
||||
use crate::execution_context::ExecutionContext;
|
||||
use crate::step::Step;
|
||||
use crate::terminal::print_separator;
|
||||
use crate::utils::{require, require_option, PathExt};
|
||||
use crate::utils::{PathExt, require, require_option};
|
||||
|
||||
const EMACS_UPGRADE: &str = include_str!("emacs.el");
|
||||
#[cfg(windows)]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
use color_eyre::eyre::{eyre, OptionExt};
|
||||
use jetbrains_toolbox_updater::{find_jetbrains_toolbox, update_jetbrains_toolbox, FindError};
|
||||
use color_eyre::eyre::{OptionExt, eyre};
|
||||
use jetbrains_toolbox_updater::{FindError, find_jetbrains_toolbox, update_jetbrains_toolbox};
|
||||
use regex::bytes::Regex;
|
||||
use rust_i18n::t;
|
||||
use semver::Version;
|
||||
@@ -16,6 +16,7 @@ use std::{fs, io::Write};
|
||||
use tempfile::tempfile_in;
|
||||
use tracing::{debug, error, warn};
|
||||
|
||||
use crate::HOME_DIR;
|
||||
use crate::command::{CommandExt, Utf8Output};
|
||||
use crate::execution_context::ExecutionContext;
|
||||
use crate::executor::ExecutorOutput;
|
||||
@@ -23,8 +24,7 @@ use crate::output_changed_message;
|
||||
use crate::step::Step;
|
||||
use crate::sudo::SudoExecuteOpts;
|
||||
use crate::terminal::{print_separator, shell};
|
||||
use crate::utils::{check_is_python_2_or_shim, require, require_one, require_option, which, PathExt};
|
||||
use crate::HOME_DIR;
|
||||
use crate::utils::{PathExt, check_is_python_2_or_shim, require, require_one, require_option, which};
|
||||
use crate::{
|
||||
error::{SkipStep, StepFailed, TopgradeError},
|
||||
terminal::print_warning,
|
||||
@@ -65,7 +65,9 @@ pub fn run_cargo_update(ctx: &ExecutionContext) -> Result<()> {
|
||||
.or_else(|| cargo_dir.join("bin/cargo-install-update").if_exists());
|
||||
|
||||
let Some(cargo_update) = cargo_update else {
|
||||
let message = String::from("cargo-update isn't installed so Topgrade can't upgrade cargo packages.\nInstall cargo-update by running `cargo install cargo-update`");
|
||||
let message = String::from(
|
||||
"cargo-update isn't installed so Topgrade can't upgrade cargo packages.\nInstall cargo-update by running `cargo install cargo-update`",
|
||||
);
|
||||
print_warning(&message);
|
||||
return Err(SkipStep(message).into());
|
||||
};
|
||||
@@ -81,7 +83,9 @@ pub fn run_cargo_update(ctx: &ExecutionContext) -> Result<()> {
|
||||
if let Some(e) = cargo_cache {
|
||||
ctx.execute(e).args(["-a"]).status_checked()?;
|
||||
} else {
|
||||
let message = String::from("cargo-cache isn't installed so Topgrade can't cleanup cargo packages.\nInstall cargo-cache by running `cargo install cargo-cache`");
|
||||
let message = String::from(
|
||||
"cargo-cache isn't installed so Topgrade can't cleanup cargo packages.\nInstall cargo-cache by running `cargo install cargo-cache`",
|
||||
);
|
||||
print_warning(message);
|
||||
}
|
||||
}
|
||||
@@ -542,7 +546,7 @@ fn run_vscode_compatible(variant: VSCodeVariant, ctx: &ExecutionContext) -> Resu
|
||||
return Err(eyre!(output_changed_message!(
|
||||
&format!("{bin_name} --version"),
|
||||
"No first line"
|
||||
)))
|
||||
)));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1239,11 +1243,7 @@ pub fn run_helm_repo_update(ctx: &ExecutionContext) -> Result<()> {
|
||||
};
|
||||
}
|
||||
|
||||
if success {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(eyre!(StepFailed))
|
||||
}
|
||||
if success { Ok(()) } else { Err(eyre!(StepFailed)) }
|
||||
}
|
||||
|
||||
pub fn run_stew(ctx: &ExecutionContext) -> Result<()> {
|
||||
@@ -1428,8 +1428,7 @@ pub fn run_poetry(ctx: &ExecutionContext) -> Result<()> {
|
||||
.map_err(|e| SkipStep(format!("Could not find interpreter for {}: {}", poetry.display(), e)))?;
|
||||
debug!("poetry interpreter: {:?}, args: {:?}", interp, interp_args);
|
||||
|
||||
let check_official_install_script =
|
||||
"import sys; from os import path; print('Y') if path.isfile(path.join(sys.prefix, 'poetry_env')) else print('N')";
|
||||
let check_official_install_script = "import sys; from os import path; print('Y') if path.isfile(path.join(sys.prefix, 'poetry_env')) else print('N')";
|
||||
let mut command = Command::new(&interp);
|
||||
if let Some(args) = interp_args {
|
||||
command.arg(args);
|
||||
@@ -1708,7 +1707,10 @@ fn run_jetbrains_ide_generic<const IS_JETBRAINS: bool>(ctx: &ExecutionContext, b
|
||||
.code()
|
||||
.ok_or_eyre("Failed to get status code; was killed with signal")?;
|
||||
if status_code != 1 {
|
||||
return Err(eyre!("Expected status code 1 ('Only one instance of <IDE> can be run at a time.'), but found status code {}. Output: {output:?}", status_code));
|
||||
return Err(eyre!(
|
||||
"Expected status code 1 ('Only one instance of <IDE> can be run at a time.'), but found status code {}. Output: {output:?}",
|
||||
status_code
|
||||
));
|
||||
}
|
||||
// Don't crash, but don't be silent either
|
||||
warn!("{name} is already running, can't update it now.");
|
||||
|
||||
@@ -4,10 +4,10 @@ use std::path::{Path, PathBuf};
|
||||
use std::process::{Command, Output, Stdio};
|
||||
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::{eyre, Result};
|
||||
use color_eyre::eyre::{Result, eyre};
|
||||
use console::style;
|
||||
use futures::stream::{iter, FuturesUnordered, StreamExt};
|
||||
use glob::{glob_with, MatchOptions};
|
||||
use futures::stream::{FuturesUnordered, StreamExt, iter};
|
||||
use glob::{MatchOptions, glob_with};
|
||||
use tokio::process::Command as AsyncCommand;
|
||||
use tokio::runtime;
|
||||
use tracing::{debug, error};
|
||||
@@ -17,8 +17,8 @@ use crate::execution_context::ExecutionContext;
|
||||
use crate::step::Step;
|
||||
use crate::steps::emacs::Emacs;
|
||||
use crate::terminal::print_separator;
|
||||
use crate::utils::{require, PathExt};
|
||||
use crate::{error::SkipStep, terminal::print_warning, HOME_DIR};
|
||||
use crate::utils::{PathExt, require};
|
||||
use crate::{HOME_DIR, error::SkipStep, terminal::print_warning};
|
||||
use etcetera::base_strategy::BaseStrategy;
|
||||
use rust_i18n::t;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ use tracing::debug;
|
||||
|
||||
use crate::command::CommandExt;
|
||||
use crate::terminal::{print_info, print_separator};
|
||||
use crate::utils::{require, PathExt};
|
||||
use crate::utils::{PathExt, require};
|
||||
use crate::{error::SkipStep, execution_context::ExecutionContext};
|
||||
|
||||
enum NPMVariant {
|
||||
@@ -65,11 +65,7 @@ impl NPM {
|
||||
/// If the “NPM” version is larger than 8.11.0, we use
|
||||
/// `--location=global`; otherwise, use `-g`.
|
||||
fn global_location_arg(&self) -> &str {
|
||||
if self.is_npm_8() {
|
||||
"--location=global"
|
||||
} else {
|
||||
"-g"
|
||||
}
|
||||
if self.is_npm_8() { "--location=global" } else { "-g" }
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
|
||||
@@ -6,6 +6,7 @@ use ini::Ini;
|
||||
use rust_i18n::t;
|
||||
use tracing::{debug, warn};
|
||||
|
||||
use crate::HOME_DIR;
|
||||
use crate::command::CommandExt;
|
||||
use crate::error::{SkipStep, TopgradeError};
|
||||
use crate::execution_context::ExecutionContext;
|
||||
@@ -14,8 +15,7 @@ use crate::steps::generic::is_wsl;
|
||||
use crate::steps::os::archlinux;
|
||||
use crate::sudo::SudoExecuteOpts;
|
||||
use crate::terminal::{print_separator, prompt_yesno};
|
||||
use crate::utils::{require, require_one, which, PathExt};
|
||||
use crate::HOME_DIR;
|
||||
use crate::utils::{PathExt, require, require_one, which};
|
||||
|
||||
static OS_RELEASE_PATH: &str = "/etc/os-release";
|
||||
|
||||
@@ -78,6 +78,8 @@ impl Distribution {
|
||||
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") {
|
||||
@@ -1341,4 +1343,11 @@ mod tests {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,7 +200,7 @@ pub fn update_xcodes(ctx: &ExecutionContext) -> Result<()> {
|
||||
pub fn process_xcodes_releases(releases_filtered: Vec<String>, should_ask: bool, ctx: &ExecutionContext) -> Result<()> {
|
||||
let xcodes = require("xcodes")?;
|
||||
|
||||
if releases_filtered.last().map_or(true, |s| !s.contains("(Installed)")) && !releases_filtered.is_empty() {
|
||||
if releases_filtered.last().is_none_or(|s| !s.contains("(Installed)")) && !releases_filtered.is_empty() {
|
||||
println!(
|
||||
"{} {}",
|
||||
t!("New Xcode release detected:"),
|
||||
|
||||
23
src/steps/os/os_release/origami
Normal file
23
src/steps/os/os_release/origami
Normal file
@@ -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"
|
||||
23
src/steps/os/os_release/origami-nvidia
Normal file
23
src/steps/os/os_release/origami-nvidia
Normal file
@@ -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"
|
||||
23
src/steps/os/os_release/origami-test
Normal file
23
src/steps/os/os_release/origami-test
Normal file
@@ -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"
|
||||
@@ -1,14 +1,14 @@
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
use color_eyre::eyre::{eyre, OptionExt};
|
||||
use color_eyre::eyre::{OptionExt, eyre};
|
||||
use etcetera::BaseStrategy;
|
||||
use home;
|
||||
use ini::Ini;
|
||||
#[cfg(target_os = "linux")]
|
||||
use nix::unistd::Uid;
|
||||
use regex::Regex;
|
||||
use rust_i18n::t;
|
||||
use semver::Version;
|
||||
use std::env::home_dir;
|
||||
use std::ffi::OsStr;
|
||||
use std::io::Write;
|
||||
use std::os::unix::fs::MetadataExt;
|
||||
@@ -20,10 +20,10 @@ use std::{env::var, path::Path};
|
||||
use std::{fs, io};
|
||||
use tracing::{debug, warn};
|
||||
|
||||
use crate::XDG_DIRS;
|
||||
use crate::command::CommandExt;
|
||||
use crate::sudo::SudoExecuteOpts;
|
||||
use crate::XDG_DIRS;
|
||||
use crate::{output_changed_message, HOME_DIR};
|
||||
use crate::{HOME_DIR, output_changed_message};
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
use super::linux::Distribution;
|
||||
@@ -33,7 +33,7 @@ use crate::execution_context::ExecutionContext;
|
||||
use crate::executor::Executor;
|
||||
use crate::step::Step;
|
||||
use crate::terminal::print_separator;
|
||||
use crate::utils::{require, PathExt};
|
||||
use crate::utils::{PathExt, require};
|
||||
|
||||
#[cfg(any(target_os = "linux", target_os = "macos"))]
|
||||
const INTEL_BREW: &str = "/usr/local/bin/brew";
|
||||
@@ -81,7 +81,6 @@ impl BrewVariant {
|
||||
/// 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 @@ pub fn run_brew_formula(ctx: &ExecutionContext, variant: BrewVariant) -> Result<
|
||||
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
|
||||
@@ -491,8 +526,8 @@ pub fn run_nix(ctx: &ExecutionContext) -> Result<()> {
|
||||
let nix = require("nix")?;
|
||||
let nix_channel = require("nix-channel")?;
|
||||
let nix_env = require("nix-env")?;
|
||||
// TODO: Is None possible here?
|
||||
let profile_path = match home::home_dir() {
|
||||
// TODO: Is None possible here? Should we use HOME_DIR instead?
|
||||
let profile_path = match home_dir() {
|
||||
Some(home) => XDG_DIRS
|
||||
.state_dir()
|
||||
.map(|d| d.join("nix/profile"))
|
||||
@@ -824,7 +859,23 @@ pub fn run_mise(ctx: &ExecutionContext) -> Result<()> {
|
||||
}
|
||||
}
|
||||
|
||||
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<()> {
|
||||
|
||||
@@ -254,11 +254,7 @@ pub fn microsoft_store(ctx: &ExecutionContext) -> Result<()> {
|
||||
}
|
||||
let ret_val = output.stdout.trim();
|
||||
debug!("Command return value: {}", ret_val);
|
||||
if ret_val == "0" {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
if ret_val == "0" { Ok(()) } else { Err(()) }
|
||||
})?;
|
||||
println!(
|
||||
"{}",
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
|
||||
use color_eyre::eyre::Result;
|
||||
#[cfg(windows)]
|
||||
use color_eyre::eyre::eyre;
|
||||
use color_eyre::eyre::Result;
|
||||
use tracing::debug;
|
||||
|
||||
use crate::command::CommandExt;
|
||||
use crate::execution_context::ExecutionContext;
|
||||
use crate::terminal;
|
||||
use crate::utils::{which, PathExt};
|
||||
use crate::utils::{PathExt, which};
|
||||
|
||||
pub struct Powershell {
|
||||
path: PathBuf,
|
||||
|
||||
@@ -2,20 +2,20 @@ use std::env;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
|
||||
use color_eyre::eyre::eyre;
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
use color_eyre::eyre::eyre;
|
||||
use etcetera::base_strategy::BaseStrategy;
|
||||
|
||||
use crate::command::CommandExt;
|
||||
use crate::config::TmuxConfig;
|
||||
use crate::config::TmuxSessionMode;
|
||||
use crate::terminal::print_separator;
|
||||
use crate::{HOME_DIR, XDG_DIRS};
|
||||
use crate::{
|
||||
execution_context::ExecutionContext,
|
||||
utils::{which, PathExt},
|
||||
utils::{PathExt, which},
|
||||
};
|
||||
use crate::{HOME_DIR, XDG_DIRS};
|
||||
|
||||
use rust_i18n::t;
|
||||
#[cfg(unix)]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use crate::HOME_DIR;
|
||||
use crate::command::CommandExt;
|
||||
use crate::error::{SkipStep, TopgradeError};
|
||||
use crate::HOME_DIR;
|
||||
use color_eyre::eyre::Result;
|
||||
use etcetera::base_strategy::BaseStrategy;
|
||||
|
||||
@@ -8,7 +8,7 @@ use crate::executor::{Executor, ExecutorOutput};
|
||||
use crate::terminal::print_separator;
|
||||
use crate::{
|
||||
execution_context::ExecutionContext,
|
||||
utils::{require, PathExt},
|
||||
utils::{PathExt, require},
|
||||
};
|
||||
use rust_i18n::t;
|
||||
use std::path::PathBuf;
|
||||
|
||||
@@ -6,13 +6,13 @@ use color_eyre::eyre::Result;
|
||||
use tracing::debug;
|
||||
use walkdir::WalkDir;
|
||||
|
||||
use crate::HOME_DIR;
|
||||
use crate::XDG_DIRS;
|
||||
use crate::command::CommandExt;
|
||||
use crate::execution_context::ExecutionContext;
|
||||
use crate::git::RepoStep;
|
||||
use crate::terminal::print_separator;
|
||||
use crate::utils::{require, PathExt};
|
||||
use crate::HOME_DIR;
|
||||
use crate::XDG_DIRS;
|
||||
use crate::utils::{PathExt, require};
|
||||
use etcetera::base_strategy::BaseStrategy;
|
||||
|
||||
pub fn run_zr(ctx: &ExecutionContext) -> Result<()> {
|
||||
@@ -162,7 +162,7 @@ pub fn run_oh_my_zsh(ctx: &ExecutionContext) -> Result<()> {
|
||||
if let Ok(output) = res_env_zsh {
|
||||
let env_zsh = output.stdout;
|
||||
debug!("Oh-my-zsh: under SSH, setting ZSH={}", env_zsh);
|
||||
env::set_var("ZSH", env_zsh);
|
||||
unsafe { env::set_var("ZSH", env_zsh) };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@ use std::path::PathBuf;
|
||||
|
||||
#[cfg(windows)]
|
||||
use color_eyre::eyre;
|
||||
#[cfg(windows)]
|
||||
use color_eyre::eyre::eyre;
|
||||
use color_eyre::eyre::Context;
|
||||
use color_eyre::eyre::Result;
|
||||
#[cfg(windows)]
|
||||
use color_eyre::eyre::eyre;
|
||||
use rust_i18n::t;
|
||||
use serde::Deserialize;
|
||||
use strum::Display;
|
||||
|
||||
@@ -8,7 +8,7 @@ use std::time::Duration;
|
||||
use chrono::{Local, Timelike};
|
||||
use color_eyre::eyre;
|
||||
use color_eyre::eyre::Context;
|
||||
use console::{style, Key, Term};
|
||||
use console::{Key, Term, style};
|
||||
use notify_rust::{Notification, Timeout};
|
||||
use rust_i18n::t;
|
||||
use tracing::{debug, error};
|
||||
|
||||
@@ -11,8 +11,8 @@ use tracing::{debug, error};
|
||||
use tracing_subscriber::layer::SubscriberExt;
|
||||
use tracing_subscriber::reload::{Handle, Layer};
|
||||
use tracing_subscriber::util::SubscriberInitExt;
|
||||
use tracing_subscriber::{fmt, Registry};
|
||||
use tracing_subscriber::{registry, EnvFilter};
|
||||
use tracing_subscriber::{EnvFilter, registry};
|
||||
use tracing_subscriber::{Registry, fmt};
|
||||
|
||||
use crate::command::CommandExt;
|
||||
use crate::config::DEFAULT_LOG_LEVEL;
|
||||
@@ -218,7 +218,7 @@ pub mod merge_strategies {
|
||||
where
|
||||
T: Merge,
|
||||
{
|
||||
if let Some(ref mut left_inner) = left {
|
||||
if let Some(left_inner) = left {
|
||||
if let Some(right_inner) = right {
|
||||
left_inner.merge(right_inner);
|
||||
}
|
||||
@@ -228,7 +228,7 @@ pub mod merge_strategies {
|
||||
}
|
||||
|
||||
pub fn commands_merge_opt(left: &mut Option<Commands>, right: Option<Commands>) {
|
||||
if let Some(ref mut left_inner) = left {
|
||||
if let Some(left_inner) = left {
|
||||
if let Some(right_inner) = right {
|
||||
left_inner.extend(right_inner);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user