Compare commits

...

72 Commits

Author SHA1 Message Date
Taiki Endo
8faf1ae00d Release 2.34.3 2024-06-05 00:08:52 +09:00
John Vandenberg
6ebd8c0cb0 Generate TOOLS.md header/footer (#504) 2024-06-04 21:59:23 +09:00
Taiki Endo
e59163289d Update biome@latest to 1.8.0 2024-06-04 21:38:09 +09:00
Taiki Endo
03897c74e4 Tweak docs 2024-06-04 04:03:00 +09:00
John Vandenberg
d7080cb663 Generate Markdown table of tools (#473) 2024-06-04 03:56:04 +09:00
Taiki Endo
9b00020f6f Release 2.34.2 2024-06-04 03:26:16 +09:00
Taiki Endo
2c14471598 tools: Update tidy.sh 2024-06-04 03:26:03 +09:00
Taiki Endo
544b987e85 Update typos@latest to 1.22.0 2024-06-04 03:13:11 +09:00
Taiki Endo
1014a1e7a6 Release 2.34.1 2024-06-03 22:18:17 +09:00
Taiki Endo
df03a8f339 tools: Update tidy.sh 2024-06-03 21:58:51 +09:00
Taiki Endo
1bd25cfd26 Update git-cliff@latest to 2.3.0 2024-06-03 21:50:37 +09:00
Taiki Endo
4e38715ddc Release 2.34.0 2024-06-02 01:14:31 +09:00
Taiki Endo
2d4372270d Support cargo-binstall fallback without cargo 2024-06-02 01:13:32 +09:00
Taiki Endo
e5240ce0c5 Release 2.33.36 2024-06-02 00:14:03 +09:00
Taiki Endo
cd2b50cd20 Update cargo-llvm-cov@latest to 0.6.10 2024-06-02 00:12:05 +09:00
Taiki Endo
08b0c77d33 Update cspell dictionary 2024-05-31 00:23:30 +09:00
Taiki Endo
51b8ba088c Release 2.33.35 2024-05-29 03:20:16 +09:00
Taiki Endo
c46ebac92e Ignore more lints at workspace level 2024-05-29 03:15:59 +09:00
Taiki Endo
6058afcbf2 Update syft@latest to 1.5.0 2024-05-29 03:11:44 +09:00
Taiki Endo
60784cb1f4 Release 2.33.34 2024-05-27 08:51:32 +09:00
Taiki Endo
ccdec58fd9 Update dprint@latest to 0.46.1 2024-05-27 06:11:24 +09:00
Taiki Endo
c2bb13fe14 Release 2.33.33 2024-05-26 01:57:00 +09:00
Taiki Endo
5730b40ec8 Update dprint@latest to 0.46.0 2024-05-26 00:11:08 +09:00
Taiki Endo
70765aab52 Release 2.33.32 2024-05-25 21:15:55 +09:00
Taiki Endo
980709d4ed Update just@latest to 1.27.0 2024-05-25 21:13:14 +09:00
Taiki Endo
9c2797b8f2 Release 2.33.31 2024-05-25 13:45:15 +09:00
Taiki Endo
c3531c890e Update cargo-binstall@latest to 1.6.8 2024-05-25 12:12:56 +09:00
Taiki Endo
e529e9af03 Update sccache@latest to 0.8.1 2024-05-25 09:25:41 +09:00
Taiki Endo
2190a018e8 Release 2.33.30 2024-05-25 00:05:30 +09:00
Taiki Endo
f1a3491ca4 Update cargo-deny@latest to 0.14.24 2024-05-24 18:13:39 +09:00
Taiki Endo
7491b90053 Release 2.33.29 2024-05-24 04:58:55 +09:00
Taiki Endo
036b36b819 Update protoc@latest to 3.27.0 2024-05-24 04:46:04 +09:00
Taiki Endo
0f35150a34 Ignore buggy clippy::lint_groups_priority lint
https://github.com/rust-lang/rust-clippy/issues/12270

```
error: lint group `rust_2018_idioms` has the same priority (0) as a lint
  --> Cargo.toml:11:1
   |
11 | rust_2018_idioms = "warn"
   | ^^^^^^^^^^^^^^^^   ------ has an implicit priority of 0
12 | single_use_lifetimes = "warn"
   | -------------------- has the same priority as this lint
   |
   = note: the order of the lints in the table is ignored by Cargo
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#lint_groups_priority
   = note: `-D clippy::lint-groups-priority` implied by `-D warnings`
   = help: to override `-D warnings` add `#[allow(clippy::lint_groups_priority)]`
help: to have lints override the group set `rust_2018_idioms` to a lower priority
   |
11 | rust_2018_idioms = { level = "warn", priority = -1 }
   |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error: lint group `all` has the same priority (0) as a lint
  --> Cargo.toml:16:1
   |
16 | all = "warn" # Downgrade deny-by-default lints
   | ^^^   ------ has an implicit priority of 0
17 | pedantic = "warn"
18 | as_ptr_cast_mut = "warn"
   | --------------- has the same priority as this lint
   |
   = note: the order of the lints in the table is ignored by Cargo
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#lint_groups_priority
help: to have lints override the group set `all` to a lower priority
   |
16 | all = { level = "warn", priority = -1 } # Downgrade deny-by-default lints
   |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error: lint group `pedantic` has the same priority (0) as a lint
  --> Cargo.toml:17:1
   |
17 | pedantic = "warn"
   | ^^^^^^^^   ------ has an implicit priority of 0
18 | as_ptr_cast_mut = "warn"
   | --------------- has the same priority as this lint
   |
   = note: the order of the lints in the table is ignored by Cargo
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#lint_groups_priority
help: to have lints override the group set `pedantic` to a lower priority
   |
17 | pedantic = { level = "warn", priority = -1 }
   |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
2024-05-24 04:40:55 +09:00
Taiki Endo
4fedbddde8 Release 2.33.28 2024-05-23 03:28:12 +09:00
Taiki Endo
20f466fa6b Update wasmtime@latest to 21.0.1 2024-05-23 03:12:49 +09:00
Taiki Endo
0fc560009a Release 2.33.27 2024-05-21 10:16:19 +09:00
Taiki Endo
8eb922d4a7 Update wasmtime@latest to 21.0.0 2024-05-21 06:10:49 +09:00
Taiki Endo
689459d9ff Release 2.33.26 2024-05-19 22:09:09 +09:00
Taiki Endo
c9ca4b7c7b Update cargo-careful@latest to 0.4.2 2024-05-19 22:01:05 +09:00
John Vandenberg
68c5e86b83 codegen: Avoid using GITHUB_TOKEN with crates.io (#484) 2024-05-19 11:54:42 +09:00
John Vandenberg
d722dd2b73 codegen: Allow skipping existing versions (#485) 2024-05-19 11:51:47 +09:00
Taiki Endo
3c93f2e2e2 Release 2.33.25 2024-05-18 19:02:10 +09:00
Taiki Endo
4f17488f44 Update cargo-binstall@latest to 1.6.7 2024-05-18 18:11:25 +09:00
Taiki Endo
fce5fd6127 Release 2.33.24 2024-05-17 22:17:08 +09:00
Taiki Endo
e7cd6f10dc Update mdbook@latest to 0.4.40 2024-05-17 12:23:54 +09:00
Taiki Endo
2f990e9c48 Release 2.33.23 2024-05-14 15:16:34 +09:00
Taiki Endo
2791c528e4 Update just@latest to 1.26.0 2024-05-14 15:14:11 +09:00
Taiki Endo
c2927f0c5b Release 2.33.22 2024-05-12 10:06:47 +09:00
Taiki Endo
1ae6b4aac2 Update git-cliff@latest to 2.2.2 2024-05-12 06:37:46 +09:00
Taiki Endo
d4c31008b2 Release 2.33.21 2024-05-11 20:06:12 +09:00
Taiki Endo
55d8cef422 Update cargo-binstall@latest to 1.6.6 2024-05-11 15:12:42 +09:00
Taiki Endo
685948ac6a Update cargo-tarpaulin@latest to 0.30.0 2024-05-11 09:26:01 +09:00
Taiki Endo
0eaa33a7ad Release 2.33.20 2024-05-10 08:28:33 +09:00
Taiki Endo
ffe829f559 Update syft@latest to 1.4.1 2024-05-10 06:13:55 +09:00
Taiki Endo
3342907307 Release 2.33.19 2024-05-08 20:21:43 +09:00
Taiki Endo
56635f62d1 Update cargo-tarpaulin@latest to 0.29.2 2024-05-08 18:11:17 +09:00
Taiki Endo
040f0ebba5 Release 2.33.18 2024-05-08 10:36:40 +09:00
Taiki Endo
1a42fe4b6d Update wasmtime@latest to 20.0.2 2024-05-08 06:13:30 +09:00
Taiki Endo
6608b29f1f Release 2.33.17 2024-05-06 22:00:37 +09:00
Taiki Endo
4512171af8 Update biome@latest to 1.7.3 2024-05-06 21:19:19 +09:00
Taiki Endo
672949f0e9 Release 2.33.16 2024-05-04 18:11:55 +09:00
Taiki Endo
ac1dc7f25e Update cargo-make@latest to 0.37.12 2024-05-04 18:10:46 +09:00
Taiki Endo
b635b8d3ea Release 2.33.15 2024-05-04 10:17:37 +09:00
Taiki Endo
4bb58959fb Update wasmtime@latest to 20.0.1 2024-05-04 03:14:25 +09:00
Taiki Endo
22c308f3b9 Release 2.33.14 2024-05-04 01:09:10 +09:00
Taiki Endo
7bcbbdbff4 Support cargo-deny on aarch64 Linux 2024-05-04 01:06:25 +09:00
Taiki Endo
0884b6d9b6 Update cargo-deny@latest to 0.14.23 2024-05-04 00:13:36 +09:00
Taiki Endo
fb6a8a29a7 Release 2.33.13 2024-05-03 18:17:49 +09:00
Taiki Endo
8de347c29f Update cargo-tarpaulin@latest to 0.29.1 2024-05-03 18:16:49 +09:00
Taiki Endo
b780471fc3 Update cargo-binstall@latest to 1.6.5 2024-05-03 18:16:49 +09:00
Taiki Endo
af5d802f13 Release 2.33.12 2024-05-02 08:44:00 +09:00
Taiki Endo
82f5b44fad Update cargo-tarpaulin@latest to 0.29.0 2024-05-02 06:11:39 +09:00
70 changed files with 1898 additions and 592 deletions

View File

@@ -44,7 +44,7 @@
"languageSettings": [
{
"languageId": ["*"],
"dictionaries": ["rust"]
"dictionaries": ["bash", "rust"]
}
],
"ignorePaths": []

View File

@@ -22,7 +22,6 @@ pwsh
quickinstall
rdme
sccache
shfmt
syft
udeps
wasmtime

View File

@@ -66,10 +66,10 @@ jobs:
tool: ${{ steps.tool-list.outputs.tool }}
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell
- name: Test bash
run: just --version; shfmt --version; protoc --version
run: just --version && shfmt --version && protoc --version
shell: bash
- name: Test sh
run: just --version; shfmt --version; protoc --version
run: just --version && shfmt --version && protoc --version
shell: sh
if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos')
- name: Test pwsh
@@ -118,29 +118,8 @@ jobs:
timeout-minutes: 60
container: ${{ matrix.container }}
steps:
- name: Install requirements (ubuntu/debian)
run: |
set -eEuxo pipefail
apt-get -o Acquire::Retries=10 -qq update
apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends cargo
if: startsWith(matrix.container, 'ubuntu') || startsWith(matrix.container, 'debian')
- name: Install requirements (fedora/almalinux/centos)
run: |
set -eEuxo pipefail
curl --proto '=https' --tlsv1.2 -fsSL --retry 10 https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable --no-modify-path
echo "$HOME/.cargo/bin" >>"${GITHUB_PATH}"
if: startsWith(matrix.container, 'fedora') || startsWith(matrix.container, 'almalinux') || startsWith(matrix.container, 'centos')
- name: Install requirements (opensuse)
run: |
set -eEuxo pipefail
zypper install -y rustup
rustup toolchain add stable --profile minimal
if: startsWith(matrix.container, 'opensuse')
- name: Install requirements (archlinux)
run: pacman -Sy --noconfirm rust
if: startsWith(matrix.container, 'archlinux')
- name: Install requirements (alpine)
run: apk --no-cache add bash cargo
run: apk --no-cache add bash
shell: sh
if: startsWith(matrix.container, 'alpine')
- uses: taiki-e/checkout-action@v1
@@ -153,19 +132,6 @@ jobs:
with:
tool: ${{ steps.tool-list.outputs.tool }}
test-no-cargo:
runs-on: ubuntu-latest
timeout-minutes: 60
container: ubuntu
steps:
- uses: taiki-e/checkout-action@v1
- name: Generate tool list
id: tool-list
run: tools/ci/tool-list.sh >>"${GITHUB_OUTPUT}"
- uses: ./
with:
tool: ${{ steps.tool-list.outputs.tool }}
manifest:
runs-on: ubuntu-latest
timeout-minutes: 60

View File

@@ -10,6 +10,130 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
## [Unreleased]
## [2.34.3] - 2024-06-04
- Update `biome@latest` to 1.8.0.
## [2.34.2] - 2024-06-03
- Update `typos@latest` to 1.22.0.
## [2.34.1] - 2024-06-03
- Update `git-cliff@latest` to 2.3.0.
## [2.34.0] - 2024-06-01
- Support cargo-binstall fallback without cargo.
## [2.33.36] - 2024-06-01
- Update `cargo-llvm-cov@latest` to 0.6.10.
## [2.33.35] - 2024-05-28
- Update `syft@latest` to 1.5.0.
## [2.33.34] - 2024-05-26
- Update `dprint@latest` to 0.46.1.
## [2.33.33] - 2024-05-25
- Update `dprint@latest` to 0.46.0.
## [2.33.32] - 2024-05-25
- Update `just@latest` to 1.27.0.
## [2.33.31] - 2024-05-25
- Update `cargo-binstall@latest` to 1.6.8.
- Update `sccache@latest` to 0.8.1.
## [2.33.30] - 2024-05-24
- Update `cargo-deny@latest` to 0.14.24.
## [2.33.29] - 2024-05-23
- Update `protoc@latest` to 3.27.0.
## [2.33.28] - 2024-05-22
- Update `wasmtime@latest` to 21.0.1.
## [2.33.27] - 2024-05-21
- Update `wasmtime@latest` to 21.0.0.
## [2.33.26] - 2024-05-19
- Update `cargo-careful@latest` to 0.4.2.
## [2.33.25] - 2024-05-18
- Update `cargo-binstall@latest` to 1.6.7.
## [2.33.24] - 2024-05-17
- Update `mdbook@latest` to 0.4.40.
## [2.33.23] - 2024-05-14
- Update `just@latest` to 1.26.0.
## [2.33.22] - 2024-05-12
- Update `git-cliff@latest` to 2.2.2.
## [2.33.21] - 2024-05-11
- Update `cargo-binstall@latest` to 1.6.6.
- Update `cargo-tarpaulin@latest` to 0.30.0.
## [2.33.20] - 2024-05-09
- Update `syft@latest` to 1.4.1.
## [2.33.19] - 2024-05-08
- Update `cargo-tarpaulin@latest` to 0.29.2.
## [2.33.18] - 2024-05-08
- Update `wasmtime@latest` to 20.0.2.
## [2.33.17] - 2024-05-06
- Update `biome@latest` to 1.7.3.
## [2.33.16] - 2024-05-04
- Update `cargo-make@latest` to 0.37.12.
## [2.33.15] - 2024-05-04
- Update `wasmtime@latest` to 20.0.1.
## [2.33.14] - 2024-05-03
- Update `cargo-deny@latest` to 0.14.23.
- Support `cargo-deny` on aarch64 Linux.
## [2.33.13] - 2024-05-03
- Update `cargo-tarpaulin@latest` to 0.29.1.
- Update `cargo-binstall@latest` to 1.6.5.
## [2.33.12] - 2024-05-01
- Update `cargo-tarpaulin@latest` to 0.29.0.
## [2.33.11] - 2024-04-30
- Update `typos@latest` to 1.21.0.
@@ -2119,7 +2243,36 @@ Note: This release is considered a breaking change because installing on version
Initial release
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.33.11...HEAD
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.34.3...HEAD
[2.34.3]: https://github.com/taiki-e/install-action/compare/v2.34.2...v2.34.3
[2.34.2]: https://github.com/taiki-e/install-action/compare/v2.34.1...v2.34.2
[2.34.1]: https://github.com/taiki-e/install-action/compare/v2.34.0...v2.34.1
[2.34.0]: https://github.com/taiki-e/install-action/compare/v2.33.36...v2.34.0
[2.33.36]: https://github.com/taiki-e/install-action/compare/v2.33.35...v2.33.36
[2.33.35]: https://github.com/taiki-e/install-action/compare/v2.33.34...v2.33.35
[2.33.34]: https://github.com/taiki-e/install-action/compare/v2.33.33...v2.33.34
[2.33.33]: https://github.com/taiki-e/install-action/compare/v2.33.32...v2.33.33
[2.33.32]: https://github.com/taiki-e/install-action/compare/v2.33.31...v2.33.32
[2.33.31]: https://github.com/taiki-e/install-action/compare/v2.33.30...v2.33.31
[2.33.30]: https://github.com/taiki-e/install-action/compare/v2.33.29...v2.33.30
[2.33.29]: https://github.com/taiki-e/install-action/compare/v2.33.28...v2.33.29
[2.33.28]: https://github.com/taiki-e/install-action/compare/v2.33.27...v2.33.28
[2.33.27]: https://github.com/taiki-e/install-action/compare/v2.33.26...v2.33.27
[2.33.26]: https://github.com/taiki-e/install-action/compare/v2.33.25...v2.33.26
[2.33.25]: https://github.com/taiki-e/install-action/compare/v2.33.24...v2.33.25
[2.33.24]: https://github.com/taiki-e/install-action/compare/v2.33.23...v2.33.24
[2.33.23]: https://github.com/taiki-e/install-action/compare/v2.33.22...v2.33.23
[2.33.22]: https://github.com/taiki-e/install-action/compare/v2.33.21...v2.33.22
[2.33.21]: https://github.com/taiki-e/install-action/compare/v2.33.20...v2.33.21
[2.33.20]: https://github.com/taiki-e/install-action/compare/v2.33.19...v2.33.20
[2.33.19]: https://github.com/taiki-e/install-action/compare/v2.33.18...v2.33.19
[2.33.18]: https://github.com/taiki-e/install-action/compare/v2.33.17...v2.33.18
[2.33.17]: https://github.com/taiki-e/install-action/compare/v2.33.16...v2.33.17
[2.33.16]: https://github.com/taiki-e/install-action/compare/v2.33.15...v2.33.16
[2.33.15]: https://github.com/taiki-e/install-action/compare/v2.33.14...v2.33.15
[2.33.14]: https://github.com/taiki-e/install-action/compare/v2.33.13...v2.33.14
[2.33.13]: https://github.com/taiki-e/install-action/compare/v2.33.12...v2.33.13
[2.33.12]: https://github.com/taiki-e/install-action/compare/v2.33.11...v2.33.12
[2.33.11]: https://github.com/taiki-e/install-action/compare/v2.33.10...v2.33.11
[2.33.10]: https://github.com/taiki-e/install-action/compare/v2.33.9...v2.33.10
[2.33.9]: https://github.com/taiki-e/install-action/compare/v2.33.8...v2.33.9

View File

@@ -10,6 +10,8 @@ improper_ctypes_definitions = "warn"
non_ascii_idents = "warn"
rust_2018_idioms = "warn"
single_use_lifetimes = "warn"
unexpected_cfgs = { level = "warn", check-cfg = [
] }
unreachable_pub = "warn"
unsafe_op_in_unsafe_fn = "warn"
[workspace.lints.clippy]
@@ -27,11 +29,13 @@ borrow_as_ptr = { level = "allow", priority = 1 } # https://github.com/rust-lang
declare_interior_mutable_const = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/7665
doc_markdown = { level = "allow", priority = 1 }
float_cmp = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/7725
incompatible_msrv = { level = "allow", priority = 1 } # buggy: doesn't consider cfg, https://github.com/rust-lang/rust-clippy/issues/12280, https://github.com/rust-lang/rust-clippy/issues/12257#issuecomment-2093667187
lint_groups_priority = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/12270
manual_assert = { level = "allow", priority = 1 }
manual_range_contains = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/6455#issuecomment-1225966395
missing_errors_doc = { level = "allow", priority = 1 }
module_name_repetitions = { level = "allow", priority = 1 }
nonminimal_bool = { level = "allow", priority = 1 } # buggy https://github.com/rust-lang/rust-clippy/issues?q=is%3Aissue+is%3Aopen+nonminimal_bool
nonminimal_bool = { level = "allow", priority = 1 } # buggy: https://github.com/rust-lang/rust-clippy/issues?q=is%3Aissue+is%3Aopen+nonminimal_bool
similar_names = { level = "allow", priority = 1 }
single_match = { level = "allow", priority = 1 }
single_match_else = { level = "allow", priority = 1 }

View File

@@ -4,13 +4,11 @@
(Example: [ffbd316](https://github.com/taiki-e/install-action/commit/ffbd316e0fe98cb460dae3a66cd2ef9deb398bb1))
1\. Add tool name to the table in ["Supported tools" section in `README.md`](https://github.com/taiki-e/install-action#supported-tools).
2\. Add base manifest to [`tools/codegen/base`](tools/codegen/base) directory.
1\. Add base manifest to [`tools/codegen/base`](tools/codegen/base) directory.
See JSON files in `tools/codegen/base` directory for examples of the manifest.
3\. Generate manifest with the following command (replace `<tool>` with the tool name).
2\. Generate manifest with the following command (replace `<tool>` with the tool name).
```sh
./tools/manifest.sh <tool>
@@ -23,6 +21,14 @@ See JSON files in `tools/codegen/base` directory for examples of the manifest.
> GITHUB_TOKEN=$(gh auth status --show-token 2>&1 | sed -n 's/^.*Token: \(.*\)$/\1/p') ./tools/manifest.sh <tool>
> ```
## Refresh TOOLS.md
To update `TOOLS.md`, run
```sh
./tools/update-markdown.sh
```
## Troubleshooting
If one of the CI builds fails due to a bin path or release asset_name, fix the problem in the base

View File

@@ -1,3 +1,4 @@
<!-- omit in toc -->
# install-action
[![release](https://img.shields.io/github/release/taiki-e/install-action?style=flat-square&logo=github)](https://github.com/taiki-e/install-action/releases/latest)
@@ -74,63 +75,9 @@ Or:
## Supported tools
<!--
License should use SPDX license identifiers.
https://spdx.org/licenses
-->
See [TOOLS.md](TOOLS.md) for the list of tools that are installed from manifests managed in this action.
| Name | Where binaries will be installed | Where will it be installed from | Supported platform | License |
| ---- | -------------------------------- | ------------------------------- | ------------------ | ------- |
| [**biome**](https://biomejs.dev)| `/usr/local/bin` | [GitHub Releases](https://github.com/biomejs/biome/releases) | Linux, macOS, Windows | [MIT](https://github.com/biomejs/biome/blob/HEAD/LICENSE) |
| [**cargo-audit**](https://github.com/rustsec/rustsec/tree/HEAD/cargo-audit) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustsec/rustsec/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-APACHE) OR [MIT](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-MIT) |
| [**cargo-binstall**][cargo-binstall] | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/cargo-bins/cargo-binstall/releases) | Linux, macOS, Windows | [GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE) |
| [**cargo-careful**](https://github.com/RalfJung/cargo-careful) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/RalfJung/cargo-careful/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/RalfJung/cargo-careful/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/RalfJung/cargo-careful/blob/HEAD/LICENSE-MIT) |
| [**cargo-cyclonedx**](https://github.com/CycloneDX/cyclonedx-rust-cargo) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/CycloneDX/cyclonedx-rust-cargo/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/CycloneDX/cyclonedx-rust-cargo/blob/HEAD/LICENSE) |
| [**cargo-deny**](https://github.com/EmbarkStudios/cargo-deny) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/EmbarkStudios/cargo-deny/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/EmbarkStudios/cargo-deny/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/EmbarkStudios/cargo-deny/blob/HEAD/LICENSE-MIT) |
| [**cargo-dinghy**](https://github.com/sonos/dinghy) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sonos/dinghy/releases) | Linux, macOS | [Apache-2.0](https://github.com/sonos/dinghy/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/sonos/dinghy/blob/HEAD/LICENSE-MIT) |
| [**cargo-export**](https://github.com/bazhenov/cargo-export) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bazhenov/cargo-export/releases) | Linux, macOS, Windows | [MIT](https://github.com/bazhenov/cargo-export/blob/HEAD/LICENSE) |
| [**cargo-hack**](https://github.com/taiki-e/cargo-hack) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-hack/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-hack/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-hack/blob/HEAD/LICENSE-MIT) |
| [**cargo-llvm-cov**](https://github.com/taiki-e/cargo-llvm-cov) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-llvm-cov/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-llvm-cov/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-llvm-cov/blob/HEAD/LICENSE-MIT) |
| [**cargo-machete**](https://github.com/bnjbvr/cargo-machete) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bnjbvr/cargo-machete/releases) | Linux, macOS, Windows | [MIT](https://github.com/bnjbvr/cargo-machete/blob/HEAD/LICENSE.md) |
| [**cargo-make**](https://github.com/sagiegurari/cargo-make) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sagiegurari/cargo-make/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/sagiegurari/cargo-make/blob/HEAD/LICENSE) |
| [**cargo-minimal-versions**](https://github.com/taiki-e/cargo-minimal-versions) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-minimal-versions/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-minimal-versions/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-minimal-versions/blob/HEAD/LICENSE-MIT) |
| [**cargo-no-dev-deps**](https://github.com/taiki-e/cargo-no-dev-deps) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-no-dev-deps/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-no-dev-deps/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-no-dev-deps/blob/HEAD/LICENSE-MIT) |
| [**cargo-rdme**](https://github.com/orium/cargo-rdme) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/orium/cargo-rdme/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/orium/cargo-rdme/blob/HEAD/LICENSE.md) |
| [**cargo-sort**](https://github.com/DevinR528/cargo-sort) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/DevinR528/cargo-sort/releases) | Linux, macOS, Windows | [Apache-2.0 OR MIT](https://github.com/DevinR528/cargo-sort/blob/55ec89082466f6bb246d870a8d56d166a8e1f08b/Cargo.toml#L5) |
| [**cargo-spellcheck**](https://github.com/drahnr/cargo-spellcheck) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/drahnr/cargo-spellcheck/releases) | Linux and Windows | [LGPLv2.1](https://github.com/drahnr/cargo-spellcheck/blob/f60c81ad0134c12faf08715f08d14f66e749f6e7/docs/checkers.md#nlprules) |
| [**cargo-tarpaulin**](https://github.com/xd009642/tarpaulin) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/xd009642/tarpaulin/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/xd009642/tarpaulin/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/xd009642/tarpaulin/blob/HEAD/LICENSE-MIT) |
| [**cargo-udeps**](https://github.com/est31/cargo-udeps) | `$CARGO_HOME/bin` | [GitHub Release](https://github.com/est31/cargo-udeps/releases) | Linux, macOS, Windows | [Apache-2.0 OR MIT](https://github.com/est31/cargo-udeps/blob/HEAD/LICENSE) |
| [**cargo-valgrind**](https://github.com/jfrimmel/cargo-valgrind) | `$CARGO_HOME/bin` | [GitHub Release](https://github.com/jfrimmel/cargo-valgrind/releases) | Linux, macOS, Windows | [MIT](https://github.com/jfrimmel/cargo-valgrind/blob/HEAD/LICENSE-MIT) or [Apache-2.0](https://github.com/jfrimmel/cargo-valgrind/blob/HEAD/LICENSE-APACHE) |
| [**cross**](https://github.com/cross-rs/cross) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/cross-rs/cross/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/cross-rs/cross/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/cross-rs/cross/blob/HEAD/LICENSE-MIT) |
| [**dprint**](https://github.com/dprint/dprint) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/dprint/dprint/releases) | Linux, macOS, Windows | [MIT](https://github.com/dprint/dprint/blob/HEAD/LICENSE) |
| [**espup**](https://github.com/esp-rs/espup) | `$CARGO_HOME/bin` | [GitHub Release](https://github.com/esp-rs/espup/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/esp-rs/espup/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/esp-rs/espup/blob/HEAD/LICENSE-MIT) |
| [**git-cliff**](https://github.com/orhun/git-cliff) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/orhun/git-cliff/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/orhun/git-cliff/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/orhun/git-cliff/blob/HEAD/LICENSE-MIT) |
| [**grcov**](https://github.com/mozilla/grcov) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/mozilla/grcov/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/mozilla/grcov/blob/HEAD/LICENSE-MPL-2.0) |
| [**hyperfine**](https://github.com/sharkdp/hyperfine) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sharkdp/hyperfine/releases) | Linux, macOS, Windows | [MIT](https://github.com/sharkdp/hyperfine/blob/HEAD/LICENSE-MIT) or [Apache-2.0](https://github.com/sharkdp/hyperfine/blob/HEAD/LICENSE-APACHE) |
| [**just**](https://github.com/casey/just) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/casey/just/releases) | Linux, macOS, Windows | [CC0-1.0](https://github.com/casey/just/blob/HEAD/LICENSE) |
| [**mdbook-linkcheck**](https://github.com/Michael-F-Bryan/mdbook-linkcheck) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases) | Linux, macOS, Windows | [MIT](https://github.com/Michael-F-Bryan/mdbook-linkcheck/blob/HEAD/LICENSE) |
| [**mdbook**](https://github.com/rust-lang/mdBook) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rust-lang/mdBook/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/rust-lang/mdBook/blob/HEAD/LICENSE) |
| [**nextest**](https://github.com/nextest-rs/nextest) (alias: `cargo-nextest`) | `$CARGO_HOME/bin` | cargo-binstall | Linux, macOS, Windows | [Apache-2.0](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-MIT) |
| [**osv-scanner**]( https://github.com/google/osv-scanner) | `/usr/local/bin` | [GitHub Releases]( https://github.com/google/osv-scanner/releases) | Linux, macOS, Windows | [Apache-2](https://github.com/google/osv-scanner/blob/HEAD/LICENSE) |
| [**parse-changelog**](https://github.com/taiki-e/parse-changelog) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/parse-changelog/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/parse-changelog/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/parse-changelog/blob/HEAD/LICENSE-MIT) |
| [**protoc**](https://github.com/protocolbuffers/protobuf) | `$HOME/.install-action/bin` | [GitHub Releases](https://github.com/protocolbuffers/protobuf/releases) | Linux, macOS, Windows | [BSD-3-Clause](https://github.com/protocolbuffers/protobuf/blob/HEAD/LICENSE) |
| [**sccache**](https://github.com/mozilla/sccache) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/mozilla/sccache/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/mozilla/sccache/blob/HEAD/LICENSE) |
| [**shellcheck**](https://www.shellcheck.net) | `/usr/local/bin` | [GitHub Releases](https://github.com/koalaman/shellcheck/releases) | Linux, macOS, Windows | [GPL-3.0-or-later](https://github.com/koalaman/shellcheck/blob/HEAD/LICENSE) |
| [**shfmt**](https://github.com/mvdan/sh) | `/usr/local/bin` | [GitHub Releases](https://github.com/mvdan/sh/releases) | Linux, macOS, Windows | [BSD-3-Clause](https://github.com/mvdan/sh/blob/HEAD/LICENSE) |
| [**syft**](https://github.com/anchore/syft) | `/usr/local/bin` | [Github Releases](https://github.com/anchore/syft/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/anchore/syft/blob/HEAD/LICENSE) |
| [**typos**](https://github.com/crate-ci/typos) | `$CARGO_HOME/bin` | [Github Releases](https://github.com/crate-ci/typos/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/crate-ci/typos/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/crate-ci/typos/blob/HEAD/LICENSE-MIT) |
| [**valgrind**](https://valgrind.org) | `/snap/bin` | [snap](https://snapcraft.io/install/valgrind/ubuntu) | Linux | [GPL-2.0-or-later](https://valgrind.org/docs/manual/license.gpl.html) |
| [**wasm-bindgen**](https://github.com/rustwasm/wasm-bindgen) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustwasm/wasm-bindgen/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/rustwasm/wasm-bindgen/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/rustwasm/wasm-bindgen/blob/HEAD/LICENSE-MIT) |
| [**wasm-pack**](https://github.com/rustwasm/wasm-pack) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustwasm/wasm-pack/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/rustwasm/wasm-pack/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/rustwasm/wasm-pack/blob/HEAD/LICENSE-MIT) |
| [**wasmtime**](https://github.com/bytecodealliance/wasmtime) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bytecodealliance/wasmtime/releases) | Linux, macOS, Windows | [Apache-2.0 WITH LLVM-exception](https://github.com/bytecodealliance/wasmtime/blob/HEAD/LICENSE) |
| [**xbuild**](https://github.com/rust-mobile/xbuild) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rust-mobile/xbuild/releases) | Linux, macOS, Windows | Apache-2.0 OR MIT |
| [**zola**](https://github.com/getzola/zola) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/getzola/zola/releases) | Linux, macOS, Windows | [MIT](https://github.com/getzola/zola/blob/HEAD/LICENSE) |
If `$CARGO_HOME/bin` is not available, Rust-related binaries will be installed to `$HOME/.cargo/bin`.<br>
If `$HOME/.cargo/bin` is not available, Rust-related binaries will be installed to `/usr/local/bin`.<br>
If `/usr/local/bin` is not available, binaries will be installed to `$HOME/.install-action/bin`.<br>
**If a tool not included in the list above is specified, this action uses [cargo-binstall] as a fallback.**
If a tool not included in the list above is specified, this action uses [cargo-binstall] as a fallback.
### Add support for new tool
@@ -152,7 +99,6 @@ This action has been tested for GitHub-hosted runners (Ubuntu, macOS, Windows) a
To use this action in self-hosted runners or in containers, at least the following tools are required:
- bash
- cargo (if you use cargo-binstall fallback)
## Related Projects

59
TOOLS.md Normal file
View File

@@ -0,0 +1,59 @@
# Tools
This is a list of tools that are installed from manifests managed in this action.
If a tool not included in the list below is specified, this action uses [cargo-binstall] as a fallback.
> If `$CARGO_HOME/bin` is not available, Rust-related binaries will be installed to `$HOME/.cargo/bin`.<br>
> If `$HOME/.cargo/bin` is not available, Rust-related binaries will be installed to `/usr/local/bin`.<br>
> If `/usr/local/bin` is not available, binaries will be installed to `$HOME/.install-action/bin`.<br>
| Name | Where binaries will be installed | Where will it be installed from | Supported platform | License |
| ---- | -------------------------------- | ------------------------------- | ------------------ | ------- |
| [**biome**](https://biomejs.dev) | `/usr/local/bin` | [GitHub Releases](https://github.com/biomejs/biome/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/biomejs/biome/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/biomejs/biome/blob/main/LICENSE-MIT) |
| [**cargo-audit**](https://github.com/rustsec/rustsec/tree/HEAD/cargo-audit) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustsec/rustsec/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-APACHE) OR [MIT](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-MIT) |
| [**cargo-binstall**](https://github.com/cargo-bins/cargo-binstall) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/cargo-bins/cargo-binstall/releases) | Linux, macOS, Windows | [GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE) |
| [**cargo-careful**](https://github.com/RalfJung/cargo-careful) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/RalfJung/cargo-careful/releases) | Linux, macOS, Windows | [MIT](https://github.com/RalfJung/cargo-careful/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/RalfJung/cargo-careful/blob/master/LICENSE-APACHE) |
| [**cargo-cyclonedx**](https://github.com/CycloneDX/cyclonedx-rust-cargo) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/CycloneDX/cyclonedx-rust-cargo/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/CycloneDX/cyclonedx-rust-cargo/blob/main/LICENSE) |
| [**cargo-deny**](https://github.com/EmbarkStudios/cargo-deny) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/EmbarkStudios/cargo-deny/releases) | Linux, macOS, Windows | [MIT](https://github.com/EmbarkStudios/cargo-deny/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/EmbarkStudios/cargo-deny/blob/main/LICENSE-APACHE) |
| [**cargo-dinghy**](https://github.com/sonos/dinghy) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sonos/dinghy/releases) | Linux, macOS | [MIT](https://github.com/sonos/dinghy/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/sonos/dinghy/blob/main/LICENSE-APACHE) |
| [**cargo-export**](https://github.com/bazhenov/cargo-export) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bazhenov/cargo-export/releases) | Linux, macOS, Windows | [MIT](https://github.com/bazhenov/cargo-export/blob/master/LICENSE) |
| [**cargo-hack**](https://github.com/taiki-e/cargo-hack) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-hack/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-hack/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-hack/blob/main/LICENSE-MIT) |
| [**cargo-llvm-cov**](https://github.com/taiki-e/cargo-llvm-cov) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-llvm-cov/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-llvm-cov/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-llvm-cov/blob/main/LICENSE-MIT) |
| [**cargo-machete**](https://github.com/bnjbvr/cargo-machete) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bnjbvr/cargo-machete/releases) | Linux, macOS, Windows | [MIT](https://github.com/bnjbvr/cargo-machete/blob/main/LICENSE.md) |
| [**cargo-make**](https://github.com/sagiegurari/cargo-make) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sagiegurari/cargo-make/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/sagiegurari/cargo-make/blob/master/LICENSE) |
| [**cargo-minimal-versions**](https://github.com/taiki-e/cargo-minimal-versions) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-minimal-versions/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-minimal-versions/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-minimal-versions/blob/main/LICENSE-MIT) |
| [**cargo-no-dev-deps**](https://github.com/taiki-e/cargo-no-dev-deps) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/cargo-no-dev-deps/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/cargo-no-dev-deps/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-no-dev-deps/blob/main/LICENSE-MIT) |
| [**cargo-rdme**](https://github.com/orium/cargo-rdme) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/orium/cargo-rdme/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/orium/cargo-rdme/blob/main/LICENSE.md) |
| [**cargo-sort**](https://github.com/DevinR528/cargo-sort) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/DevinR528/cargo-sort/releases) | Linux, macOS, Windows | [Apache-2.0 OR MIT](https://github.com/DevinR528/cargo-sort/blob/55ec89082466f6bb246d870a8d56d166a8e1f08b/Cargo.toml#L5) |
| [**cargo-spellcheck**](https://github.com/drahnr/cargo-spellcheck) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/drahnr/cargo-spellcheck/releases) | Linux, Windows | [LGPLv2.1](https://github.com/drahnr/cargo-spellcheck/blob/master/LICENSE-LGPL) |
| [**cargo-tarpaulin**](https://github.com/xd009642/tarpaulin) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/xd009642/tarpaulin/releases) | Linux, macOS, Windows | [MIT](https://github.com/xd009642/tarpaulin/blob/develop/LICENSE-MIT) OR [Apache-2.0](https://github.com/xd009642/tarpaulin/blob/develop/LICENSE-APACHE) |
| [**cargo-udeps**](https://github.com/est31/cargo-udeps) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/est31/cargo-udeps/releases) | Linux, macOS, Windows | [Apache-2.0 OR MIT](https://github.com/est31/cargo-udeps/blob/HEAD/LICENSE) |
| [**cargo-valgrind**](https://github.com/jfrimmel/cargo-valgrind) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/jfrimmel/cargo-valgrind/releases) | Linux, macOS, Windows | [MIT](https://github.com/jfrimmel/cargo-valgrind/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/jfrimmel/cargo-valgrind/blob/master/LICENSE-APACHE) |
| [**cross**](https://github.com/cross-rs/cross) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/cross-rs/cross/releases) | Linux, macOS, Windows | [MIT](https://github.com/cross-rs/cross/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/cross-rs/cross/blob/main/LICENSE-APACHE) |
| [**dprint**](https://github.com/dprint/dprint) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/dprint/dprint/releases) | Linux, macOS, Windows | [MIT](https://github.com/dprint/dprint/blob/main/LICENSE) |
| [**editorconfig-checker**](https://github.com/editorconfig-checker/editorconfig-checker) | `/usr/local/bin` | [GitHub Releases](https://github.com/editorconfig-checker/editorconfig-checker/releases) | Linux, macOS, Windows | [MIT](https://github.com/editorconfig-checker/editorconfig-checker/blob/main/LICENSE) |
| [**espup**](https://github.com/esp-rs/espup) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/esp-rs/espup/releases) | Linux, macOS, Windows | [MIT](https://github.com/esp-rs/espup/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/esp-rs/espup/blob/main/LICENSE-APACHE) |
| [**git-cliff**](https://github.com/orhun/git-cliff) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/orhun/git-cliff/releases) | Linux, macOS, Windows | [MIT](https://github.com/orhun/git-cliff/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/orhun/git-cliff/blob/main/LICENSE-APACHE) |
| [**grcov**](https://github.com/mozilla/grcov) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/mozilla/grcov/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/mozilla/grcov/blob/HEAD/LICENSE-MPL-2.0) |
| [**hyperfine**](https://github.com/sharkdp/hyperfine) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/sharkdp/hyperfine/releases) | Linux, macOS, Windows | [MIT](https://github.com/sharkdp/hyperfine/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/sharkdp/hyperfine/blob/master/LICENSE-APACHE) |
| [**just**](https://github.com/casey/just) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/casey/just/releases) | Linux, macOS, Windows | [CC0-1.0](https://github.com/casey/just/blob/master/LICENSE) |
| [**mdbook**](https://github.com/rust-lang/mdBook) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rust-lang/mdBook/releases) | Linux, macOS, Windows | [MPL-2.0](https://github.com/rust-lang/mdBook/blob/master/LICENSE) |
| [**mdbook-linkcheck**](https://github.com/Michael-F-Bryan/mdbook-linkcheck) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases) | Linux, macOS, Windows | [MIT](https://github.com/Michael-F-Bryan/mdbook-linkcheck/blob/master/LICENSE) |
| [**nextest**](https://nexte.st/) (alias: `cargo-nextest`)| `$CARGO_HOME/bin` | `cargo-binstall` | Linux, macOS, Windows | [Apache-2.0](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-MIT) |
| [**osv-scanner**](https://github.com/google/osv-scanner) | `/usr/local/bin` | [GitHub Releases](https://github.com/google/osv-scanner/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/google/osv-scanner/blob/main/LICENSE) |
| [**parse-changelog**](https://github.com/taiki-e/parse-changelog) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/taiki-e/parse-changelog/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/taiki-e/parse-changelog/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/parse-changelog/blob/main/LICENSE-MIT) |
| [**protoc**](https://github.com/protocolbuffers/protobuf) | `/usr/local/bin` | [GitHub Releases](https://github.com/protocolbuffers/protobuf/releases) | Linux, macOS, Windows | [BSD-3-Clause](https://github.com/protocolbuffers/protobuf/blob/HEAD/LICENSE) |
| [**sccache**](https://github.com/mozilla/sccache) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/mozilla/sccache/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/mozilla/sccache/blob/main/LICENSE) |
| [**shellcheck**](https://www.shellcheck.net) | `/usr/local/bin` | [GitHub Releases](https://github.com/koalaman/shellcheck/releases) | Linux, macOS, Windows | [GPL-3.0](https://github.com/koalaman/shellcheck/blob/master/LICENSE) |
| [**shfmt**](https://github.com/mvdan/sh) | `/usr/local/bin` | [GitHub Releases](https://github.com/mvdan/sh/releases) | Linux, macOS, Windows | [BSD-3-Clause](https://github.com/mvdan/sh/blob/master/LICENSE) |
| [**syft**](https://github.com/anchore/syft) | `/usr/local/bin` | [GitHub Releases](https://github.com/anchore/syft/releases) | Linux, macOS, Windows | [Apache-2.0](https://github.com/anchore/syft/blob/main/LICENSE) |
| [**typos**](https://github.com/crate-ci/typos) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/crate-ci/typos/releases) | Linux, macOS, Windows | [MIT](https://github.com/crate-ci/typos/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/crate-ci/typos/blob/master/LICENSE-APACHE) |
| [**valgrind**](https://valgrind.org/) | `/snap/bin` | [snap](https://snapcraft.io/install/valgrind/ubuntu) | Linux | [GPL-2.0](https://sourceware.org/git/?p=valgrind.git;a=blob;f=COPYING;hb=HEAD) |
| [**wasm-bindgen**](https://github.com/rustwasm/wasm-bindgen) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustwasm/wasm-bindgen/releases) | Linux, macOS, Windows | [MIT](https://github.com/rustwasm/wasm-bindgen/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/rustwasm/wasm-bindgen/blob/main/LICENSE-APACHE) |
| [**wasm-pack**](https://github.com/rustwasm/wasm-pack) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rustwasm/wasm-pack/releases) | Linux, macOS, Windows | [MIT](https://github.com/rustwasm/wasm-pack/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/rustwasm/wasm-pack/blob/master/LICENSE-APACHE) |
| [**wasmtime**](https://github.com/bytecodealliance/wasmtime) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/bytecodealliance/wasmtime/releases) | Linux, macOS, Windows | [Apache-2.0 WITH LLVM-exception](https://github.com/bytecodealliance/wasmtime/blob/main/LICENSE) |
| [**xbuild**](https://github.com/rust-mobile/xbuild) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/rust-mobile/xbuild/releases) | Linux, macOS, Windows | [Apache-2.0 OR MIT](https://github.com/rust-mobile/xbuild/blob/268939a99a50d7927bce3e343e5d2ed32eb8b30e/xbuild/Cargo.toml#L7) |
| [**zola**](https://github.com/getzola/zola) | `$CARGO_HOME/bin` | [GitHub Releases](https://github.com/getzola/zola/releases) | Linux, macOS, Windows | [MIT](https://github.com/getzola/zola/blob/master/LICENSE) |
[cargo-binstall]: https://github.com/cargo-bins/cargo-binstall

View File

@@ -748,5 +748,11 @@ if [[ ${#unsupported_tools[@]} -gt 0 ]]; then
# By default, cargo-binstall enforce downloads over secure transports only.
# As a result, http will be disabled, and it will also set
# min tls version to be 1.2
cargo binstall --force --no-confirm --locked "${unsupported_tools[@]}"
cargo-binstall binstall --force --no-confirm --locked "${unsupported_tools[@]}"
if ! type -P cargo >/dev/null; then
_bin_dir=$(canonicalize_windows_path "${HOME}/.cargo/bin")
# TODO: avoid this when already added
info "adding '${_bin_dir}' to PATH"
echo "${_bin_dir}" >>"${GITHUB_PATH}"
fi
fi

50
manifests/biome.json generated
View File

@@ -34,14 +34,58 @@
"bin": "biome.exe"
}
},
"license_markdown": "[Apache-2.0](https://github.com/biomejs/biome/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/biomejs/biome/blob/main/LICENSE-MIT)",
"latest": {
"version": "1.7.2"
"version": "1.8.0"
},
"1": {
"version": "1.7.2"
"version": "1.8.0"
},
"1.8": {
"version": "1.8.0"
},
"1.8.0": {
"x86_64_linux_musl": {
"checksum": "02130f183b65583da5eb4cb8ca023c8565b5e8613904f65a8dd7f02755d66ee2"
},
"x86_64_macos": {
"checksum": "a42d7dc5642d15561b96bffd4a95ee8f644a90ba1d654fdeb1c7040e6d52d2ae"
},
"x86_64_windows": {
"checksum": "087de9c67effdf9d99ca9700d1a9b7fbefc0d493b5d328322524b4fbddda4a10"
},
"aarch64_linux_musl": {
"checksum": "806bce8f838139011f97942e0cb3dfe385858c7bdbbbbac4a2c128b4d7239a41"
},
"aarch64_macos": {
"checksum": "3ed5faee598c576b306d968f3da442e56e5710e05f146ca74182649ed1c94dd0"
},
"aarch64_windows": {
"checksum": "7f11c2bab3412e06b3c12232e1df3e68dbc5be104f889f1f2bba3aba9bb4db67"
}
},
"1.7": {
"version": "1.7.2"
"version": "1.7.3"
},
"1.7.3": {
"x86_64_linux_musl": {
"checksum": "f4c2db816081527e18f4219d4c2ee97f3613f9b04aa2c2480b97f85fd0b1c744"
},
"x86_64_macos": {
"checksum": "97541273ec677c3dc90cd43989a10f1437e9ca61c8ecc1340706a56b1490ca77"
},
"x86_64_windows": {
"checksum": "a44a6787eb664cd8977da4cfcbc58092c3b8b7e44419895944858dd1eae13855"
},
"aarch64_linux_musl": {
"checksum": "8495ff8f76a19a12779c43e49811f5eecb1c88e79e82de7bd61ab968062eca20"
},
"aarch64_macos": {
"checksum": "6c9ff5223173b71aaa12693451369c287e8f4e5625803a9ceefd815a9bb8a0c6"
},
"aarch64_windows": {
"checksum": "6f545f42e3b47f5489f75f30f309611e3ae470dd92e568e44311d2ee3ffdb3f9"
}
},
"1.7.2": {
"x86_64_linux_musl": {

View File

@@ -18,6 +18,7 @@
"bin": "cargo-audit-aarch64-unknown-linux-gnu-v${version}/cargo-audit"
}
},
"license_markdown": "[Apache-2.0](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-APACHE) OR [MIT](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-MIT)",
"latest": {
"version": "0.20.0"
},

View File

@@ -20,27 +20,28 @@
"url": "https://github.com/cargo-bins/cargo-binstall/releases/download/v${version}/cargo-binstall-aarch64-pc-windows-msvc.zip"
}
},
"license_markdown": "[GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE)",
"latest": {
"version": "1.6.4"
"version": "1.6.8"
},
"1.6.4": {
"1.6.8": {
"x86_64_linux_musl": {
"checksum": "b07160c21cdfcc24c3afe94b3cb12bf6d111cef7b218cce85a0c1dfae7e106dd"
"checksum": "581eb7c97b2767a468afb0505c416eb727b469c029b36470288fc30b26517101"
},
"x86_64_macos": {
"checksum": "761839db77de482f9bbddb87d43563f8308e7dbdccf2bb3c66f3bcbe13a5dee0"
"checksum": "590ff2a4b50d67ce52b35895e4cb8d75fefdc591988dafb2687c6461b50e3885"
},
"x86_64_windows": {
"checksum": "2a05851e1a854cc27c7c6a04f665d506bf2b7aa0aa62721a82af9aeeff9d20d2"
"checksum": "0c1cd165f4460a9d5c1f5c2a67e5faf53913694ba207ddc18b44f6c5de6ba6c5"
},
"aarch64_linux_musl": {
"checksum": "70c17459e4bc0b417679e66af55199603d80fa751d819b86713f700e3e9a6602"
"checksum": "2433118983ade85388be17d442b430c4932eb2dad834143f9a6a25646563281f"
},
"aarch64_macos": {
"checksum": "64755bfa178ba061c90d46fdf6c977c9b78564bcb4605ff827855d6623453be9"
"checksum": "1b0ea154b639dc7d8b49c6a2fa300964357a67a1b2441e9f29b61c7b7b79d23d"
},
"aarch64_windows": {
"checksum": "1277c4ae1a772f803355e256192c2b8bc434421dbd137a9b895ca8031a31ddb3"
"checksum": "f440401a77b284a8b52ba0052fe26628e8658d4febc91108c28542a0843d341a"
}
}
}

View File

@@ -11,11 +11,23 @@
"url": "https://github.com/RalfJung/cargo-careful/releases/download/v${version}/cargo-careful.exe"
}
},
"license_markdown": "[MIT](https://github.com/RalfJung/cargo-careful/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/RalfJung/cargo-careful/blob/master/LICENSE-APACHE)",
"latest": {
"version": "0.4.1"
"version": "0.4.2"
},
"0.4": {
"version": "0.4.1"
"version": "0.4.2"
},
"0.4.2": {
"x86_64_linux_musl": {
"checksum": "ee14c5796acab604714e358de11bf5204055410ae8fd4891df7f5d62461402c3"
},
"x86_64_macos": {
"checksum": "480efaf0a577161332b27ea13c8703ead1b6355b5c6541f5bd61d440440b4bde"
},
"x86_64_windows": {
"checksum": "ac374b7799a37e3ef21c6bfe409583c3acbc57242fbb32e8534269b5e97b8ee9"
}
},
"0.4.1": {
"x86_64_linux_musl": {

View File

@@ -11,6 +11,7 @@
"url": "https://github.com/CycloneDX/cyclonedx-rust-cargo/releases/download/cargo-cyclonedx-${version}/cargo-cyclonedx-Win-x86_64.zip"
}
},
"license_markdown": "[Apache-2.0](https://github.com/CycloneDX/cyclonedx-rust-cargo/blob/main/LICENSE)",
"latest": {
"version": "0.5.0"
},

View File

@@ -13,16 +13,55 @@
"url": "https://github.com/EmbarkStudios/cargo-deny/releases/download/${version}/cargo-deny-${version}-x86_64-pc-windows-msvc.tar.gz",
"bin": "cargo-deny-${version}-x86_64-pc-windows-msvc/cargo-deny.exe"
},
"aarch64_linux_musl": {
"url": "https://github.com/EmbarkStudios/cargo-deny/releases/download/${version}/cargo-deny-${version}-aarch64-unknown-linux-musl.tar.gz",
"bin": "cargo-deny-${version}-aarch64-unknown-linux-musl/cargo-deny"
},
"aarch64_macos": {
"url": "https://github.com/EmbarkStudios/cargo-deny/releases/download/${version}/cargo-deny-${version}-aarch64-apple-darwin.tar.gz",
"bin": "cargo-deny-${version}-aarch64-apple-darwin/cargo-deny"
}
},
"license_markdown": "[MIT](https://github.com/EmbarkStudios/cargo-deny/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/EmbarkStudios/cargo-deny/blob/main/LICENSE-APACHE)",
"latest": {
"version": "0.14.22"
"version": "0.14.24"
},
"0.14": {
"version": "0.14.22"
"version": "0.14.24"
},
"0.14.24": {
"x86_64_linux_musl": {
"checksum": "df57dd1ccbc44c4445cb72974562ed934637d982fb0f6d62105dddc290beaaad"
},
"x86_64_macos": {
"checksum": "47b7b07fb210b871027adb3a08fe85fa1a54e4403b523feaa844f3db029e96c8"
},
"x86_64_windows": {
"checksum": "35e6709107c13d35b9c2a9ee6d9db4cdf52f008e84334597e796305b95a72bdd"
},
"aarch64_linux_musl": {
"checksum": "8b1142bc6b7968169781a0ce01c74dc553468d968eda931c0a9e7420ae82e20d"
},
"aarch64_macos": {
"checksum": "636f9e6e509bc43fab9ab6c2f2470dc027d05badce47b075bd27d9b05ffb162f"
}
},
"0.14.23": {
"x86_64_linux_musl": {
"checksum": "05d6cb0cd61350d3227e1f0af9252fce7a66f6b109a8850bb0af83507892c4da"
},
"x86_64_macos": {
"checksum": "d8d3e97d95521dcc2e95a4293b3e774aeee5591cad9994ad49b5d177ca98bf8e"
},
"x86_64_windows": {
"checksum": "5da19ca3efc6d207d075fdc29e22dc74bcb5476ec33eabfba9d788fc23513858"
},
"aarch64_linux_musl": {
"checksum": "027f050ba79720645e1c7c8239ee0c8896485c961152b8d025756be88266b302"
},
"aarch64_macos": {
"checksum": "95562322593b203ffdf4d209a3781069c268fd6a4b3267b0a6b67919ff672225"
}
},
"0.14.22": {
"x86_64_linux_musl": {

View File

@@ -10,6 +10,7 @@
"bin": "cargo-dinghy-${version}/cargo-dinghy"
}
},
"license_markdown": "[MIT](https://github.com/sonos/dinghy/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/sonos/dinghy/blob/main/LICENSE-APACHE)",
"latest": {
"version": "0.7.1"
},

View File

@@ -18,6 +18,7 @@
"bin": "cargo-export-v${version}-aarch64-apple-darwin/bin/cargo-export"
}
},
"license_markdown": "[MIT](https://github.com/bazhenov/cargo-export/blob/master/LICENSE)",
"latest": {
"version": "0.2.5"
},

View File

@@ -1,6 +1,7 @@
{
"rust_crate": "cargo-hack",
"template": null,
"license_markdown": "[Apache-2.0](https://github.com/taiki-e/cargo-hack/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-hack/blob/main/LICENSE-MIT)",
"latest": {
"version": "0.6.28"
},

View File

@@ -17,11 +17,29 @@
"url": "https://github.com/taiki-e/cargo-llvm-cov/releases/download/v${version}/cargo-llvm-cov-aarch64-apple-darwin.tar.gz"
}
},
"license_markdown": "[Apache-2.0](https://github.com/taiki-e/cargo-llvm-cov/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-llvm-cov/blob/main/LICENSE-MIT)",
"latest": {
"version": "0.6.9"
"version": "0.6.10"
},
"0.6": {
"version": "0.6.9"
"version": "0.6.10"
},
"0.6.10": {
"x86_64_linux_musl": {
"checksum": "2350d7d6586c8b1ac828ad5578225fafb6a43fa9c35fe835c28a5ed63499df60"
},
"x86_64_macos": {
"checksum": "6355b4536798ba0cea459729cc531f7bbf252d51c86b02683c0b4a4033d8cb96"
},
"x86_64_windows": {
"checksum": "3090e71ba2c0e16e593d338f4ed696f3829544f53dea63bdd966398f4379259c"
},
"aarch64_linux_musl": {
"checksum": "7921682e7bd925b69bbecaf9bf42f99a6404ef60049b1a9f87fe97dc697265f4"
},
"aarch64_macos": {
"checksum": "46fe1d529755ca1a39dc7995374eef4482a20f0f632dd113430641c06fc4b466"
}
},
"0.6.9": {
"x86_64_linux_musl": {

View File

@@ -1,6 +1,7 @@
{
"rust_crate": "cargo-machete",
"template": null,
"license_markdown": "[MIT](https://github.com/bnjbvr/cargo-machete/blob/main/LICENSE.md)",
"latest": {
"version": "0.6.2"
},

View File

@@ -18,11 +18,26 @@
"bin": "cargo-make-v${version}-aarch64-apple-darwin/cargo-make"
}
},
"license_markdown": "[Apache-2.0](https://github.com/sagiegurari/cargo-make/blob/master/LICENSE)",
"latest": {
"version": "0.37.11"
"version": "0.37.12"
},
"0.37": {
"version": "0.37.11"
"version": "0.37.12"
},
"0.37.12": {
"x86_64_linux_musl": {
"checksum": "d07149c4425ec93fc1cfedf8c8092d3b405482acdb2d01ecd8fba3ac755a381a"
},
"x86_64_macos": {
"checksum": "96799def4c15cfe81e72b96a8df90a49e1cca0d2899f4e928e69e8a1f6e46ee1"
},
"x86_64_windows": {
"checksum": "271c37b5f63b02a1c4ff5f33935976df7cb473ada221dd06bce7282520f7be65"
},
"aarch64_macos": {
"checksum": "091b93de51096c406c698b567e8d5bab83c2ab030b5b2a763104efe841ffb079"
}
},
"0.37.11": {
"x86_64_linux_musl": {

View File

@@ -20,6 +20,7 @@
"url": "https://github.com/taiki-e/cargo-minimal-versions/releases/download/v${version}/cargo-minimal-versions-aarch64-pc-windows-msvc.tar.gz"
}
},
"license_markdown": "[Apache-2.0](https://github.com/taiki-e/cargo-minimal-versions/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-minimal-versions/blob/main/LICENSE-MIT)",
"latest": {
"version": "0.1.27"
},

View File

@@ -20,6 +20,7 @@
"url": "https://github.com/taiki-e/cargo-no-dev-deps/releases/download/v${version}/cargo-no-dev-deps-aarch64-pc-windows-msvc.tar.gz"
}
},
"license_markdown": "[Apache-2.0](https://github.com/taiki-e/cargo-no-dev-deps/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/cargo-no-dev-deps/blob/main/LICENSE-MIT)",
"latest": {
"version": "0.2.12"
},

View File

@@ -11,6 +11,7 @@
"url": "https://github.com/orium/cargo-rdme/releases/download/v${version}/cargo-rdme_v${version}_x86_64-pc-windows-gnu.zip"
}
},
"license_markdown": "[MPL-2.0](https://github.com/orium/cargo-rdme/blob/main/LICENSE.md)",
"latest": {
"version": "1.4.2"
},

View File

@@ -11,6 +11,7 @@
"url": "https://github.com/DevinR528/cargo-sort/releases/download/v${version}/cargo-sort-x86_64-pc-windows-msvc.zip"
}
},
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/DevinR528/cargo-sort/blob/55ec89082466f6bb246d870a8d56d166a8e1f08b/Cargo.toml#L5)",
"latest": {
"version": "1.0.9"
},

View File

@@ -8,6 +8,7 @@
"url": "https://github.com/drahnr/cargo-spellcheck/releases/download/v${version}/cargo-spellcheck-v${version}-x86_64-pc-windows-gnu.exe"
}
},
"license_markdown": "[LGPLv2.1](https://github.com/drahnr/cargo-spellcheck/blob/master/LICENSE-LGPL)",
"latest": {
"version": "0.14.0"
},

View File

@@ -17,8 +17,83 @@
"url": "https://github.com/xd009642/tarpaulin/releases/download/${version}/cargo-tarpaulin-aarch64-apple-darwin.tar.gz"
}
},
"license_markdown": "[MIT](https://github.com/xd009642/tarpaulin/blob/develop/LICENSE-MIT) OR [Apache-2.0](https://github.com/xd009642/tarpaulin/blob/develop/LICENSE-APACHE)",
"latest": {
"version": "0.28.0"
"version": "0.30.0"
},
"0.30": {
"version": "0.30.0"
},
"0.30.0": {
"x86_64_linux_musl": {
"checksum": "7adaec5afad826e8b758fffe3b9804d3a371553fa4cdb56ddd9a3592c08a03ac"
},
"x86_64_macos": {
"checksum": "cc2b8b84c0f19db57f00b5e2e322c3115a744d2fccc823700f3b7f60dd13a289"
},
"x86_64_windows": {
"checksum": "fa1dee30c073f72b03303c3d6479d0198eb0f8079e1b65582a502f411247754d"
},
"aarch64_linux_musl": {
"checksum": "e06ef0e98fc78da0a447f8560fbfe797a57cebe1b71a7161e0810f6d65151758"
},
"aarch64_macos": {
"checksum": "a7f582a21083f2be93aeb3f7d13d534ee5d63c1aec9e1f8c570253a970f4d18e"
}
},
"0.29": {
"version": "0.29.2"
},
"0.29.2": {
"x86_64_linux_musl": {
"checksum": "d6ba7a39fa27c1792741860dc28225daaab9ba74f7ebdd5cf4f175009f079167"
},
"x86_64_macos": {
"checksum": "e489e193d0d520002ad10673f6027ff80cd516a5ffbc8f8e4269f2181428ae0d"
},
"x86_64_windows": {
"checksum": "f3e7bf5ea970d543b9b47cd4ad62fa9f6316fed61e57132abf085ddde6e60692"
},
"aarch64_linux_musl": {
"checksum": "3c8b9db1d5f38e741ee84e15e038216c7a74a5b550770f8a273296aea65e7292"
},
"aarch64_macos": {
"checksum": "15bc3f52422c8e72f1385a113d35a9e7b4ab6a15503fceef2155fe0fe5bbcb4f"
}
},
"0.29.1": {
"x86_64_linux_musl": {
"checksum": "be2be986abde1f7b9544f217acce4d1699a04bc3b09e17c05b3fbd239d52456a"
},
"x86_64_macos": {
"checksum": "6809df4fb7f559e30ed4134abca203fcd92cbe1db5117fa17a7e9c64933ee80b"
},
"x86_64_windows": {
"checksum": "a8827dfd6cbe3280bd474d7f49ee58544016ad8eaa11769edaa05936c91ae882"
},
"aarch64_linux_musl": {
"checksum": "9e3791c191fa8224d038e54d988c3937e446c9e8673f5db5c0e43cc76af1ab16"
},
"aarch64_macos": {
"checksum": "2e4eac469f93ac46721d527958a6ec690d4084ed6893900214c504cce6a3303d"
}
},
"0.29.0": {
"x86_64_linux_musl": {
"checksum": "7f5fda7ace039963e0413b5949c40292e0cb1c0ffc4e1b6cb60aadab167b1725"
},
"x86_64_macos": {
"checksum": "df21c946c69b6d653bb59e6ddb0e99c1f184e74f1b2a077a3654427171a37497"
},
"x86_64_windows": {
"checksum": "1d7f4b814d1757438ddce75ddbd12b02c54d681803f9aa7703a8087e3a391d34"
},
"aarch64_linux_musl": {
"checksum": "4d33d6072976c0b9c717b18ff12ee283ae4b38a0b4ec50f1ef208bf47689f2a4"
},
"aarch64_macos": {
"checksum": "36dbfbd7ebaad25372fb7faa9263bd3e5b07316be95fc0bb450deb2f4791b255"
}
},
"0.28": {
"version": "0.28.0"

View File

@@ -30,6 +30,7 @@
"bin": "./cargo-udeps-v${version}-aarch64-pc-windows-msvc/cargo-udeps.exe"
}
},
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/est31/cargo-udeps/blob/HEAD/LICENSE)",
"latest": {
"version": "0.1.47"
},

View File

@@ -11,6 +11,7 @@
"url": "https://github.com/jfrimmel/cargo-valgrind/releases/download/v${version}/cargo-valgrind-${version}-x86_64-pc-windows-msvc.zip"
}
},
"license_markdown": "[MIT](https://github.com/jfrimmel/cargo-valgrind/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/jfrimmel/cargo-valgrind/blob/master/LICENSE-APACHE)",
"latest": {
"version": "2.1.0"
},

1
manifests/cross.json generated
View File

@@ -1,6 +1,7 @@
{
"rust_crate": "cross",
"template": null,
"license_markdown": "[MIT](https://github.com/cross-rs/cross/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/cross-rs/cross/blob/main/LICENSE-APACHE)",
"latest": {
"version": "0.2.5"
},

40
manifests/dprint.json generated
View File

@@ -23,8 +23,46 @@
"url": "https://github.com/dprint/dprint/releases/download/${version}/dprint-aarch64-apple-darwin.zip"
}
},
"license_markdown": "[MIT](https://github.com/dprint/dprint/blob/main/LICENSE)",
"latest": {
"version": "0.45.1"
"version": "0.46.1"
},
"0.46": {
"version": "0.46.1"
},
"0.46.1": {
"x86_64_linux_musl": {
"checksum": "4a7d6fa6b920ab150f580965556086cdd7992e07078e627ab9a9d1c3bd30ba85"
},
"x86_64_macos": {
"checksum": "cdea84bce1d84c26e8eced2265d246b79a849ec2e7d1377d98dd7bdb21c7ce83"
},
"x86_64_windows": {
"checksum": "74e5ab38c744d5903862c2b5174d0fef9759b5506da775e1fb93b6a68c63101d"
},
"aarch64_linux_musl": {
"checksum": "e2b6d87167d21f1f01571790e79526ef9caff3b8b75f5cac348c4f06f60a8c16"
},
"aarch64_macos": {
"checksum": "f3ff4faef83d14c3b4ae262e79a40d4e0fc3fa1903d0b6e9b82f0b25b00e9499"
}
},
"0.46.0": {
"x86_64_linux_musl": {
"checksum": "7a2c12edc868259be890174c4ec3bd51c81ec8773aa294e12fac0634f36d15f5"
},
"x86_64_macos": {
"checksum": "e339f1f891c60087676d72f70ba5f80dcaedde4bdc58730b9cb68a5483b3abfd"
},
"x86_64_windows": {
"checksum": "786201545938f6f7c6d407e6404b31ae9bbf9e5a4abc4c88dc9bd73da369a906"
},
"aarch64_linux_musl": {
"checksum": "e52c0a3398e34e88ffe560e719bf8361ba3f35b4e0927ab9ba0761796884ce24"
},
"aarch64_macos": {
"checksum": "4b608b3676f10e04328c3d8be396bded96328ebca9b95b70bf5baf67bed7b135"
}
},
"0.45": {
"version": "0.45.1"

View File

@@ -26,6 +26,7 @@
"bin": "bin/ec-windows-arm64.exe"
}
},
"license_markdown": "[MIT](https://github.com/editorconfig-checker/editorconfig-checker/blob/main/LICENSE)",
"latest": {
"version": "3.0.1"
},

1
manifests/espup.json generated
View File

@@ -17,6 +17,7 @@
"url": "https://github.com/esp-rs/espup/releases/download/v${version}/espup-aarch64-apple-darwin.zip"
}
},
"license_markdown": "[MIT](https://github.com/esp-rs/espup/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/esp-rs/espup/blob/main/LICENSE-APACHE)",
"latest": {
"version": "0.11.0"
},

View File

@@ -26,14 +26,58 @@
"bin": "git-cliff-${version}/git-cliff.exe"
}
},
"license_markdown": "[MIT](https://github.com/orhun/git-cliff/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/orhun/git-cliff/blob/main/LICENSE-APACHE)",
"latest": {
"version": "2.2.1"
"version": "2.3.0"
},
"2": {
"version": "2.2.1"
"version": "2.3.0"
},
"2.3": {
"version": "2.3.0"
},
"2.3.0": {
"x86_64_linux_musl": {
"checksum": "0371c0c2fd948a711d05198f719a2ec8ccb2a43ae5e4760394916d5cf6b45c6c"
},
"x86_64_macos": {
"checksum": "73ce46c671a593fe1acef725e7816c793968e3c315fd72107280e830eaa55820"
},
"x86_64_windows": {
"checksum": "90bc9c60b5db44a62fae51fb09e9565e2d460e107df3404ac5384a2f0bdd96d1"
},
"aarch64_linux_musl": {
"checksum": "aed0a6fba4d5b309be98ef71db75928c84c57495d46843791e95870582f0d1a6"
},
"aarch64_macos": {
"checksum": "1fd8e277212db52c791a20b6ecdb993ce47884a1aca3ee3d31066fd29acea6bb"
},
"aarch64_windows": {
"checksum": "059a29642ffe16ad720cb383290564df35bddd329fa34f6d1d1a4f633d6dad48"
}
},
"2.2": {
"version": "2.2.1"
"version": "2.2.2"
},
"2.2.2": {
"x86_64_linux_musl": {
"checksum": "3a199e08786eeb8801e40c6f2e022e236c1a640eb172695898ded679089eb5cf"
},
"x86_64_macos": {
"checksum": "3efc16a26b1e511f285395a241d338991dc89494a1d3b4fc4c67c99a5b8cedce"
},
"x86_64_windows": {
"checksum": "9e2956b4ec65dbf48ca9b9fa1815012ca9486c721a143b6eb35412f395f2fd7f"
},
"aarch64_linux_musl": {
"checksum": "a5484af486d8ac20748c681ae205c698415550783d3cf13d0a5e230c0cca5961"
},
"aarch64_macos": {
"checksum": "0f5b598795b6b6f2c6b7f683559ef90b2cbe59393c88c057892a12713e08d20b"
},
"aarch64_windows": {
"checksum": "919f5b90966dc90c695ab327cedd840ef2fe705270c3a0902d106abde8110c0f"
}
},
"2.2.1": {
"x86_64_linux_musl": {

1
manifests/grcov.json generated
View File

@@ -17,6 +17,7 @@
"url": "https://github.com/mozilla/grcov/releases/download/v${version}/grcov-aarch64-apple-darwin.tar.bz2"
}
},
"license_markdown": "[MPL-2.0](https://github.com/mozilla/grcov/blob/HEAD/LICENSE-MPL-2.0)",
"latest": {
"version": "0.8.19"
},

View File

@@ -18,6 +18,7 @@
"bin": "hyperfine-v${version}-aarch64-unknown-linux-gnu/hyperfine"
}
},
"license_markdown": "[MIT](https://github.com/sharkdp/hyperfine/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/sharkdp/hyperfine/blob/master/LICENSE-APACHE)",
"latest": {
"version": "1.18.0"
},

45
manifests/just.json generated
View File

@@ -17,11 +17,52 @@
"url": "https://github.com/casey/just/releases/download/${version}/just-${version}-aarch64-apple-darwin.tar.gz"
}
},
"license_markdown": "[CC0-1.0](https://github.com/casey/just/blob/master/LICENSE)",
"latest": {
"version": "1.25.2"
"version": "1.27.0"
},
"1": {
"version": "1.25.2"
"version": "1.27.0"
},
"1.27": {
"version": "1.27.0"
},
"1.27.0": {
"x86_64_linux_musl": {
"checksum": "6cc91651c4dd5e287df8ea7b3087c44120ba95a32ee50497bb071695846ab086"
},
"x86_64_macos": {
"checksum": "ae5dae799d3dafeaf4d53e221e1efdeec88980a38375b0d6dbc9c9bb16eec273"
},
"x86_64_windows": {
"checksum": "08dca5c6e30258cbb24ec30eb8ea1e3ba5b2beb5349eaabee450230ce45ef585"
},
"aarch64_linux_musl": {
"checksum": "f049d134d311b3d2190d30a936e0a4257df156082cab37d4eb2ace1b760154ca"
},
"aarch64_macos": {
"checksum": "5d6b05ab581dca9346114df7c9f7285f54d4b80d8082e2c8fce51a42b3dbdb9c"
}
},
"1.26": {
"version": "1.26.0"
},
"1.26.0": {
"x86_64_linux_musl": {
"checksum": "be7233b3ebfd5bdda8cae6537c21c839d3d24ecf075f1494a2e67f93539b1e12"
},
"x86_64_macos": {
"checksum": "aa9ad8d097c4d3744c9d06520e28837c5e3fa50519a4cd657e0f2f7a226897af"
},
"x86_64_windows": {
"checksum": "e326f8552ac7119b643fed1b8af8fe392593280c185c44beadc313e0291f412a"
},
"aarch64_linux_musl": {
"checksum": "56352027a18e64bc58aa77d4c020bd79163f10cecc859595b0474b5a442369d3"
},
"aarch64_macos": {
"checksum": "1b8b12f348eea603ba935d0799e03b87adb9b15779ff21cd67b3ddb1e6ab21d2"
}
},
"1.25": {
"version": "1.25.2"

View File

@@ -11,6 +11,7 @@
"url": "https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v${version}/mdbook-linkcheck.x86_64-pc-windows-msvc.zip"
}
},
"license_markdown": "[MIT](https://github.com/Michael-F-Bryan/mdbook-linkcheck/blob/master/LICENSE)",
"latest": {
"version": "0.7.7"
},

33
manifests/mdbook.json generated
View File

@@ -17,11 +17,40 @@
"url": "https://github.com/rust-lang/mdBook/releases/download/v${version}/mdbook-v${version}-aarch64-unknown-linux-musl.tar.gz"
}
},
"license_markdown": "[MPL-2.0](https://github.com/rust-lang/mdBook/blob/master/LICENSE)",
"latest": {
"version": "0.4.37"
"version": "0.4.40"
},
"0.4": {
"version": "0.4.37"
"version": "0.4.40"
},
"0.4.40": {
"x86_64_linux_musl": {
"checksum": "f7520ad60d1a6fe81c667d0da876a9ddd736f874eb61c01b025eafdc83381227"
},
"x86_64_macos": {
"checksum": "5783c09bb60b3e2e904d6839e3a1993a4ace1ca30a336a3c78bedac6e938817c"
},
"x86_64_windows": {
"checksum": "1470e5b06614cb2851e8b3c908dfdef2982b90e6cc6045662512ce66d6c7c5d9"
},
"aarch64_linux_musl": {
"checksum": "d5ebfd2e31755726f8c0988a423b1ab5d950bb894fbba170355bb7d1cb852586"
}
},
"0.4.39": {
"x86_64_linux_musl": {
"checksum": "25d66ee23c67815549a1517c484aad210c5e0f97c68bb990a93a34c03e859d47"
},
"x86_64_macos": {
"checksum": "dd52578a17c892afa805ec29b15c06f1e7c6e6707791ef840165fc3f1763c6bb"
},
"x86_64_windows": {
"checksum": "f8efb854df122d6d99189923d7fe61625f8931e0a46d38d8449fd850a67079d1"
},
"aarch64_linux_musl": {
"checksum": "68fc653b401b6d344eef77f9f119d262acadce248e23a4dd1ef2e958eabc2be8"
}
},
"0.4.37": {
"x86_64_linux_musl": {

View File

@@ -20,6 +20,7 @@
"url": "https://github.com/google/osv-scanner/releases/download/v${version}/osv-scanner_${version}_windows_arm64.exe"
}
},
"license_markdown": "[Apache-2.0](https://github.com/google/osv-scanner/blob/main/LICENSE)",
"latest": {
"version": "1.6.2"
},

View File

@@ -1,6 +1,7 @@
{
"rust_crate": "parse-changelog",
"template": null,
"license_markdown": "[Apache-2.0](https://github.com/taiki-e/parse-changelog/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/taiki-e/parse-changelog/blob/main/LICENSE-MIT)",
"latest": {
"version": "0.6.8"
},

54
manifests/protoc.json generated
View File

@@ -1,11 +1,37 @@
{
"rust_crate": null,
"template": null,
"license_markdown": "[BSD-3-Clause](https://github.com/protocolbuffers/protobuf/blob/HEAD/LICENSE)",
"latest": {
"version": "3.26.1"
"version": "3.27.0"
},
"3": {
"version": "3.26.1"
"version": "3.27.0"
},
"3.27": {
"version": "3.27.0"
},
"3.27.0": {
"x86_64_linux_gnu": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protoc-27.0-linux-x86_64.zip",
"checksum": "e2bdce49564dbad4676023d174d9cdcf932238bc0b56a8349a5cb27bbafc26b0"
},
"x86_64_macos": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protoc-27.0-osx-x86_64.zip",
"checksum": "d956cf3a9e91a687aa4d1026e9261e5a587e4e0b545db0174509f6c448b8ce21"
},
"x86_64_windows": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protoc-27.0-win64.zip",
"checksum": "80888b2a38786861c7b3aaf4e0bd5b933a51d750219ee8c61093655fc2924926"
},
"aarch64_linux_gnu": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protoc-27.0-linux-aarch_64.zip",
"checksum": "1e4b2d8b145afe99a36602f305165761e46d2525aa94cbb907e2e983be6717ac"
},
"aarch64_macos": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protoc-27.0-osx-aarch_64.zip",
"checksum": "2cf59e3e3463bede1f10b7517efdddd97a3bd8cfd9cacc286407b657290dc781"
}
},
"3.26": {
"version": "3.26.1"
@@ -372,7 +398,29 @@
}
},
"3.22": {
"version": "3.22.4"
"version": "3.22.5"
},
"3.22.5": {
"x86_64_linux_gnu": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v22.5/protoc-22.5-linux-x86_64.zip",
"checksum": "c11692013bbffb7c257de7f82cd02d323700ebcdb8a4923ed02fea812f70f5e3"
},
"x86_64_macos": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v22.5/protoc-22.5-osx-x86_64.zip",
"checksum": "3edd0c65e2a8efc83f24918db27e1bbc72f3abe7618cb4cfb1842630a830b562"
},
"x86_64_windows": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v22.5/protoc-22.5-win64.zip",
"checksum": "f99d1e9e28f7704b22d4254fab293477ea0d4ef3e5b9aa940a8fccfc99c1ce4c"
},
"aarch64_linux_gnu": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v22.5/protoc-22.5-linux-aarch_64.zip",
"checksum": "1890f845b333fe040ec002a659a4ff7515cd93f8db0066c3885d1fce9f70b208"
},
"aarch64_macos": {
"url": "https://github.com/protocolbuffers/protobuf/releases/download/v22.5/protoc-22.5-osx-aarch_64.zip",
"checksum": "b7fc6c6099ad10149d90f8b107871537ca030980354b402d8e034055ce082b77"
}
},
"3.22.4": {
"x86_64_linux_gnu": {

22
manifests/sccache.json generated
View File

@@ -22,11 +22,29 @@
"bin": "sccache-v${version}-aarch64-apple-darwin/sccache"
}
},
"license_markdown": "[Apache-2.0](https://github.com/mozilla/sccache/blob/main/LICENSE)",
"latest": {
"version": "0.8.0"
"version": "0.8.1"
},
"0.8": {
"version": "0.8.0"
"version": "0.8.1"
},
"0.8.1": {
"x86_64_linux_musl": {
"checksum": "e0ee621fb16b6940666cd770b091c62cadafd3e062dd12e3a49d9caaff3b795f"
},
"x86_64_macos": {
"checksum": "4306fb21606b14e2ce1266b25c40e55c090ea68c2cb54e1c39bfb9b81ea3e342"
},
"x86_64_windows": {
"checksum": "44249088926f52d1fee76cd1dcd1c061e2152a7feedb7ba43d4a4f50be805608"
},
"aarch64_linux_musl": {
"checksum": "452cef732b24415493a7c6bca6e13536eb9464593fa87c753b6b7cb4733e9c50"
},
"aarch64_macos": {
"checksum": "b4029ae790e29333ebcf52faa5bc0559945011d5fdbc7cc15812bc45fc6ea5d4"
}
},
"0.8.0": {
"x86_64_linux_musl": {

View File

@@ -18,6 +18,7 @@
"bin": "shellcheck-v${version}/shellcheck"
}
},
"license_markdown": "[GPL-3.0](https://github.com/koalaman/shellcheck/blob/master/LICENSE)",
"latest": {
"version": "0.10.0"
},

1
manifests/shfmt.json generated
View File

@@ -17,6 +17,7 @@
"url": "https://github.com/mvdan/sh/releases/download/v${version}/shfmt_v${version}_darwin_arm64"
}
},
"license_markdown": "[BSD-3-Clause](https://github.com/mvdan/sh/blob/master/LICENSE)",
"latest": {
"version": "3.8.0"
},

62
manifests/syft.json generated
View File

@@ -22,11 +22,69 @@
"bin": "syft"
}
},
"license_markdown": "[Apache-2.0](https://github.com/anchore/syft/blob/main/LICENSE)",
"latest": {
"version": "1.3.0"
"version": "1.5.0"
},
"1": {
"version": "1.3.0"
"version": "1.5.0"
},
"1.5": {
"version": "1.5.0"
},
"1.5.0": {
"x86_64_linux_musl": {
"checksum": "3d10023d46dfaf0fe75288df207b478b43597f7d2fff553f58430817166bd478"
},
"x86_64_macos": {
"checksum": "605322e3e7043a4f2f3d6e37f75a71389d38f6f290bff2e54bb2aaebbbf4829b"
},
"x86_64_windows": {
"checksum": "5079c6a88e130f8677d0701cb2689f9eae2088022ecf5fa2b9f341b96d9983d2"
},
"aarch64_linux_musl": {
"checksum": "ee2b1289a1e4b0de9409c3a78867949ca42788a5f50072b8a6e6e04e6a269f9c"
},
"aarch64_macos": {
"checksum": "fe02d072e7ec9a8eb4ac866ba973396a8beae79829ee870acaadd4d862e5e65a"
}
},
"1.4": {
"version": "1.4.1"
},
"1.4.1": {
"x86_64_linux_musl": {
"checksum": "5e4c6a0d1ca28d25e060a29c7cca0aedc50d951bfb270b45bc9a71e86ac6fbe2"
},
"x86_64_macos": {
"checksum": "c25872b4ddd6f0d06d8454cce6351469b51ee5c04939b5d4ea86c6048c9021e9"
},
"x86_64_windows": {
"checksum": "ac97125b56b21987d35bcb6b5d300a686bc241272b0b91a12a3c6c743a0567a9"
},
"aarch64_linux_musl": {
"checksum": "a28d63bb2bca96092a1a42cd5afdd0787633ae05998935a5e6e2aac8f2e2ec44"
},
"aarch64_macos": {
"checksum": "9e23ce6ab8e36c9fc102f21a47d0ae5cd39362f21ff58f33b09a58f456f36c03"
}
},
"1.4.0": {
"x86_64_linux_musl": {
"checksum": "b6c940a0ebc79840d1dd4049d481e0d7b7ea8b70a70ff9b4d10408ea226da9e9"
},
"x86_64_macos": {
"checksum": "235ec3197f15fb4f3cb509ef519b7281de7a1f4a5e43f9ade691791b31a6c44d"
},
"x86_64_windows": {
"checksum": "49742d3ba007a1c477f6c1b15ba19aed7592697d321eee2ef37902001b3dd5e6"
},
"aarch64_linux_musl": {
"checksum": "7cb482f7d7fc3fe8bc4d25673f17d5e4b81ac43a73e746f1862085276f523931"
},
"aarch64_macos": {
"checksum": "ecf2aa6c922fba65c9ecd9b5774770468e9bf083a4759fdc87e3a68733f1b677"
}
},
"1.3": {
"version": "1.3.0"

22
manifests/typos.json generated
View File

@@ -14,11 +14,29 @@
"url": "https://github.com/crate-ci/typos/releases/download/v${version}/typos-v${version}-aarch64-apple-darwin.tar.gz"
}
},
"license_markdown": "[MIT](https://github.com/crate-ci/typos/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/crate-ci/typos/blob/master/LICENSE-APACHE)",
"latest": {
"version": "1.21.0"
"version": "1.22.0"
},
"1": {
"version": "1.21.0"
"version": "1.22.0"
},
"1.22": {
"version": "1.22.0"
},
"1.22.0": {
"x86_64_linux_musl": {
"checksum": "bfa037cb884797da229768751642191128a8096f34a77c2c2aab81f4ea4add5e"
},
"x86_64_macos": {
"checksum": "5cede24a0c7e7fa826372346ae8a1eb7264741412cf830acb7bd6ba9d261e610"
},
"x86_64_windows": {
"checksum": "cded62aca581b5610a8a8ac88d26c84bbbf02cd988fca64be50da6beb7d6ad85"
},
"aarch64_macos": {
"checksum": "e747252644b76cca8b7c4bf3a36835186773500a2d1964ffe7341bd33ffdfbe2"
}
},
"1.21": {
"version": "1.21.0"

View File

@@ -42,6 +42,7 @@
]
}
},
"license_markdown": "[MIT](https://github.com/rustwasm/wasm-bindgen/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/rustwasm/wasm-bindgen/blob/main/LICENSE-APACHE)",
"latest": {
"version": "0.2.92"
},

View File

@@ -18,6 +18,7 @@
"bin": "wasm-pack-v${version}-aarch64-unknown-linux-musl/wasm-pack"
}
},
"license_markdown": "[MIT](https://github.com/rustwasm/wasm-pack/blob/master/LICENSE-MIT) OR [Apache-2.0](https://github.com/rustwasm/wasm-pack/blob/master/LICENSE-APACHE)",
"latest": {
"version": "0.12.1"
},

View File

@@ -22,14 +22,89 @@
"bin": "wasmtime-v${version}-aarch64-macos/wasmtime"
}
},
"license_markdown": "[Apache-2.0 WITH LLVM-exception](https://github.com/bytecodealliance/wasmtime/blob/main/LICENSE)",
"latest": {
"version": "20.0.0"
"version": "21.0.1"
},
"21": {
"version": "21.0.1"
},
"21.0": {
"version": "21.0.1"
},
"21.0.1": {
"x86_64_linux_gnu": {
"checksum": "d49619e38c660196a048e80d34292e458a11af010ab1780e7b3ae9a42df6e33b"
},
"x86_64_macos": {
"checksum": "8452dc6e865553cc7027d45a961f86440fd9459de7a48117236c386e4ceb2a1f"
},
"x86_64_windows": {
"checksum": "c2a1e23e2ab49f3f942e6a47aba8c60c863fd66166c3940fa3dd1f9a0286a4b6"
},
"aarch64_linux_gnu": {
"checksum": "77e8a381bbc54f39399c71ee305b6ce5b6807e7c088846ea1e406a3a62b38146"
},
"aarch64_macos": {
"checksum": "816a4a50c875de0804c316fc3171fb20a45fb82e4bf3e3313dec4f6d819df688"
}
},
"21.0.0": {
"x86_64_linux_gnu": {
"checksum": "605efdd4d073a7574b6d42ef0c9037c6c4e3933ed80615eab84f2d57cfeb3b28"
},
"x86_64_macos": {
"checksum": "7beb9f1b6789af74beef8354b675d5cab6477be708bf45aa86f411c4afe55dfd"
},
"x86_64_windows": {
"checksum": "e57345a2bd644e7f4d0a013617d64a3e16966b9483fee72bad2ab1eebabce59b"
},
"aarch64_linux_gnu": {
"checksum": "0fa42c4555617cb4a602216ec45b8dc43686733653ec07f9488ab5e2e3bf5ec8"
},
"aarch64_macos": {
"checksum": "b4a09d69c2cb4655e68895156a1de713b27a6e64796d9073108d20f55b8d5d5c"
}
},
"20": {
"version": "20.0.0"
"version": "20.0.2"
},
"20.0": {
"version": "20.0.0"
"version": "20.0.2"
},
"20.0.2": {
"x86_64_linux_gnu": {
"checksum": "88857222f6098e1d2988d66cbcb3f73b0b5230e8e6871967de7b44f652a542ff"
},
"x86_64_macos": {
"checksum": "1206b8afa8f2c89f4599886647bae7258cedcb68e4f73e68a6610a68c9141be5"
},
"x86_64_windows": {
"checksum": "b6653044531806d424a1f3eff4bf664e071c163f0536b6447318bced316478d8"
},
"aarch64_linux_gnu": {
"checksum": "6df6dfa37c6b7eaef7853b65d0e691eac45c9fb5793ecb37c9404b077d5098f4"
},
"aarch64_macos": {
"checksum": "69d3cfdece114def47cb21bfb37fdc89a2217d2dc7582a68cae4ff2b243837d6"
}
},
"20.0.1": {
"x86_64_linux_gnu": {
"checksum": "b3335181e672527c1f4b5b424413e6bed437cb4b6cc089082f836e03d076bd2d"
},
"x86_64_macos": {
"checksum": "3c921b994a078a0e703e80e9d2714de60deaec3ecbc25f500eac7d1d098c8d74"
},
"x86_64_windows": {
"checksum": "ca065cd227da0e5c8cadf4ef822b6dbc05a1eeab6d5d85ad558c8c761fd4a9b5"
},
"aarch64_linux_gnu": {
"checksum": "8b685a76e6a7b2dd89b5778a2b2c17a1ab3ba05e2f1b9cd6955d5a416de572fe"
},
"aarch64_macos": {
"checksum": "ed972d27e55e80af7baf79003791e9a4434af6b82fcc1a51bea33144f730d8d4"
}
},
"20.0.0": {
"x86_64_linux_gnu": {

1
manifests/xbuild.json generated
View File

@@ -14,6 +14,7 @@
"bin": "xbuild-windows-x64.exe"
}
},
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/rust-mobile/xbuild/blob/268939a99a50d7927bce3e343e5d2ed32eb8b30e/xbuild/Cargo.toml#L7)",
"latest": {
"version": "0.2.0"
},

1
manifests/zola.json generated
View File

@@ -14,6 +14,7 @@
"url": "https://github.com/getzola/zola/releases/download/v${version}/zola-v${version}-aarch64-apple-darwin.tar.gz"
}
},
"license_markdown": "[MIT](https://github.com/getzola/zola/blob/master/LICENSE)",
"latest": {
"version": "0.18.0"
},

View File

@@ -128,17 +128,14 @@ case "${host_os}" in
fi
;;
esac
# cargo-binstall requires cargo
if type -P cargo &>/dev/null; then
# cargo-watch/watchexec-cli is supported by cargo-binstall (through quickinstall)
case "${version}" in
latest) tools+=(cargo-watch watchexec-cli nextest) ;;
major.minor.patch) tools+=(cargo-watch@8.1.1 watchexec-cli@1.20.5 nextest@0.9.57) ;;
major.minor) tools+=(cargo-watch@8.1 watchexec-cli@1.20 nextest@0.9) ;;
major) tools+=(cargo-watch@8 watchexec-cli@1) ;;
*) exit 1 ;;
esac
fi
# cargo-watch/watchexec-cli is supported by cargo-binstall (through quickinstall)
case "${version}" in
latest) tools+=(cargo-watch watchexec-cli nextest) ;;
major.minor.patch) tools+=(cargo-watch@8.1.1 watchexec-cli@1.20.5 nextest@0.9.57) ;;
major.minor) tools+=(cargo-watch@8.1 watchexec-cli@1.20 nextest@0.9) ;;
major) tools+=(cargo-watch@8 watchexec-cli@1) ;;
*) exit 1 ;;
esac
# sort and dedup
IFS=$'\n'

View File

@@ -1,6 +1,7 @@
[package]
name = "install-action-internal-codegen"
edition = "2021"
default-run = "generate-manifest"
[dependencies]
anyhow = "1"
@@ -12,6 +13,7 @@ serde = "1"
serde_derive = "1"
serde_json = "1"
sha2 = "0.10"
spdx = "0.10"
tar = "0.4"
toml_edit = { version = "0.22", default-features = false, features = ["parse", "serde"] }
# TODO: call curl command instead of using ureq?
@@ -19,3 +21,15 @@ ureq = { version = "2", features = ["json"] }
[lints]
workspace = true
[[bin]]
bench = false
name = "generate-manifest"
path = "src/main.rs"
test = false
[[bin]]
bench = false
name = "generate-tools-markdown"
path = "src/tools-markdown.rs"
test = false

View File

@@ -1,5 +1,7 @@
{
"repository": "https://github.com/biomejs/biome",
"website": "https://biomejs.dev",
"license_markdown": "[Apache-2.0](https://github.com/biomejs/biome/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/biomejs/biome/blob/main/LICENSE-MIT)",
"tag_prefix": "cli/v",
"bin": "${package}${exe}",
"platform": {

View File

@@ -1,5 +1,7 @@
{
"repository": "https://github.com/rustsec/rustsec",
"website": "https://github.com/rustsec/rustsec/tree/HEAD/cargo-audit",
"license_markdown": "[Apache-2.0](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-APACHE) OR [MIT](https://github.com/rustsec/rustsec/blob/HEAD/cargo-audit/LICENSE-MIT)",
"tag_prefix": "cargo-audit/v",
"rust_crate": "${package}",
"asset_name": "${package}-${rust_target}-v${version}.tgz",

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/cargo-bins/cargo-binstall",
"license_markdown": "[GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-${rust_target}.zip",

View File

@@ -8,6 +8,7 @@
"x86_64_linux_musl": {},
"x86_64_macos": {},
"x86_64_windows": {},
"aarch64_linux_musl": {},
"aarch64_macos": {}
}
}

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/DevinR528/cargo-sort",
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/DevinR528/cargo-sort/blob/55ec89082466f6bb246d870a8d56d166a8e1f08b/Cargo.toml#L5)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-${rust_target}.tar.gz",

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/drahnr/cargo-spellcheck",
"license_markdown": "[LGPLv2.1](https://github.com/drahnr/cargo-spellcheck/blob/master/LICENSE-LGPL)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-v${version}-${rust_target}",

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/est31/cargo-udeps",
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/est31/cargo-udeps/blob/HEAD/LICENSE)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-v${version}-${rust_target}.tar.gz",

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/mozilla/grcov",
"license_markdown": "[MPL-2.0](https://github.com/mozilla/grcov/blob/HEAD/LICENSE-MPL-2.0)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-${rust_target}.tar.bz2",

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/protocolbuffers/protobuf",
"license_markdown": "[BSD-3-Clause](https://github.com/protocolbuffers/protobuf/blob/HEAD/LICENSE)",
"tag_prefix": "v",
"default_major_version": "3",
"platform": {

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/koalaman/shellcheck",
"website": "https://www.shellcheck.net",
"tag_prefix": "v",
"bin": "${package}-v${version}/${package}${exe}",
"platform": {

View File

@@ -1,5 +1,6 @@
{
"repository": "https://github.com/rust-mobile/xbuild",
"license_markdown": "[Apache-2.0 OR MIT](https://github.com/rust-mobile/xbuild/blob/268939a99a50d7927bce3e343e5d2ed32eb8b30e/xbuild/Cargo.toml#L7)",
"tag_prefix": "v",
"rust_crate": "${package}",
"asset_name": "${package}-${rust_target_os}-x64${exe}",

379
tools/codegen/src/lib.rs Normal file
View File

@@ -0,0 +1,379 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::{
cmp::{self, Reverse},
collections::BTreeMap,
env, fmt,
path::{Path, PathBuf},
slice,
str::FromStr,
};
use anyhow::Result;
use serde::{
de::{self, Deserialize, Deserializer},
ser::{Serialize, Serializer},
};
use serde_derive::{Deserialize, Serialize};
#[must_use]
pub fn workspace_root() -> PathBuf {
let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
dir.pop(); // codegen
dir.pop(); // tools
dir
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Version {
pub major: Option<u64>,
pub minor: Option<u64>,
pub patch: Option<u64>,
pub pre: semver::Prerelease,
pub build: semver::BuildMetadata,
}
impl Version {
#[must_use]
pub fn omitted(major: u64, minor: Option<u64>) -> Self {
Self {
major: Some(major),
minor,
patch: None,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
}
}
#[must_use]
pub fn latest() -> Self {
Self {
major: None,
minor: None,
patch: None,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
}
}
#[must_use]
pub fn to_semver(&self) -> Option<semver::Version> {
Some(semver::Version {
major: self.major?,
minor: self.minor?,
patch: self.patch?,
pre: self.pre.clone(),
build: self.build.clone(),
})
}
}
impl From<semver::Version> for Version {
fn from(v: semver::Version) -> Self {
Self {
major: Some(v.major),
minor: Some(v.minor),
patch: Some(v.patch),
pre: v.pre,
build: v.build,
}
}
}
impl PartialOrd for Version {
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Version {
fn cmp(&self, other: &Self) -> cmp::Ordering {
pub(crate) fn convert(v: &Version) -> semver::Version {
semver::Version {
major: v.major.unwrap_or(u64::MAX),
minor: v.minor.unwrap_or(u64::MAX),
patch: v.patch.unwrap_or(u64::MAX),
pre: v.pre.clone(),
build: v.build.clone(),
}
}
convert(self).cmp(&convert(other))
}
}
impl fmt::Display for Version {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Some(major) = self.major else {
f.write_str("latest")?;
return Ok(());
};
f.write_str(&major.to_string())?;
let Some(minor) = self.minor else {
return Ok(());
};
f.write_str(".")?;
f.write_str(&minor.to_string())?;
let Some(patch) = self.patch else {
return Ok(());
};
f.write_str(".")?;
f.write_str(&patch.to_string())?;
if !self.pre.is_empty() {
f.write_str("-")?;
f.write_str(&self.pre)?;
}
if !self.build.is_empty() {
f.write_str("+")?;
f.write_str(&self.build)?;
}
Ok(())
}
}
impl FromStr for Version {
type Err = semver::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s == "latest" {
return Ok(Self::latest());
}
match s.parse::<semver::Version>() {
Ok(v) => Ok(v.into()),
Err(e) => match s.parse::<semver::Comparator>() {
Ok(v) => Ok(Self {
major: Some(v.major),
minor: v.minor,
patch: v.patch,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
}),
Err(_e) => Err(e),
},
}
}
}
impl Serialize for Version {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
String::serialize(&self.to_string(), serializer)
}
}
impl<'de> Deserialize<'de> for Version {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
String::deserialize(deserializer)?.parse().map_err(de::Error::custom)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Manifests {
pub rust_crate: Option<String>,
pub template: Option<ManifestTemplate>,
/// Markdown for the licenses.
pub license_markdown: String,
#[serde(flatten)]
pub map: BTreeMap<Reverse<Version>, ManifestRef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ManifestRef {
Ref { version: Version },
Real(Manifest),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Manifest {
#[serde(flatten)]
pub download_info: BTreeMap<HostPlatform, ManifestDownloadInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ManifestDownloadInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub checksum: String,
/// Path to binaries in archive. Default to `${tool}${exe}`.
#[serde(skip_serializing_if = "Option::is_none")]
pub bin: Option<StringOrArray>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ManifestTemplate {
#[serde(flatten)]
pub download_info: BTreeMap<HostPlatform, ManifestTemplateDownloadInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ManifestTemplateDownloadInfo {
pub url: String,
/// Path to binaries in archive. Default to `${tool}${exe}`.
#[serde(skip_serializing_if = "Option::is_none")]
pub bin: Option<StringOrArray>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BaseManifest {
/// Link to the GitHub repository.
pub repository: String,
/// Alternative link for the project. Automatically detected if possible.
pub website: Option<String>,
/// Markdown syntax for links to licenses. Automatically detected if possible.
pub license_markdown: Option<String>,
/// Prefix of release tag.
pub tag_prefix: String,
/// Crate name, if this is Rust crate.
pub rust_crate: Option<String>,
pub default_major_version: Option<String>,
/// Asset name patterns.
pub asset_name: Option<StringOrArray>,
/// Path to binaries in archive. Default to `${tool}${exe}`.
pub bin: Option<StringOrArray>,
pub signing: Option<Signing>,
#[serde(default)]
pub broken: Vec<semver::Version>,
pub platform: BTreeMap<HostPlatform, BaseManifestPlatformInfo>,
pub version_range: Option<String>,
}
impl BaseManifest {
/// Validate the manifest.
// The panic is an assert
#[allow(clippy::missing_panics_doc)]
pub fn validate(&self) {
for bin in self.bin.iter().chain(self.platform.values().flat_map(|m| &m.bin)) {
assert!(!bin.as_slice().is_empty());
for bin in bin.as_slice() {
let file_name = Path::new(bin).file_name().unwrap().to_str().unwrap();
if !self.repository.ends_with("/xbuild") {
assert!(
!(file_name.contains("${version") || file_name.contains("${rust")),
"{bin}"
);
}
}
}
}
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Signing {
pub kind: SigningKind,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
pub enum SigningKind {
/// algorithm: minisign
/// public key: package.metadata.binstall.signing.pubkey at Cargo.toml
/// <https://github.com/cargo-bins/cargo-binstall/blob/HEAD/SIGNING.md>
MinisignBinstall,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BaseManifestPlatformInfo {
/// Asset name patterns. Default to the value at `BaseManifest::asset_name`.
pub asset_name: Option<StringOrArray>,
/// Path to binaries in archive. Default to the value at `BaseManifest::bin`.
pub bin: Option<StringOrArray>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum StringOrArray {
String(String),
Array(Vec<String>),
}
impl StringOrArray {
#[must_use]
pub fn as_slice(&self) -> &[String] {
match self {
Self::String(s) => slice::from_ref(s),
Self::Array(v) => v,
}
}
#[must_use]
pub fn map(&self, mut f: impl FnMut(&String) -> String) -> Self {
match self {
Self::String(s) => Self::String(f(s)),
Self::Array(v) => Self::Array(v.iter().map(f).collect()),
}
}
}
/// GitHub Actions Runner supports Linux (x86_64, aarch64, arm), Windows (x86_64, aarch64),
/// and macOS (x86_64, aarch64).
/// https://github.com/actions/runner/blob/v2.315.0/.github/workflows/build.yml#L21
/// https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners#supported-architectures-and-operating-systems-for-self-hosted-runners
///
/// Note:
/// - Static-linked binaries compiled for linux-musl will also work on linux-gnu systems and are
/// usually preferred over linux-gnu binaries because they can avoid glibc version issues.
/// (rustc enables statically linking for linux-musl by default, except for mips.)
/// - Binaries compiled for x86_64 macOS will usually also work on aarch64 macOS.
/// - Binaries compiled for x86_64 Windows will usually also work on aarch64 Windows 11+.
/// - Ignore arm for now, as we need to consider the version and whether hard-float is supported.
/// https://github.com/rust-lang/rustup/pull/593
/// https://github.com/cross-rs/cross/pull/1018
/// Does it seem only armv7l+ is supported?
/// https://github.com/actions/runner/blob/v2.315.0/src/Misc/externals.sh#L189
/// https://github.com/actions/runner/issues/688
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum HostPlatform {
x86_64_linux_gnu,
x86_64_linux_musl,
x86_64_macos,
x86_64_windows,
aarch64_linux_gnu,
aarch64_linux_musl,
aarch64_macos,
aarch64_windows,
}
impl HostPlatform {
#[must_use]
pub fn rust_target(self) -> &'static str {
match self {
Self::x86_64_linux_gnu => "x86_64-unknown-linux-gnu",
Self::x86_64_linux_musl => "x86_64-unknown-linux-musl",
Self::x86_64_macos => "x86_64-apple-darwin",
Self::x86_64_windows => "x86_64-pc-windows-msvc",
Self::aarch64_linux_gnu => "aarch64-unknown-linux-gnu",
Self::aarch64_linux_musl => "aarch64-unknown-linux-musl",
Self::aarch64_macos => "aarch64-apple-darwin",
Self::aarch64_windows => "aarch64-pc-windows-msvc",
}
}
#[must_use]
pub fn rust_target_arch(self) -> &'static str {
match self {
Self::aarch64_linux_gnu
| Self::aarch64_linux_musl
| Self::aarch64_macos
| Self::aarch64_windows => "aarch64",
Self::x86_64_linux_gnu
| Self::x86_64_linux_musl
| Self::x86_64_macos
| Self::x86_64_windows => "x86_64",
}
}
#[must_use]
pub fn rust_target_os(self) -> &'static str {
match self {
Self::aarch64_linux_gnu
| Self::aarch64_linux_musl
| Self::x86_64_linux_gnu
| Self::x86_64_linux_musl => "linux",
Self::aarch64_macos | Self::x86_64_macos => "macos",
Self::aarch64_windows | Self::x86_64_windows => "windows",
}
}
#[must_use]
pub fn exe_suffix(self) -> &'static str {
match self {
Self::x86_64_windows | Self::aarch64_windows => ".exe",
_ => "",
}
}
}

View File

@@ -1,26 +1,23 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::{
cmp::{self, Reverse},
cmp::Reverse,
collections::{BTreeMap, BTreeSet},
env,
ffi::OsStr,
fmt,
io::Read,
path::{Path, PathBuf},
slice,
str::FromStr,
path::Path,
time::Duration,
};
use anyhow::{bail, Context as _, Result};
use fs_err as fs;
use serde::{
de::{self, Deserialize, Deserializer},
ser::{Serialize, Serializer},
use install_action_internal_codegen::{
workspace_root, BaseManifest, HostPlatform, Manifest, ManifestDownloadInfo, ManifestRef,
ManifestTemplate, ManifestTemplateDownloadInfo, Manifests, Signing, SigningKind, Version,
};
use serde_derive::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use spdx::expression::{ExprNode, ExpressionReq, Operator};
fn main() -> Result<()> {
let args: Vec<_> = env::args().skip(1).collect();
@@ -31,6 +28,7 @@ fn main() -> Result<()> {
std::process::exit(1);
}
let package = &args[0];
let skip_existing_manifest_versions = std::env::var("SKIP_EXISTING_MANIFEST_VERSIONS").is_ok();
let workspace_root = &workspace_root();
let manifest_path = &workspace_root.join("manifests").join(format!("{package}.json"));
@@ -45,7 +43,12 @@ fn main() -> Result<()> {
let repo = base_info
.repository
.strip_prefix("https://github.com/")
.context("repository must be starts with https://github.com/")?;
.context("repository must start with https://github.com/")?;
eprintln!("downloading metadata from https://github.com/{repo}");
let repo_info: github::RepoMetadata =
download_github(&format!("https://api.github.com/repos/{repo}"))?.into_json()?;
eprintln!("downloading releases of https://github.com/{repo} from https://api.github.com/repos/{repo}/releases");
let mut releases: github::Releases = vec![];
@@ -53,7 +56,7 @@ fn main() -> Result<()> {
// is greater than 100, multiple fetches are needed.
for page in 1.. {
let per_page = 100;
let mut r: github::Releases = download(&format!(
let mut r: github::Releases = download_github(&format!(
"https://api.github.com/repos/{repo}/releases?per_page={per_page}&page={page}"
))?
.into_json()?;
@@ -81,6 +84,7 @@ fn main() -> Result<()> {
.collect();
let mut crates_io_info = None;
let mut crates_io_version_detail = None;
base_info.rust_crate = base_info
.rust_crate
.as_ref()
@@ -88,10 +92,29 @@ fn main() -> Result<()> {
.transpose()?;
if let Some(crate_name) = &base_info.rust_crate {
eprintln!("downloading crate info from https://crates.io/api/v1/crates/{crate_name}");
crates_io_info = Some(
download(&format!("https://crates.io/api/v1/crates/{crate_name}"))?
.into_json::<crates_io::Crate>()?,
let info = download(&format!("https://crates.io/api/v1/crates/{crate_name}"))?
.into_json::<crates_io::Crate>()?;
let latest_version = &info.versions[0].num;
crates_io_version_detail = Some(
download(&format!("https://crates.io/api/v1/crates/{crate_name}/{latest_version}"))?
.into_json::<crates_io::VersionMetadata>()?
.version,
);
if let Some(crate_repository) = info.crate_.repository.clone() {
// cargo-dinghy is fixed at https://github.com/sonos/dinghy/pull/231, but not yet released
if crate_name != "cargo-dinghy"
&& !crate_repository
.to_lowercase()
.starts_with(&base_info.repository.to_lowercase())
{
panic!("repository {crate_repository} from crates.io differs from base manifest");
}
} else if crate_name != "zola" {
panic!("crate metadata does not include a repository");
}
crates_io_info = Some(info);
}
let mut manifests: Manifests = Manifests::default();
@@ -129,6 +152,44 @@ fn main() -> Result<()> {
Err(e) => eprintln!("failed to load old manifest: {e}"),
}
}
// Check website
if let Some(website) = base_info.website {
if website.is_empty() || website == base_info.repository {
panic!("Please do not put the repository in website, or set website to an empty value");
}
}
// Populate license_markdown
if let Some(license_markdown) = base_info.license_markdown {
if license_markdown.is_empty() {
panic!("license_markdown can not be an empty value");
}
manifests.license_markdown = license_markdown;
} else if let Some(detail) = crates_io_version_detail {
if let Some(license) = detail.license {
eprintln!("Trying to using license '{license}' from crates.io ...");
if let Some(license_markdown) =
get_license_markdown(&license, &repo.to_string(), &repo_info.default_branch)
{
manifests.license_markdown = license_markdown;
}
}
} else if let Some(license) = repo_info.license {
if let Some(license) = license.spdx_id {
eprintln!("Trying to using license '{license}' from github.com ...");
if let Some(license_markdown) =
get_license_markdown(&license, &repo.to_string(), &repo_info.default_branch)
{
manifests.license_markdown = license_markdown;
}
}
}
if manifests.license_markdown.is_empty() {
panic!("Unable to determine license_markdown; set manually")
}
let version_req: Option<semver::VersionReq> = match args.get(1) {
_ if latest_only => {
let req = format!("={}", releases.first_key_value().unwrap().0 .0).parse()?;
@@ -179,6 +240,13 @@ fn main() -> Result<()> {
continue;
}
let reverse_semver = Reverse(semver_version.clone().into());
if skip_existing_manifest_versions && manifests.map.contains_key(&reverse_semver) {
eprintln!("Skipping {semver_version} already in manifest");
continue;
};
let mut download_info = BTreeMap::new();
let mut pubkey = None;
for (&platform, base_download_info) in &base_info.platform {
@@ -224,7 +292,7 @@ fn main() -> Result<()> {
eprintln!("already downloaded");
fs::File::open(download_cache)?.read_to_end(&mut buf)?;
} else {
download(&url)?.into_reader().read_to_end(&mut buf)?;
download_github(&url)?.into_reader().read_to_end(&mut buf)?;
eprintln!("download complete");
fs::write(download_cache, &buf)?;
}
@@ -246,7 +314,7 @@ fn main() -> Result<()> {
eprintln!("already downloaded");
minisign_verify::Signature::from_file(sig_download_cache)?
} else {
let buf = download(&url)?.into_string()?;
let buf = download_github(&url)?.into_string()?;
eprintln!("download complete");
fs::write(sig_download_cache, &buf)?;
minisign_verify::Signature::decode(&buf)?
@@ -357,10 +425,7 @@ fn main() -> Result<()> {
if semver_version.pre.is_empty() {
semver_versions.insert(semver_version.clone());
}
manifests.map.insert(
Reverse(semver_version.clone().into()),
ManifestRef::Real(Manifest { download_info }),
);
manifests.map.insert(reverse_semver, ManifestRef::Real(Manifest { download_info }));
}
if has_build_metadata {
eprintln!(
@@ -483,13 +548,6 @@ fn main() -> Result<()> {
Ok(())
}
fn workspace_root() -> PathBuf {
let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
dir.pop(); // codegen
dir.pop(); // tools
dir
}
fn replace_vars(
s: &str,
package: &str,
@@ -527,7 +585,9 @@ fn replace_vars(
Ok(s)
}
fn download(url: &str) -> Result<ureq::Response> {
/// Download using GITHUB_TOKEN.
#[allow(clippy::missing_panics_doc)]
fn download_github(url: &str) -> Result<ureq::Response> {
let mut token = env::var("GITHUB_TOKEN").ok().filter(|v| !v.is_empty());
let mut retry = 0;
let max_retry = 6;
@@ -554,345 +614,180 @@ fn download(url: &str) -> Result<ureq::Response> {
Err(last_error.unwrap().into())
}
#[derive(Debug, Clone, PartialEq, Eq)]
struct Version {
major: Option<u64>,
minor: Option<u64>,
patch: Option<u64>,
pre: semver::Prerelease,
build: semver::BuildMetadata,
#[allow(clippy::missing_panics_doc)]
pub fn github_head(url: &str) -> Result<()> {
eprintln!("fetching head of {url} ..");
let mut token = env::var("GITHUB_TOKEN").ok().filter(|v| !v.is_empty());
let mut retry = 0;
let max_retry = 2;
let mut last_error;
loop {
let mut req = ureq::head(url);
if let Some(token) = &token {
req = req.set("Authorization", token);
}
match req.call() {
Ok(_) => return Ok(()),
Err(e) => last_error = Some(e),
}
if retry == max_retry / 2 && token.is_some() {
token = None;
}
retry += 1;
if retry > max_retry {
break;
}
eprintln!("head of {url} failed; retrying after {}s ({retry}/{max_retry})", retry * 2);
std::thread::sleep(Duration::from_secs(retry * 2));
}
Err(last_error.unwrap().into())
}
impl Version {
fn omitted(major: u64, minor: Option<u64>) -> Self {
Self {
major: Some(major),
minor,
patch: None,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
/// Download without using GITHUB_TOKEN.
#[allow(clippy::missing_panics_doc)]
pub fn download(url: &str) -> Result<ureq::Response> {
let mut retry = 0;
let max_retry = 6;
let mut last_error;
loop {
let req = ureq::get(url);
match req.call() {
Ok(res) => return Ok(res),
Err(e) => last_error = Some(e),
}
retry += 1;
if retry > max_retry {
break;
}
eprintln!("download of {url} failed; retrying after {}s ({retry}/{max_retry})", retry * 2);
std::thread::sleep(Duration::from_secs(retry * 2));
}
Err(last_error.unwrap().into())
}
#[must_use]
fn create_github_raw_link(repository: &String, branch: &String, filename: &String) -> String {
format!("https://raw.githubusercontent.com/{repository}/{branch}/{filename}")
}
#[must_use]
fn create_github_link(repository: &String, branch: &String, filename: &String) -> String {
format!("https://github.com/{repository}/blob/{branch}/{filename}")
}
#[must_use]
fn get_license_markdown(spdx_expr: &str, repo: &String, default_branch: &String) -> Option<String> {
// TODO: use https://docs.rs/spdx/latest/spdx/expression/struct.Expression.html#method.canonicalize ?
let expr = spdx::Expression::parse_mode(spdx_expr, spdx::ParseMode::LAX).unwrap();
let mut op = None;
let mut license_ids: Vec<(&spdx::LicenseId, Option<&spdx::ExceptionId>)> = vec![];
for node in expr.iter() {
match node {
ExprNode::Req(ExpressionReq {
req:
spdx::LicenseReq {
license: spdx::LicenseItem::Spdx { id, or_later },
exception,
..
},
..
}) => {
if *or_later {
panic!("need to handle or_later");
}
if let Some(exception_id) = exception {
license_ids.push((id, Some(exception_id)));
} else {
license_ids.push((id, None));
}
}
ExprNode::Op(current_op) => {
if op.is_some() && op != Some(current_op) {
panic!("SPDX too complex");
}
op = Some(current_op);
}
ExprNode::Req(_) => {}
}
}
fn latest() -> Self {
Self {
major: None,
minor: None,
patch: None,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
}
}
fn to_semver(&self) -> Option<semver::Version> {
Some(semver::Version {
major: self.major?,
minor: self.minor?,
patch: self.patch?,
pre: self.pre.clone(),
build: self.build.clone(),
})
}
}
impl From<semver::Version> for Version {
fn from(v: semver::Version) -> Self {
Self {
major: Some(v.major),
minor: Some(v.minor),
patch: Some(v.patch),
pre: v.pre,
build: v.build,
}
}
}
impl PartialOrd for Version {
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Version {
fn cmp(&self, other: &Self) -> cmp::Ordering {
fn convert(v: &Version) -> semver::Version {
semver::Version {
major: v.major.unwrap_or(u64::MAX),
minor: v.minor.unwrap_or(u64::MAX),
patch: v.patch.unwrap_or(u64::MAX),
pre: v.pre.clone(),
build: v.build.clone(),
match license_ids.len() {
0 => panic!("No licenses"),
1 => {
let (license_id, exception_id) = license_ids.first().unwrap();
let license_name = if let Some(exception_id) = exception_id {
format!("{} WITH {}", license_id.name, exception_id.name)
} else {
license_id.name.to_string()
};
let name = license_id.name.split('-').next().unwrap().to_ascii_uppercase();
for filename in
["LICENSE".to_string(), format!("LICENSE-{name}"), "LICENSE.md".to_string()]
{
let url = create_github_raw_link(repo, default_branch, &filename);
if github_head(&url).is_ok() {
let url = create_github_link(repo, default_branch, &filename);
return Some(format!("[{license_name}]({url})"));
}
}
}
convert(self).cmp(&convert(other))
}
}
impl fmt::Display for Version {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Some(major) = self.major else {
f.write_str("latest")?;
return Ok(());
};
f.write_str(&major.to_string())?;
let Some(minor) = self.minor else {
return Ok(());
};
f.write_str(".")?;
f.write_str(&minor.to_string())?;
let Some(patch) = self.patch else {
return Ok(());
};
f.write_str(".")?;
f.write_str(&patch.to_string())?;
if !self.pre.is_empty() {
f.write_str("-")?;
f.write_str(&self.pre)?;
}
if !self.build.is_empty() {
f.write_str("+")?;
f.write_str(&self.build)?;
}
Ok(())
}
}
impl FromStr for Version {
type Err = semver::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s == "latest" {
return Ok(Self::latest());
}
match s.parse::<semver::Version>() {
Ok(v) => Ok(v.into()),
Err(e) => match s.parse::<semver::Comparator>() {
Ok(v) => Ok(Self {
major: Some(v.major),
minor: v.minor,
patch: v.patch,
pre: semver::Prerelease::default(),
build: semver::BuildMetadata::default(),
}),
Err(_e) => Err(e),
},
}
}
}
impl Serialize for Version {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
String::serialize(&self.to_string(), serializer)
}
}
impl<'de> Deserialize<'de> for Version {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
String::deserialize(deserializer)?.parse().map_err(de::Error::custom)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
struct Manifests {
rust_crate: Option<String>,
template: Option<ManifestTemplate>,
#[serde(flatten)]
map: BTreeMap<Reverse<Version>, ManifestRef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
enum ManifestRef {
Ref { version: Version },
Real(Manifest),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct Manifest {
#[serde(flatten)]
download_info: BTreeMap<HostPlatform, ManifestDownloadInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct ManifestDownloadInfo {
#[serde(skip_serializing_if = "Option::is_none")]
url: Option<String>,
checksum: String,
/// Path to binaries in archive. Default to `${tool}${exe}`.
#[serde(skip_serializing_if = "Option::is_none")]
bin: Option<StringOrArray>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct ManifestTemplate {
#[serde(flatten)]
download_info: BTreeMap<HostPlatform, ManifestTemplateDownloadInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct ManifestTemplateDownloadInfo {
url: String,
/// Path to binaries in archive. Default to `${tool}${exe}`.
#[serde(skip_serializing_if = "Option::is_none")]
bin: Option<StringOrArray>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
struct BaseManifest {
/// Link to the GitHub repository.
repository: String,
/// Prefix of release tag.
tag_prefix: String,
/// Crate name, if this is Rust crate.
rust_crate: Option<String>,
default_major_version: Option<String>,
/// Asset name patterns.
asset_name: Option<StringOrArray>,
/// Path to binaries in archive. Default to `${tool}${exe}`.
bin: Option<StringOrArray>,
signing: Option<Signing>,
#[serde(default)]
broken: Vec<semver::Version>,
platform: BTreeMap<HostPlatform, BaseManifestPlatformInfo>,
version_range: Option<String>,
}
impl BaseManifest {
fn validate(&self) {
for bin in self.bin.iter().chain(self.platform.values().flat_map(|m| &m.bin)) {
assert!(!bin.as_slice().is_empty());
for bin in bin.as_slice() {
let file_name = Path::new(bin).file_name().unwrap().to_str().unwrap();
if !self.repository.ends_with("/xbuild") {
assert!(
!(file_name.contains("${version") || file_name.contains("${rust")),
"{bin}"
);
len => {
let mut license_markdowns: Vec<String> = vec![];
for (license_id, exception_id) in &license_ids {
let name = license_id.name.split('-').next().unwrap().to_ascii_uppercase();
let filename = format!("LICENSE-{name}");
let url = create_github_raw_link(repo, default_branch, &filename);
let license_name = if let Some(exception_id) = exception_id {
format!("{} WITH {}", license_id.name, exception_id.name)
} else {
license_id.name.to_string()
};
if github_head(&url).is_ok() {
let url = create_github_link(repo, default_branch, &filename);
license_markdowns.push(format!("[{license_name}]({url})"));
}
}
if license_markdowns.is_empty() {
panic!("Unable to find any license files in the repo for licenses {license_ids:?}");
}
if license_markdowns.len() != len {
panic!("Unable to find license files in the repo for all licenses {license_ids:?}; found {license_markdowns:?}");
}
match op {
None => panic!("op expected"),
Some(Operator::Or) => {
return Some(license_markdowns.join(" OR "));
}
Some(Operator::And) => {
return Some(license_markdowns.join(" AND "));
}
}
}
}
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
struct Signing {
kind: SigningKind,
}
#[derive(Debug, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
enum SigningKind {
/// algorithm: minisign
/// public key: package.metadata.binstall.signing.pubkey at Cargo.toml
/// <https://github.com/cargo-bins/cargo-binstall/blob/HEAD/SIGNING.md>
MinisignBinstall,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
struct BaseManifestPlatformInfo {
/// Asset name patterns. Default to the value at `BaseManifest::asset_name`.
asset_name: Option<StringOrArray>,
/// Path to binaries in archive. Default to the value at `BaseManifest::bin`.
bin: Option<StringOrArray>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
enum StringOrArray {
String(String),
Array(Vec<String>),
}
impl StringOrArray {
fn as_slice(&self) -> &[String] {
match self {
Self::String(s) => slice::from_ref(s),
Self::Array(v) => v,
}
}
fn map(&self, mut f: impl FnMut(&String) -> String) -> Self {
match self {
Self::String(s) => Self::String(f(s)),
Self::Array(v) => Self::Array(v.iter().map(f).collect()),
}
}
}
/// GitHub Actions Runner supports Linux (x86_64, aarch64, arm), Windows (x86_64, aarch64),
/// and macOS (x86_64, aarch64).
/// https://github.com/actions/runner/blob/v2.315.0/.github/workflows/build.yml#L21
/// https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners#supported-architectures-and-operating-systems-for-self-hosted-runners
///
/// Note:
/// - Static-linked binaries compiled for linux-musl will also work on linux-gnu systems and are
/// usually preferred over linux-gnu binaries because they can avoid glibc version issues.
/// (rustc enables statically linking for linux-musl by default, except for mips.)
/// - Binaries compiled for x86_64 macOS will usually also work on aarch64 macOS.
/// - Binaries compiled for x86_64 Windows will usually also work on aarch64 Windows 11+.
/// - Ignore arm for now, as we need to consider the version and whether hard-float is supported.
/// https://github.com/rust-lang/rustup/pull/593
/// https://github.com/cross-rs/cross/pull/1018
/// Does it seem only armv7l+ is supported?
/// https://github.com/actions/runner/blob/v2.315.0/src/Misc/externals.sh#L189
/// https://github.com/actions/runner/issues/688
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
enum HostPlatform {
x86_64_linux_gnu,
x86_64_linux_musl,
x86_64_macos,
x86_64_windows,
aarch64_linux_gnu,
aarch64_linux_musl,
aarch64_macos,
aarch64_windows,
}
impl HostPlatform {
fn rust_target(self) -> &'static str {
match self {
Self::x86_64_linux_gnu => "x86_64-unknown-linux-gnu",
Self::x86_64_linux_musl => "x86_64-unknown-linux-musl",
Self::x86_64_macos => "x86_64-apple-darwin",
Self::x86_64_windows => "x86_64-pc-windows-msvc",
Self::aarch64_linux_gnu => "aarch64-unknown-linux-gnu",
Self::aarch64_linux_musl => "aarch64-unknown-linux-musl",
Self::aarch64_macos => "aarch64-apple-darwin",
Self::aarch64_windows => "aarch64-pc-windows-msvc",
}
}
fn rust_target_arch(self) -> &'static str {
match self {
Self::aarch64_linux_gnu
| Self::aarch64_linux_musl
| Self::aarch64_macos
| Self::aarch64_windows => "aarch64",
Self::x86_64_linux_gnu
| Self::x86_64_linux_musl
| Self::x86_64_macos
| Self::x86_64_windows => "x86_64",
}
}
fn rust_target_os(self) -> &'static str {
match self {
Self::aarch64_linux_gnu
| Self::aarch64_linux_musl
| Self::x86_64_linux_gnu
| Self::x86_64_linux_musl => "linux",
Self::aarch64_macos | Self::x86_64_macos => "macos",
Self::aarch64_windows | Self::x86_64_windows => "windows",
}
}
fn exe_suffix(self) -> &'static str {
match self {
Self::x86_64_windows | Self::aarch64_windows => ".exe",
_ => "",
}
}
None
}
mod github {
use serde_derive::Deserialize;
// https://api.github.com/repos/<repo>
#[derive(Debug, Deserialize)]
pub(crate) struct RepoMetadata {
#[serde(default)]
#[allow(dead_code)]
pub(crate) homepage: Option<String>,
#[serde(default)]
pub(crate) license: Option<RepoLicense>,
pub(crate) default_branch: String,
}
#[derive(Debug, Deserialize)]
pub(crate) struct RepoLicense {
#[serde(default)]
pub(crate) spdx_id: Option<String>,
}
// https://api.github.com/repos/<repo>/releases
pub(crate) type Releases = Vec<Release>;
@@ -919,6 +814,8 @@ mod crates_io {
#[derive(Debug, Deserialize)]
pub(crate) struct Crate {
pub(crate) versions: Vec<Version>,
#[serde(rename = "crate")]
pub(crate) crate_: CrateMetadata,
}
#[derive(Debug, Deserialize)]
@@ -928,6 +825,24 @@ mod crates_io {
pub(crate) num: semver::Version,
pub(crate) yanked: bool,
}
#[derive(Debug, Deserialize)]
pub(crate) struct CrateMetadata {
#[allow(dead_code)]
pub(crate) homepage: Option<String>,
pub(crate) repository: Option<String>,
}
// https://crates.io/api/v1/crates/<crate>/<version>
#[derive(Debug, Deserialize)]
pub(crate) struct VersionMetadata {
pub(crate) version: VersionMetadataDetail,
}
#[derive(Debug, Deserialize)]
pub(crate) struct VersionMetadataDetail {
pub(crate) license: Option<String>,
}
}
mod cargo_manifest {

View File

@@ -0,0 +1,238 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT
use std::{env, fmt, io::Write, path::PathBuf};
use anyhow::Result;
use fs_err as fs;
use install_action_internal_codegen::{workspace_root, BaseManifest, Manifests};
const HEADER: &str = "# Tools
This is a list of tools that are installed from manifests managed in this action.
If a tool not included in the list below is specified, this action uses [cargo-binstall] as a fallback.
> If `$CARGO_HOME/bin` is not available, Rust-related binaries will be installed to `$HOME/.cargo/bin`.<br>
> If `$HOME/.cargo/bin` is not available, Rust-related binaries will be installed to `/usr/local/bin`.<br>
> If `/usr/local/bin` is not available, binaries will be installed to `$HOME/.install-action/bin`.<br>
| Name | Where binaries will be installed | Where will it be installed from | Supported platform | License |
| ---- | -------------------------------- | ------------------------------- | ------------------ | ------- |
";
const FOOTER: &str = "
[cargo-binstall]: https://github.com/cargo-bins/cargo-binstall
";
fn main() -> Result<()> {
let args: Vec<_> = env::args().skip(1).collect();
if !args.is_empty() || args.iter().any(|arg| arg.starts_with('-')) {
println!(
"USAGE: cargo run --manifest-path tools/codegen/Cargo.toml --bin generate-tools-markdown --release"
);
std::process::exit(1);
}
let workspace_root = workspace_root();
let mut manifest_dir = workspace_root.clone();
manifest_dir.push("manifests");
let mut base_info_dir = workspace_root.clone();
base_info_dir.push("tools");
base_info_dir.push("codegen");
base_info_dir.push("base");
let mut paths: Vec<_> =
fs::read_dir(manifest_dir.clone()).unwrap().map(|r| r.unwrap()).collect();
paths.sort_by_key(fs_err::DirEntry::path);
let mut tools = vec![
MarkdownEntry {
name: "nextest".to_string(),
alias: "cargo-nextest".to_string().into(),
website: "https://nexte.st/".to_string(),
installed_to: InstalledTo::Cargo,
installed_from: InstalledFrom::Binstall,
platforms: Platforms::all(),
repository: "https://github.com/nextest-rs/nextest".to_string(),
license_markdown: "[Apache-2.0](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-APACHE) OR [MIT](https://github.com/nextest-rs/nextest/blob/HEAD/LICENSE-MIT)".to_string()
},
MarkdownEntry {
name: "valgrind".to_string(),
alias: None,
website: "https://valgrind.org/".to_string(),
installed_to: InstalledTo::Snap,
installed_from: InstalledFrom::Snap,
platforms: Platforms {
linux: true,
..Default::default()
},
repository: "https://sourceware.org/git/valgrind.git".to_string(),
license_markdown: "[GPL-2.0](https://sourceware.org/git/?p=valgrind.git;a=blob;f=COPYING;hb=HEAD)".to_string()
}
];
for path in paths {
let file_name = path.file_name();
let mut name = PathBuf::from(file_name.clone());
name.set_extension("");
let name = name.to_string_lossy().to_string();
let base_info: BaseManifest =
serde_json::from_slice(&fs::read(base_info_dir.join(file_name.clone()))?)?;
let manifests: Manifests =
serde_json::from_slice(&fs::read(manifest_dir.join(file_name))?)?;
let website = match base_info.website {
Some(website) => website,
None => base_info.repository.clone(),
};
let repository = base_info.repository;
let installed_to =
if manifests.rust_crate.is_some() { InstalledTo::Cargo } else { InstalledTo::UsrLocal };
let installed_from = InstalledFrom::GitHubRelease;
let mut platforms = Platforms::default();
for platform in base_info.platform.keys() {
match platform.rust_target_os() {
"linux" => platforms.linux = true,
"macos" => platforms.macos = true,
"windows" => platforms.windows = true,
&_ => todo!(),
}
}
let license_markdown = manifests.license_markdown;
let readme_entry = MarkdownEntry {
name,
website,
repository,
installed_to,
installed_from,
platforms,
license_markdown,
alias: None,
};
tools.push(readme_entry);
}
tools.sort_by(|x, y| x.name.cmp(&y.name));
let mut markdown_file = workspace_root.clone();
markdown_file.push("TOOLS.md");
let file = std::fs::File::create(markdown_file).expect("Unable to create file");
let mut file = std::io::BufWriter::new(file);
file.write_all(HEADER.as_bytes()).expect("Unable to write header");
for tool in tools {
file.write_all(tool.to_string().as_bytes()).expect("Unable to write entry");
}
file.write_all(FOOTER.as_bytes()).expect("Unable to write footer");
Ok(())
}
#[derive(Debug)]
struct MarkdownEntry {
name: String,
alias: Option<String>,
website: String,
repository: String,
installed_to: InstalledTo,
installed_from: InstalledFrom,
platforms: Platforms,
license_markdown: String,
}
#[derive(Debug, Eq, PartialEq)]
enum InstalledFrom {
Binstall,
GitHubRelease,
Snap,
}
#[derive(Debug, Default, Eq, PartialEq)]
struct Platforms {
linux: bool,
macos: bool,
windows: bool,
}
impl Platforms {
fn all() -> Self {
Self { linux: true, macos: true, windows: true }
}
}
impl fmt::Display for Platforms {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut platform_names: Vec<&str> = vec![];
if self.linux {
platform_names.push("Linux");
}
if self.macos {
platform_names.push("macOS");
}
if self.windows {
platform_names.push("Windows");
}
let name = platform_names.join(", ");
f.write_str(&name)?;
Ok(())
}
}
#[derive(Debug, Eq, PartialEq)]
enum InstalledTo {
Cargo,
Snap,
UsrLocal,
}
impl fmt::Display for InstalledTo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
InstalledTo::Cargo => f.write_str("`$CARGO_HOME/bin`")?,
InstalledTo::Snap => f.write_str("`/snap/bin`")?,
InstalledTo::UsrLocal => f.write_str("`/usr/local/bin`")?,
}
Ok(())
}
}
impl fmt::Display for MarkdownEntry {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = format!("| [**{}**]({}) ", self.name, self.website);
f.write_str(&name)?;
if let Some(alias) = self.alias.clone() {
let alias = format!("(alias: `{alias}`)");
f.write_str(&alias)?;
}
f.write_str(&format!("| {} ", self.installed_to))?;
match self.installed_from {
InstalledFrom::GitHubRelease => {
let markdown = format!("| [GitHub Releases]({}/releases) ", self.repository);
f.write_str(&markdown)?;
}
InstalledFrom::Binstall => f.write_str("| `cargo-binstall` ")?,
InstalledFrom::Snap => {
let markdown =
format!("| [snap](https://snapcraft.io/install/{}/ubuntu) ", self.name);
f.write_str(&markdown)?;
}
}
f.write_str(&format!("| {} ", self.platforms))?;
f.write_str(&format!("| {} |\n", self.license_markdown))?;
Ok(())
}
}

View File

@@ -16,7 +16,7 @@ trap 's=$?; echo >&2 "$0: error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}
# - shellcheck
# - npm
# - jq
# - python
# - python 3
# - rustup (if Rust code exists)
# - clang-format (if C/C++ code exists)
#
@@ -40,6 +40,19 @@ check_config() {
error "could not found $1 in the repository root"
fi
}
check_install() {
for tool in "$@"; do
if ! type -P "${tool}" &>/dev/null; then
if [[ "${tool}" == "python3" ]]; then
if type -P python &>/dev/null; then
continue
fi
fi
error "'${tool}' is required to run this check"
return 1
fi
done
}
info() {
echo >&2 "info: $*"
}
@@ -56,6 +69,27 @@ venv() {
shift
"${venv_bin}/${bin}${exe}" "$@"
}
venv_install_yq() {
local py_suffix=''
if type -P python3 &>/dev/null; then
py_suffix='3'
fi
exe=''
venv_bin='.venv/bin'
case "$(uname -s)" in
MINGW* | MSYS* | CYGWIN* | Windows_NT)
exe='.exe'
venv_bin='.venv/Scripts'
;;
esac
if [[ ! -d .venv ]]; then
"python${py_suffix}" -m venv .venv
fi
if [[ ! -e "${venv_bin}/yq${exe}" ]]; then
info "installing yq to ./.venv using pip"
venv "pip${py_suffix}" install yq
fi
}
if [[ $# -gt 0 ]]; then
cat <<EOF
@@ -68,24 +102,23 @@ fi
# Rust (if exists)
if [[ -n "$(git ls-files '*.rs')" ]]; then
info "checking Rust code style"
check_install cargo jq python3
check_config .rustfmt.toml
if type -P rustup &>/dev/null; then
if check_install rustup; then
# `cargo fmt` cannot recognize files not included in the current workspace and modules
# defined inside macros, so run rustfmt directly.
# We need to use nightly rustfmt because we use the unstable formatting options of rustfmt.
rustc_version=$(rustc -vV | grep '^release:' | cut -d' ' -f2)
if [[ "${rustc_version}" == *"nightly"* ]] || [[ "${rustc_version}" == *"dev"* ]]; then
rustup component add rustfmt &>/dev/null
echo "+ rustfmt \$(git ls-files '*.rs')"
info "running \`rustfmt \$(git ls-files '*.rs')\`"
rustfmt $(git ls-files '*.rs')
else
rustup component add rustfmt --toolchain nightly &>/dev/null
echo "+ rustfmt +nightly \$(git ls-files '*.rs')"
info "running \`rustfmt +nightly \$(git ls-files '*.rs')\`"
rustfmt +nightly $(git ls-files '*.rs')
fi
check_diff $(git ls-files '*.rs')
else
error "'rustup' is not installed; skipped Rust code style check"
fi
cast_without_turbofish=$(grep -n -E '\.cast\(\)' $(git ls-files '*.rs') || true)
if [[ -n "${cast_without_turbofish}" ]]; then
@@ -122,11 +155,12 @@ if [[ -n "$(git ls-files '*.rs')" ]]; then
binaries=''
metadata=$(cargo metadata --format-version=1 --no-deps)
has_public_crate=''
venv_install_yq
for id in $(jq <<<"${metadata}" '.workspace_members[]'); do
pkg=$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})")
publish=$(jq <<<"${pkg}" -r '.publish')
manifest_path=$(jq <<<"${pkg}" -r '.manifest_path')
if ! grep -q '^\[lints\]' "${manifest_path}" && ! grep -q '^\[lints\.rust\]' "${manifest_path}"; then
if [[ "$(venv tomlq -c '.lints' "${manifest_path}")" == "null" ]]; then
error "no [lints] table in ${manifest_path} please add '[lints]' with 'workspace = true'"
fi
# Publishing is unrestricted if null, and forbidden if an empty array.
@@ -144,13 +178,14 @@ if [[ -n "$(git ls-files '*.rs')" ]]; then
publish=$(jq <<<"${root_pkg}" -r '.publish')
# Publishing is unrestricted if null, and forbidden if an empty array.
if [[ "${publish}" != "[]" ]]; then
if ! grep -Eq '^exclude = \[.*"/\.\*".*\]' Cargo.toml; then
exclude=$(venv tomlq -r '.package.exclude[]' Cargo.toml)
if ! grep <<<"${exclude}" -Eq '^/\.\*$'; then
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/.*\""
fi
if [[ -e tools ]] && ! grep -Eq '^exclude = \[.*"/tools".*\]' Cargo.toml; then
if [[ -e tools ]] && ! grep <<<"${exclude}" -Eq '^/tools$'; then
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/tools\" if it exists"
fi
if [[ -e target-specs ]] && ! grep -Eq '^exclude = \[.*"/target-specs".*\]' Cargo.toml; then
if [[ -e target-specs ]] && ! grep <<<"${exclude}" -Eq '^/target-specs$'; then
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/target-specs\" if it exists"
fi
fi
@@ -196,12 +231,10 @@ fi
if [[ -n "$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')" ]]; then
info "checking C/C++ code style"
check_config .clang-format
if type -P clang-format &>/dev/null; then
echo "+ clang-format -i \$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')"
if check_install clang-format; then
info "running \`clang-format -i \$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')\`"
clang-format -i $(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')
check_diff $(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')
else
error "'clang-format' is not installed; skipped C/C++ code style check"
fi
elif [[ -e .clang-format ]]; then
error ".clang-format is unused"
@@ -211,64 +244,39 @@ fi
if [[ -n "$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')" ]]; then
info "checking YAML/JavaScript/JSON code style"
check_config .editorconfig
if type -P npm &>/dev/null; then
echo "+ npx -y prettier -l -w \$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')"
if check_install npm; then
info "running \`npx -y prettier -l -w \$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')\`"
npx -y prettier -l -w $(git ls-files '*.yml' '*.yaml' '*.js' '*.json')
check_diff $(git ls-files '*.yml' '*.yaml' '*.js' '*.json')
else
error "'npm' is not installed; skipped YAML/JavaScript/JSON code style check"
fi
# Check GitHub workflows.
if [[ -d .github/workflows ]]; then
info "checking GitHub workflows"
if type -P jq &>/dev/null; then
if type -P python3 &>/dev/null || type -P python &>/dev/null; then
py_suffix=''
if type -P python3 &>/dev/null; then
py_suffix='3'
fi
exe=''
venv_bin='.venv/bin'
case "$(uname -s)" in
MINGW* | MSYS* | CYGWIN* | Windows_NT)
exe='.exe'
venv_bin='.venv/Scripts'
;;
if check_install jq python3; then
venv_install_yq
for workflow in .github/workflows/*.yml; do
# The top-level permissions must be weak as they are referenced by all jobs.
permissions=$(venv yq -c '.permissions' "${workflow}")
case "${permissions}" in
'{"contents":"read"}' | '{"contents":"none"}') ;;
null) error "${workflow}: top level permissions not found; it must be 'contents: read' or weaker permissions" ;;
*) error "${workflow}: only 'contents: read' and weaker permissions are allowed at top level; if you want to use stronger permissions, please set job-level permissions" ;;
esac
if [[ ! -d .venv ]]; then
"python${py_suffix}" -m venv .venv
fi
if [[ ! -e "${venv_bin}/yq${exe}" ]]; then
venv "pip${py_suffix}" install yq
fi
for workflow in .github/workflows/*.yml; do
# The top-level permissions must be weak as they are referenced by all jobs.
permissions=$(venv yq -c '.permissions' "${workflow}")
case "${permissions}" in
'{"contents":"read"}' | '{"contents":"none"}') ;;
null) error "${workflow}: top level permissions not found; it must be 'contents: read' or weaker permissions" ;;
*) error "${workflow}: only 'contents: read' and weaker permissions are allowed at top level; if you want to use stronger permissions, please set job-level permissions" ;;
esac
# Make sure the 'needs' section is not out of date.
if grep -q '# tidy:needs' "${workflow}" && ! grep -Eq '# *needs: \[' "${workflow}"; then
# shellcheck disable=SC2207
jobs_actual=($(venv yq '.jobs' "${workflow}" | jq -r 'keys_unsorted[]'))
unset 'jobs_actual[${#jobs_actual[@]}-1]'
# shellcheck disable=SC2207
jobs_expected=($(venv yq -r '.jobs."ci-success".needs[]' "${workflow}"))
if [[ "${jobs_actual[*]}" != "${jobs_expected[*]+"${jobs_expected[*]}"}" ]]; then
printf -v jobs '%s, ' "${jobs_actual[@]}"
sed -i "s/needs: \[.*\] # tidy:needs/needs: [${jobs%, }] # tidy:needs/" "${workflow}"
check_diff "${workflow}"
error "${workflow}: please update 'needs' section in 'ci-success' job"
fi
# Make sure the 'needs' section is not out of date.
if grep -q '# tidy:needs' "${workflow}" && ! grep -Eq '# *needs: \[' "${workflow}"; then
# shellcheck disable=SC2207
jobs_actual=($(venv yq '.jobs' "${workflow}" | jq -r 'keys_unsorted[]'))
unset 'jobs_actual[${#jobs_actual[@]}-1]'
# shellcheck disable=SC2207
jobs_expected=($(venv yq -r '.jobs."ci-success".needs[]' "${workflow}"))
if [[ "${jobs_actual[*]}" != "${jobs_expected[*]+"${jobs_expected[*]}"}" ]]; then
printf -v jobs '%s, ' "${jobs_actual[@]}"
sed -i "s/needs: \[.*\] # tidy:needs/needs: [${jobs%, }] # tidy:needs/" "${workflow}"
check_diff "${workflow}"
error "${workflow}: please update 'needs' section in 'ci-success' job"
fi
done
else
error "'python3' is not installed; skipped GitHub workflow check"
fi
else
error "'jq' is not installed; skipped GitHub workflow check"
fi
done
fi
fi
fi
@@ -281,12 +289,10 @@ fi
if [[ -n "$(git ls-files '*.toml' | (grep -v .taplo.toml || true))" ]]; then
info "checking TOML style"
check_config .taplo.toml
if type -P npm &>/dev/null; then
echo "+ npx -y @taplo/cli fmt \$(git ls-files '*.toml')"
if check_install npm; then
info "running \`npx -y @taplo/cli fmt \$(git ls-files '*.toml')\`"
RUST_LOG=warn npx -y @taplo/cli fmt $(git ls-files '*.toml')
check_diff $(git ls-files '*.toml')
else
error "'npm' is not installed; skipped TOML style check"
fi
elif [[ -e .taplo.toml ]]; then
error ".taplo.toml is unused"
@@ -296,11 +302,9 @@ fi
if [[ -n "$(git ls-files '*.md')" ]]; then
info "checking Markdown style"
check_config .markdownlint-cli2.yaml
if type -P npm &>/dev/null; then
echo "+ npx -y markdownlint-cli2 \$(git ls-files '*.md')"
if check_install npm; then
info "running \`npx -y markdownlint-cli2 \$(git ls-files '*.md')\`"
npx -y markdownlint-cli2 $(git ls-files '*.md')
else
error "'npm' is not installed; skipped Markdown style check"
fi
elif [[ -e .markdownlint-cli2.yaml ]]; then
error ".markdownlint-cli2.yaml is unused"
@@ -312,29 +316,25 @@ fi
# Shell scripts
info "checking Shell scripts"
if type -P shfmt &>/dev/null; then
if check_install shfmt; then
check_config .editorconfig
echo "+ shfmt -l -w \$(git ls-files '*.sh')"
info "running \`shfmt -l -w \$(git ls-files '*.sh')\`"
shfmt -l -w $(git ls-files '*.sh')
check_diff $(git ls-files '*.sh')
else
error "'shfmt' is not installed; skipped Shell scripts style check"
fi
if type -P shellcheck &>/dev/null; then
if check_install shellcheck; then
check_config .shellcheckrc
echo "+ shellcheck \$(git ls-files '*.sh')"
info "running \`shellcheck \$(git ls-files '*.sh')\`"
if ! shellcheck $(git ls-files '*.sh'); then
should_fail=1
fi
if [[ -n "$(git ls-files '*Dockerfile')" ]]; then
# SC2154 doesn't seem to work on dockerfile.
echo "+ shellcheck -e SC2148,SC2154,SC2250 \$(git ls-files '*Dockerfile')"
info "running \`shellcheck -e SC2148,SC2154,SC2250 \$(git ls-files '*Dockerfile')\`"
if ! shellcheck -e SC2148,SC2154,SC2250 $(git ls-files '*Dockerfile'); then
should_fail=1
fi
fi
else
error "'shellcheck' is not installed; skipped Shell scripts style check"
fi
# License check
@@ -383,13 +383,14 @@ fi
if [[ -f .cspell.json ]]; then
info "spell checking"
project_dictionary=.github/.cspell/project-dictionary.txt
if type -P npm &>/dev/null; then
if check_install npm jq python3; then
has_rust=''
if [[ -n "$(git ls-files '*Cargo.toml')" ]]; then
venv_install_yq
has_rust='1'
dependencies=''
for manifest_path in $(git ls-files '*Cargo.toml'); do
if [[ "${manifest_path}" != "Cargo.toml" ]] && ! grep -Eq '\[workspace\]' "${manifest_path}"; then
if [[ "${manifest_path}" != "Cargo.toml" ]] && [[ "$(venv tomlq -c '.workspace' "${manifest_path}")" == "null" ]]; then
continue
fi
metadata=$(cargo metadata --format-version=1 --no-deps --manifest-path "${manifest_path}")
@@ -422,7 +423,7 @@ EOF
error "you may want to mark .github/.cspell/rust-dependencies.txt linguist-generated"
fi
echo "+ npx -y cspell --no-progress --no-summary \$(git ls-files)"
info "running \`npx -y cspell --no-progress --no-summary \$(git ls-files)\`"
if ! npx -y cspell --no-progress --no-summary $(git ls-files); then
error "spellcheck failed: please fix uses of above words or add to ${project_dictionary} if correct"
fi
@@ -454,8 +455,6 @@ EOF
echo -n "${unused}"
echo "======================================="
fi
else
error "'npm' is not installed; skipped spell check"
fi
fi

12
tools/update-markdown.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: Apache-2.0 OR MIT
set -eEuo pipefail
IFS=$'\n\t'
cd "$(dirname "$0")"/..
# Update markdown
#
# USAGE:
# ./tools/update-markdown.sh
cargo run --manifest-path tools/codegen/Cargo.toml --bin generate-tools-markdown --release