mirror of
https://github.com/taiki-e/install-action.git
synced 2026-04-27 17:40:28 +00:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da41fb311f | ||
|
|
82214f4be3 | ||
|
|
5c7ec4ff6e | ||
|
|
401fb25d5a | ||
|
|
24758ef6e7 | ||
|
|
24ac8132a4 | ||
|
|
b4c4e2f7c4 | ||
|
|
a7adeb15af | ||
|
|
25b04c0ead | ||
|
|
c39a412ce9 | ||
|
|
fe065954f6 | ||
|
|
aaa64a3351 | ||
|
|
f99317473f | ||
|
|
3523902f5a | ||
|
|
e6e3706b36 | ||
|
|
9469185794 | ||
|
|
1b8d452217 | ||
|
|
d125c0a835 | ||
|
|
319a0f2f5f | ||
|
|
0fe4860065 | ||
|
|
44e8874873 | ||
|
|
5f3e9b7a2d | ||
|
|
55912949de | ||
|
|
e26ea2a159 | ||
|
|
00b370abc3 | ||
|
|
6ae49f1b8b | ||
|
|
2967b5da19 | ||
|
|
5a32d87288 | ||
|
|
1f8124ee27 | ||
|
|
b58c61fa21 |
@@ -11,7 +11,7 @@ indent_style = space
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.{json,md,rb,yml,yaml}]
|
[*.{json,md,rb,sh,yml,yaml}]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[*.{js,yml,yaml}]
|
[*.{js,yml,yaml}]
|
||||||
|
|||||||
1
.github/.cspell/project-dictionary.txt
vendored
1
.github/.cspell/project-dictionary.txt
vendored
@@ -32,4 +32,3 @@ wasmtime
|
|||||||
watchexec
|
watchexec
|
||||||
xbuild
|
xbuild
|
||||||
xscale
|
xscale
|
||||||
zigbuild
|
|
||||||
|
|||||||
8
.github/dependabot.yml
vendored
8
.github/dependabot.yml
vendored
@@ -7,10 +7,6 @@ updates:
|
|||||||
commit-message:
|
commit-message:
|
||||||
prefix: ''
|
prefix: ''
|
||||||
labels: []
|
labels: []
|
||||||
groups:
|
|
||||||
cargo:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
directory: /
|
directory: /
|
||||||
schedule:
|
schedule:
|
||||||
@@ -18,7 +14,3 @@ updates:
|
|||||||
commit-message:
|
commit-message:
|
||||||
prefix: ''
|
prefix: ''
|
||||||
labels: []
|
labels: []
|
||||||
groups:
|
|
||||||
github-actions:
|
|
||||||
patterns:
|
|
||||||
- '*'
|
|
||||||
|
|||||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -47,7 +47,9 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
# NB: Sync list with https://github.com/taiki-e/checkout-action/blob/HEAD/.github/workflows/ci.yml
|
# NB: Sync list with https://github.com/taiki-e/checkout-action/blob/HEAD/.github/workflows/ci.yml
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
|
- os: ubuntu-22.04-arm
|
||||||
- os: ubuntu-24.04
|
- os: ubuntu-24.04
|
||||||
|
- os: ubuntu-24.04-arm
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
tool: major.minor.patch
|
tool: major.minor.patch
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
|
|||||||
59
CHANGELOG.md
59
CHANGELOG.md
@@ -10,6 +10,54 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.47.21] - 2025-01-21
|
||||||
|
|
||||||
|
- Update `knope@latest` to 0.18.3.
|
||||||
|
|
||||||
|
## [2.47.20] - 2025-01-21
|
||||||
|
|
||||||
|
- Update `wasmtime@latest` to 29.0.0.
|
||||||
|
|
||||||
|
## [2.47.19] - 2025-01-20
|
||||||
|
|
||||||
|
- Update `trunk@latest` to 0.21.6.
|
||||||
|
|
||||||
|
- Update `parse-changelog@latest` to 0.6.11.
|
||||||
|
|
||||||
|
## [2.47.18] - 2025-01-19
|
||||||
|
|
||||||
|
- Update `cargo-deny@latest` to 0.16.4.
|
||||||
|
|
||||||
|
- Update `cargo-binstall@latest` to 1.10.22.
|
||||||
|
|
||||||
|
## [2.47.17] - 2025-01-19
|
||||||
|
|
||||||
|
- Update `cargo-audit@latest` to 0.21.1.
|
||||||
|
|
||||||
|
## [2.47.16] - 2025-01-18
|
||||||
|
|
||||||
|
- Update `cargo-make@latest` to 0.37.24.
|
||||||
|
|
||||||
|
## [2.47.15] - 2025-01-16
|
||||||
|
|
||||||
|
- Update `cargo-tarpaulin@latest` to 0.31.5.
|
||||||
|
|
||||||
|
- Update `cargo-llvm-cov@latest` to 0.6.16.
|
||||||
|
|
||||||
|
- Update `cargo-hack@latest` to 0.6.34.
|
||||||
|
|
||||||
|
## [2.47.14] - 2025-01-16
|
||||||
|
|
||||||
|
- Update `cargo-nextest@latest` to 0.9.88.
|
||||||
|
|
||||||
|
## [2.47.13] - 2025-01-15
|
||||||
|
|
||||||
|
- Update `wasmtime@latest` to 28.0.1.
|
||||||
|
|
||||||
|
- Update `release-plz@latest` to 0.3.113.
|
||||||
|
|
||||||
|
- Update `cargo-binstall@latest` to 1.10.21.
|
||||||
|
|
||||||
## [2.47.12] - 2025-01-13
|
## [2.47.12] - 2025-01-13
|
||||||
|
|
||||||
- Update `wasm-bindgen@latest` to 0.2.100.
|
- Update `wasm-bindgen@latest` to 0.2.100.
|
||||||
@@ -3322,7 +3370,16 @@ Note: This release is considered a breaking change because installing on version
|
|||||||
|
|
||||||
Initial release
|
Initial release
|
||||||
|
|
||||||
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.47.12...HEAD
|
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.47.21...HEAD
|
||||||
|
[2.47.21]: https://github.com/taiki-e/install-action/compare/v2.47.20...v2.47.21
|
||||||
|
[2.47.20]: https://github.com/taiki-e/install-action/compare/v2.47.19...v2.47.20
|
||||||
|
[2.47.19]: https://github.com/taiki-e/install-action/compare/v2.47.18...v2.47.19
|
||||||
|
[2.47.18]: https://github.com/taiki-e/install-action/compare/v2.47.17...v2.47.18
|
||||||
|
[2.47.17]: https://github.com/taiki-e/install-action/compare/v2.47.16...v2.47.17
|
||||||
|
[2.47.16]: https://github.com/taiki-e/install-action/compare/v2.47.15...v2.47.16
|
||||||
|
[2.47.15]: https://github.com/taiki-e/install-action/compare/v2.47.14...v2.47.15
|
||||||
|
[2.47.14]: https://github.com/taiki-e/install-action/compare/v2.47.13...v2.47.14
|
||||||
|
[2.47.13]: https://github.com/taiki-e/install-action/compare/v2.47.12...v2.47.13
|
||||||
[2.47.12]: https://github.com/taiki-e/install-action/compare/v2.47.11...v2.47.12
|
[2.47.12]: https://github.com/taiki-e/install-action/compare/v2.47.11...v2.47.12
|
||||||
[2.47.11]: https://github.com/taiki-e/install-action/compare/v2.47.10...v2.47.11
|
[2.47.11]: https://github.com/taiki-e/install-action/compare/v2.47.10...v2.47.11
|
||||||
[2.47.10]: https://github.com/taiki-e/install-action/compare/v2.47.9...v2.47.10
|
[2.47.10]: https://github.com/taiki-e/install-action/compare/v2.47.9...v2.47.10
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ inline_asm_x86_att_syntax = "warn"
|
|||||||
trailing_empty_array = "warn"
|
trailing_empty_array = "warn"
|
||||||
transmute_undefined_repr = "warn"
|
transmute_undefined_repr = "warn"
|
||||||
undocumented_unsafe_blocks = "warn"
|
undocumented_unsafe_blocks = "warn"
|
||||||
|
unused_trait_names = "warn"
|
||||||
# Suppress buggy or noisy clippy lints
|
# Suppress buggy or noisy clippy lints
|
||||||
bool_assert_comparison = { level = "allow", priority = 1 }
|
bool_assert_comparison = { level = "allow", priority = 1 }
|
||||||
borrow_as_ptr = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/8286
|
borrow_as_ptr = { level = "allow", priority = 1 } # https://github.com/rust-lang/rust-clippy/issues/8286
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ GitHub Action for installing development tools (mainly from GitHub Releases).
|
|||||||
|
|
||||||
| Name | Required | Description | Type | Default |
|
| Name | Required | Description | Type | Default |
|
||||||
| -------- |:--------:| --------------------------------------- | ------- | ------- |
|
| -------- |:--------:| --------------------------------------- | ------- | ------- |
|
||||||
| tool | **true** | Tools to install (comma-separated list) | String | |
|
| tool | **✓** | Tools to install (comma-separated list) | String | |
|
||||||
| checksum | false | Whether to enable checksums | Boolean | `true` |
|
| checksum | | Whether to enable checksums | Boolean | `true` |
|
||||||
|
|
||||||
### Example workflow
|
### Example workflow
|
||||||
|
|
||||||
|
|||||||
22
manifests/cargo-audit.json
generated
22
manifests/cargo-audit.json
generated
@@ -20,10 +20,28 @@
|
|||||||
},
|
},
|
||||||
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.21.0"
|
"version": "0.21.1"
|
||||||
},
|
},
|
||||||
"0.21": {
|
"0.21": {
|
||||||
"version": "0.21.0"
|
"version": "0.21.1"
|
||||||
|
},
|
||||||
|
"0.21.1": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD383807A86B60",
|
||||||
|
"checksum": "e1d057a43028cb2359adcb75029e345b5791fbd2a1a01a3b8f16521035662cf3"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD3837D203A3C3",
|
||||||
|
"checksum": "ca21223691975d97a2442623a4d90e933d349199a728fdabaf98124ff65ee53f"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD383870DE65E0",
|
||||||
|
"checksum": "cb90ebf6c76bdf7014fb0114b3bc897917ce0ea5ecaf16f7dc7009612941dace"
|
||||||
|
},
|
||||||
|
"aarch64_linux_gnu": {
|
||||||
|
"etag": "0x8DD383809DEED88",
|
||||||
|
"checksum": "bd9a9ceb4887f28c8ace1a35da39818cbdcf98b1088bcd47544bff3a07e856bf"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.21.0": {
|
"0.21.0": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
28
manifests/cargo-binstall.json
generated
28
manifests/cargo-binstall.json
generated
@@ -22,32 +22,32 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE)",
|
"license_markdown": "[GPL-3.0](https://github.com/cargo-bins/cargo-binstall/blob/HEAD/crates/bin/LICENSE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "1.10.20"
|
"version": "1.10.22"
|
||||||
},
|
},
|
||||||
"1.10.20": {
|
"1.10.22": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
"etag": "0x8DD320C6CB323A8",
|
"etag": "0x8DD38568770C382",
|
||||||
"checksum": "8d3b5940fa5b4e30109919f6cba993447515a9564d2b70813b154c93aef14159"
|
"checksum": "74d7c647c7e60bb8464fa551702fdd38a7241f5cedb2c4edc3b11639cd1dae47"
|
||||||
},
|
},
|
||||||
"x86_64_macos": {
|
"x86_64_macos": {
|
||||||
"etag": "0x8DD320C6685F3F1",
|
"etag": "0x8DD38560D10F1DA",
|
||||||
"checksum": "23b7f3288bad590b90720805864d3e9f6603e6ab510af2459cf5fa319f4f22ec"
|
"checksum": "0abaad286197df9e5a3d25bfdca682fa91fef65fef13f42e20ec24a98165c71a"
|
||||||
},
|
},
|
||||||
"x86_64_windows": {
|
"x86_64_windows": {
|
||||||
"etag": "0x8DD320D3381889A",
|
"etag": "0x8DD3857BFED715A",
|
||||||
"checksum": "c7995d7b6265ad2c1b543113ad38d6dde152962980c70bf163fad6e9e15123ba"
|
"checksum": "36d6ea24db049a36d0eab33003e6ee007955f01a8ce89fef46d4026adb86db96"
|
||||||
},
|
},
|
||||||
"aarch64_linux_musl": {
|
"aarch64_linux_musl": {
|
||||||
"etag": "0x8DD320C012BDEDE",
|
"etag": "0x8DD38563219A538",
|
||||||
"checksum": "10114ab49f4c088910d76c50416e2cc67cefaf96ab3178c484e5fe383685e2bf"
|
"checksum": "b8c32b1b007482f42f6c4b5f8cfeb168f9674ec6448bfa29ae0c4ba01b7a370b"
|
||||||
},
|
},
|
||||||
"aarch64_macos": {
|
"aarch64_macos": {
|
||||||
"etag": "0x8DD320C2AE5312E",
|
"etag": "0x8DD3856413081F7",
|
||||||
"checksum": "48a790152a0a022b9aad4448b2d29f2057c217049f388c84cdd6566d5c4b5c13"
|
"checksum": "97ce4a2f18181f052dda266b042d8bb220e48ffe40ca75e796ae4c5e418b9e01"
|
||||||
},
|
},
|
||||||
"aarch64_windows": {
|
"aarch64_windows": {
|
||||||
"etag": "0x8DD320D409F1C6F",
|
"etag": "0x8DD3857931A5667",
|
||||||
"checksum": "11aa8f3b395b042e67f0369937d1aa375b3ba3a7a7a1905baddef4dd84ca02ff"
|
"checksum": "d86dfba0c13f7c84724e1d21fcec35b8a42633733215a61d1ee183455b12db5e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
26
manifests/cargo-deny.json
generated
26
manifests/cargo-deny.json
generated
@@ -24,10 +24,32 @@
|
|||||||
},
|
},
|
||||||
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.16.3"
|
"version": "0.16.4"
|
||||||
},
|
},
|
||||||
"0.16": {
|
"0.16": {
|
||||||
"version": "0.16.3"
|
"version": "0.16.4"
|
||||||
|
},
|
||||||
|
"0.16.4": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD3859CBF28AAD",
|
||||||
|
"checksum": "28b7f8e12df46a9ce186547e38278c851905fc4bda59a0cc57d2aade9fdf6962"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD3859A8D7C4BE",
|
||||||
|
"checksum": "01b43782acc7d6900b364fd588897e0ea5874b3583be40bfcf6cad8ad2c97aaf"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD385A21433507",
|
||||||
|
"checksum": "11a7ab2ea060a9e6141a3fbab8a6a9bbe30b97ce87fe4fbbb8f6c3a4b8410681"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"etag": "0x8DD3859CD936886",
|
||||||
|
"checksum": "56bbe9d8238480472325b019d6ab2eb3ed2601664826f67678ed0a5b8c9d5ba0"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD3859A47FDF9C",
|
||||||
|
"checksum": "6b91a75fb4eecc606757125f1cbea103df81b833bafbdceda1611bfa7737a364"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.16.3": {
|
"0.16.3": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
36
manifests/cargo-hack.json
generated
36
manifests/cargo-hack.json
generated
@@ -3,10 +3,42 @@
|
|||||||
"template": null,
|
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.6.33"
|
"version": "0.6.34"
|
||||||
},
|
},
|
||||||
"0.6": {
|
"0.6": {
|
||||||
"version": "0.6.33"
|
"version": "0.6.34"
|
||||||
|
},
|
||||||
|
"0.6.34": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"etag": "0x8DD364BF6437B65",
|
||||||
|
"checksum": "7b58e29544ae7b357deda5118a17053e4929f94f8d8595215d27cbbb415c47a5"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-x86_64-apple-darwin.tar.gz",
|
||||||
|
"etag": "0x8DD364C545B2CF1",
|
||||||
|
"checksum": "4fc72e4b3e1d7c7063efeddd4ebc196b4ee062e9b772dad24bebf8cb15749e21"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-x86_64-pc-windows-msvc.tar.gz",
|
||||||
|
"etag": "0x8DD364C4A143D6D",
|
||||||
|
"checksum": "6206ca07f99945f58765d1669fb2a995d96d809424ff7424257ce5f0fad23401"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"etag": "0x8DD364BFC48B3B7",
|
||||||
|
"checksum": "2b30401f9eb7664affdda7ce13b5d8421e2ea5ea74a854a71679ff68bf766761"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-aarch64-apple-darwin.tar.gz",
|
||||||
|
"etag": "0x8DD364C24072F24",
|
||||||
|
"checksum": "f2e88526e44b5934b5a0a2aa10fbf621ec44fe509c6ac6a82e1d49fa41d70943"
|
||||||
|
},
|
||||||
|
"aarch64_windows": {
|
||||||
|
"url": "https://github.com/taiki-e/cargo-hack/releases/download/v0.6.34/cargo-hack-aarch64-pc-windows-msvc.tar.gz",
|
||||||
|
"etag": "0x8DD364C3F0E09C1",
|
||||||
|
"checksum": "9c9903aa9ae2caaf38c37a0375e18afc50da1c1ca69c3f89b4219b530ab59a0c"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.6.33": {
|
"0.6.33": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
26
manifests/cargo-llvm-cov.json
generated
26
manifests/cargo-llvm-cov.json
generated
@@ -19,10 +19,32 @@
|
|||||||
},
|
},
|
||||||
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.6.15"
|
"version": "0.6.16"
|
||||||
},
|
},
|
||||||
"0.6": {
|
"0.6": {
|
||||||
"version": "0.6.15"
|
"version": "0.6.16"
|
||||||
|
},
|
||||||
|
"0.6.16": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD364B5D41374E",
|
||||||
|
"checksum": "2145d09b8263ba8bdf32f362919e0e2bb8170404bf6edd380b7b442f9017df58"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD364B96067E67",
|
||||||
|
"checksum": "337c619978c7595113353db5775cf953052aba85746f884085e31d2757a03e87"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD364BA6E069FE",
|
||||||
|
"checksum": "39f9ee12b9673f081bee6b250a186fbf438bb3f4b8897417d23ee74b199e02ce"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"etag": "0x8DD364B61561F48",
|
||||||
|
"checksum": "02a3a2d9c5de145319bd01f7ae63b6a76f0b57229887859a79b9fc0f57978b33"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD364B8C4E0B3B",
|
||||||
|
"checksum": "f1ab5f573d6c49d463f8117501462e2a6a0cead9124b68b4a2fbd8a3f5aad7ba"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.6.15": {
|
"0.6.15": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
22
manifests/cargo-make.json
generated
22
manifests/cargo-make.json
generated
@@ -20,10 +20,28 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[Apache-2.0](https://github.com/sagiegurari/cargo-make/blob/master/LICENSE)",
|
"license_markdown": "[Apache-2.0](https://github.com/sagiegurari/cargo-make/blob/master/LICENSE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "0.37.23"
|
"version": "0.37.24"
|
||||||
},
|
},
|
||||||
"0.37": {
|
"0.37": {
|
||||||
"version": "0.37.23"
|
"version": "0.37.24"
|
||||||
|
},
|
||||||
|
"0.37.24": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD37D36A8C5F07",
|
||||||
|
"checksum": "ff76969f0caab39c56d168b94b2540fde34609aa6562d555081818ece387b005"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD37D2ECB9F67A",
|
||||||
|
"checksum": "afd10db16ce089e0208d4829d46351833d9eb61f3181452a38a2a089bafedc31"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD37D379E8369F",
|
||||||
|
"checksum": "f7c757c7e147023ac86d80b134e5a59e0ed8ff032e39be3464cc4aad1e5e0f33"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD37D2EB99C51D",
|
||||||
|
"checksum": "823fe51d2baa5679a5dfd33c703d0176374f8f023a2ee950f2e03dc4f31ee523"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.37.23": {
|
"0.37.23": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
27
manifests/cargo-nextest.json
generated
27
manifests/cargo-nextest.json
generated
@@ -19,10 +19,33 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[Apache-2.0](https://github.com/nextest-rs/nextest/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/nextest-rs/nextest/blob/main/LICENSE-MIT)",
|
"license_markdown": "[Apache-2.0](https://github.com/nextest-rs/nextest/blob/main/LICENSE-APACHE) OR [MIT](https://github.com/nextest-rs/nextest/blob/main/LICENSE-MIT)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "0.9.87"
|
"version": "0.9.88"
|
||||||
},
|
},
|
||||||
"0.9": {
|
"0.9": {
|
||||||
"version": "0.9.87"
|
"version": "0.9.88"
|
||||||
|
},
|
||||||
|
"0.9.88": {
|
||||||
|
"previous_stable_version": "0.9.87",
|
||||||
|
"x86_64_linux_gnu": {
|
||||||
|
"etag": "0x8DD35B614AADEF1",
|
||||||
|
"checksum": "6fdb196e5643d50cad6daeefea5c978fff4904f5593eecba472f5ea3150e2aa0"
|
||||||
|
},
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD35B63691ECBA",
|
||||||
|
"checksum": "6fd7676908b4211f12f6298726544509fcb8c6b49a74bacb755d002260b3172c"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD35B6411A656E",
|
||||||
|
"checksum": "fe12274625473fe3c9895e28550364fb0afd1faea4e222c36a79b0c1ce1933ae"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD35B657950DD1",
|
||||||
|
"checksum": "ddc050a9c52db279bc2a532edf374633c27fb04a4cff679e574a6a19171d6d99"
|
||||||
|
},
|
||||||
|
"aarch64_linux_gnu": {
|
||||||
|
"etag": "0x8DD35B62BE93E0B",
|
||||||
|
"checksum": "040c1fd58f8853a2104f64c2cc1e7c66bfb48b72637ab1e72027375672d94b6c"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.9.87": {
|
"0.9.87": {
|
||||||
"previous_stable_version": "0.9.86",
|
"previous_stable_version": "0.9.86",
|
||||||
|
|||||||
26
manifests/cargo-tarpaulin.json
generated
26
manifests/cargo-tarpaulin.json
generated
@@ -19,10 +19,32 @@
|
|||||||
},
|
},
|
||||||
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.31.4"
|
"version": "0.31.5"
|
||||||
},
|
},
|
||||||
"0.31": {
|
"0.31": {
|
||||||
"version": "0.31.4"
|
"version": "0.31.5"
|
||||||
|
},
|
||||||
|
"0.31.5": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD36405804CBF3",
|
||||||
|
"checksum": "a5f2fdf67023775444c95afe5f0c190885944ca91250d39ac03788924eaa486d"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD3640173A9B5F",
|
||||||
|
"checksum": "8376c76c9d16f35ea0358d3683a4cfc638286eabf7fe12acdb31c4efb4ebeb6b"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD3640D5D46201",
|
||||||
|
"checksum": "96d93282bcd9c8e52fbe1dab2dff023512f198b5f0cff375c2fbce12fd978c5e"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"etag": "0x8DD364052DB3E9D",
|
||||||
|
"checksum": "b371cd0b30c8b7ae86badb9d92965acd740baa3412e11975cfb2ed54dc1b8130"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD364041B7A438",
|
||||||
|
"checksum": "476cd4eafea7ebaa21eb560dcd708cf412090214df17a45703c6454a88727cf1"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.31.4": {
|
"0.31.4": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
30
manifests/knope.json
generated
30
manifests/knope.json
generated
@@ -3,10 +3,36 @@
|
|||||||
"template": null,
|
"template": null,
|
||||||
"license_markdown": "[MIT](https://github.com/knope-dev/knope/blob/main/LICENSE)",
|
"license_markdown": "[MIT](https://github.com/knope-dev/knope/blob/main/LICENSE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "0.18.2"
|
"version": "0.18.3"
|
||||||
},
|
},
|
||||||
"0.18": {
|
"0.18": {
|
||||||
"version": "0.18.2"
|
"version": "0.18.3"
|
||||||
|
},
|
||||||
|
"0.18.3": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"url": "https://github.com/knope-dev/knope/releases/download/knope/v0.18.3/knope-x86_64-unknown-linux-musl.tgz",
|
||||||
|
"etag": "0x8DD39BE215D7200",
|
||||||
|
"checksum": "7ebe693bcb214dceef133b9f0ce14af052f74056b205c6175dac3d99713bf8e6",
|
||||||
|
"bin": "knope-x86_64-unknown-linux-musl/knope"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"url": "https://github.com/knope-dev/knope/releases/download/knope/v0.18.3/knope-x86_64-apple-darwin.tgz",
|
||||||
|
"etag": "0x8DD39BE215F1DD1",
|
||||||
|
"checksum": "a9717b6883436850118e9549acccbe75553ff89a0934d1578c90f280ef974243",
|
||||||
|
"bin": "knope-x86_64-apple-darwin/knope"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"url": "https://github.com/knope-dev/knope/releases/download/knope/v0.18.3/knope-x86_64-pc-windows-msvc.tgz",
|
||||||
|
"etag": "0x8DD39BE21590A2E",
|
||||||
|
"checksum": "1f8056add6ab3b2af6a1570f166cd4d5f76003ec6d4982c1c3f59eae093580c1",
|
||||||
|
"bin": "knope-x86_64-pc-windows-msvc/knope.exe"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"url": "https://github.com/knope-dev/knope/releases/download/knope/v0.18.3/knope-aarch64-apple-darwin.tgz",
|
||||||
|
"etag": "0x8DD39BE21590A2E",
|
||||||
|
"checksum": "f2ea1719bd3f7143c7ba68ef1a5dfb977739a88f6b93a1e915674ec36fdf3040",
|
||||||
|
"bin": "knope-aarch64-apple-darwin/knope"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.18.2": {
|
"0.18.2": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
36
manifests/parse-changelog.json
generated
36
manifests/parse-changelog.json
generated
@@ -3,10 +3,42 @@
|
|||||||
"template": null,
|
"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)",
|
"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": {
|
"latest": {
|
||||||
"version": "0.6.10"
|
"version": "0.6.11"
|
||||||
},
|
},
|
||||||
"0.6": {
|
"0.6": {
|
||||||
"version": "0.6.10"
|
"version": "0.6.11"
|
||||||
|
},
|
||||||
|
"0.6.11": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"etag": "0x8DD38C1F612ECE8",
|
||||||
|
"checksum": "805c0e86ad53c734973e1f55efc8fb6d82919029fdca4d27f80d590f94688edc"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-x86_64-apple-darwin.tar.gz",
|
||||||
|
"etag": "0x8DD38C20DC407CA",
|
||||||
|
"checksum": "9176db18ab6adc3bb1d4302eb52c83a9d46319df2b4671fccc4669dd8ce36fc6"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-x86_64-pc-windows-msvc.tar.gz",
|
||||||
|
"etag": "0x8DD38C22DBBA859",
|
||||||
|
"checksum": "299c282946f836b200940f0b4b2c8646e51eff9f3602bd0c2a99b483aa2d4429"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"etag": "0x8DD38C1F6DE0AEB",
|
||||||
|
"checksum": "a294359f1b1a904a34911fbf482c69ee28924dc8c27f2a1b84b4eb2108b6df3d"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-aarch64-apple-darwin.tar.gz",
|
||||||
|
"etag": "0x8DD38C1F6FB83DD",
|
||||||
|
"checksum": "e4e841ba10e7a0e314ec192142c016974f4999a03fc0f37c8803708654098c91"
|
||||||
|
},
|
||||||
|
"aarch64_windows": {
|
||||||
|
"url": "https://github.com/taiki-e/parse-changelog/releases/download/v0.6.11/parse-changelog-aarch64-pc-windows-msvc.tar.gz",
|
||||||
|
"etag": "0x8DD38C22406DAAB",
|
||||||
|
"checksum": "a5606df69e240edcf24e9466abdce004ba21c9f9cafe42d659fd3f3cb3d375e6"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.6.10": {
|
"0.6.10": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
30
manifests/release-plz.json
generated
30
manifests/release-plz.json
generated
@@ -22,10 +22,36 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[MIT](https://github.com/release-plz/release-plz/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/release-plz/release-plz/blob/main/LICENSE-APACHE)",
|
"license_markdown": "[MIT](https://github.com/release-plz/release-plz/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/release-plz/release-plz/blob/main/LICENSE-APACHE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "0.3.112"
|
"version": "0.3.113"
|
||||||
},
|
},
|
||||||
"0.3": {
|
"0.3": {
|
||||||
"version": "0.3.112"
|
"version": "0.3.113"
|
||||||
|
},
|
||||||
|
"0.3.113": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD34DE89D16C19",
|
||||||
|
"checksum": "581dc963e0aaf1791064429e9f746307ede0a8ea29d10041dd90c02bdbd13783"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD34DF8889BC58",
|
||||||
|
"checksum": "0811c988fda4552a31a8ab90776100e31bf8bb987f9337d05dc3dc92669848f4"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD34DF81C2F907",
|
||||||
|
"checksum": "68da2a1aba802069e5c59e42017f5e589f44e66d6105528893b294f1b296b916"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"etag": "0x8DD34DE988E8048",
|
||||||
|
"checksum": "01a1d2fa25811aa2e9e008fc9edf9ae3128b686c5e5f9a2c774fe7dc37346c27"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD34E03A6691B8",
|
||||||
|
"checksum": "f0f23f958541440f4f9669580ae04500feaaad2cdbfee3636a14729236d04e64"
|
||||||
|
},
|
||||||
|
"aarch64_windows": {
|
||||||
|
"etag": "0x8DD34DF694608E7",
|
||||||
|
"checksum": "8236943701c7f2ce2fa7c99f6f65392543fd6293fe7cb30878b17c171078ae48"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.3.112": {
|
"0.3.112": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
26
manifests/trunk.json
generated
26
manifests/trunk.json
generated
@@ -19,10 +19,32 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[MIT](https://github.com/trunk-rs/trunk/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/trunk-rs/trunk/blob/main/LICENSE-APACHE)",
|
"license_markdown": "[MIT](https://github.com/trunk-rs/trunk/blob/main/LICENSE-MIT) OR [Apache-2.0](https://github.com/trunk-rs/trunk/blob/main/LICENSE-APACHE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "0.21.5"
|
"version": "0.21.6"
|
||||||
},
|
},
|
||||||
"0.21": {
|
"0.21": {
|
||||||
"version": "0.21.5"
|
"version": "0.21.6"
|
||||||
|
},
|
||||||
|
"0.21.6": {
|
||||||
|
"x86_64_linux_musl": {
|
||||||
|
"etag": "0x8DD395263DA4485",
|
||||||
|
"checksum": "cd0897cb2db44c3305bea357a150759b7ba7cfc3e4290498d73692bbf87a55f3"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD3952638703EF",
|
||||||
|
"checksum": "3bf14129b4f4cdbdf82d4742da19972ec13bd7be8fb1cabd477d9dbf2d215b87"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD395263A03BE8",
|
||||||
|
"checksum": "02e025f6a3b4eecc1edc23b14864e15471a4d6159f9a91ec5f9b1cd1617563ca"
|
||||||
|
},
|
||||||
|
"aarch64_linux_musl": {
|
||||||
|
"etag": "0x8DD395263490844",
|
||||||
|
"checksum": "8a8a49af75a0499031372506f2703904504d3c1c2034aa48e648ccd7ef1f2238"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD39526347F804",
|
||||||
|
"checksum": "7f65126595d00d6e660b9f3e89fedc40a927bd06556461e45ae592468addeb05"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"0.21.5": {
|
"0.21.5": {
|
||||||
"x86_64_linux_musl": {
|
"x86_64_linux_musl": {
|
||||||
|
|||||||
64
manifests/wasmtime.json
generated
64
manifests/wasmtime.json
generated
@@ -28,13 +28,71 @@
|
|||||||
},
|
},
|
||||||
"license_markdown": "[Apache-2.0 WITH LLVM-exception](https://github.com/bytecodealliance/wasmtime/blob/main/LICENSE)",
|
"license_markdown": "[Apache-2.0 WITH LLVM-exception](https://github.com/bytecodealliance/wasmtime/blob/main/LICENSE)",
|
||||||
"latest": {
|
"latest": {
|
||||||
"version": "28.0.0"
|
"version": "29.0.0"
|
||||||
|
},
|
||||||
|
"29": {
|
||||||
|
"version": "29.0.0"
|
||||||
|
},
|
||||||
|
"29.0": {
|
||||||
|
"version": "29.0.0"
|
||||||
|
},
|
||||||
|
"29.0.0": {
|
||||||
|
"x86_64_linux_gnu": {
|
||||||
|
"etag": "0x8DD3980E5BCFA27",
|
||||||
|
"checksum": "a8b199405d14a53e9d9196c556643f19b0de9bcd61664246d7511bee34cef2f7"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD3980E6BE06EA",
|
||||||
|
"checksum": "e5bfaa01985317039c3f57ac42bf117c693b4a1203bfbe8de741c7781a41b9dc"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD3980EB038D65",
|
||||||
|
"checksum": "8114c08d134e9ec845152da99c382692c7f568ae0effcef550976bdaacfb4e8e"
|
||||||
|
},
|
||||||
|
"aarch64_linux_gnu": {
|
||||||
|
"etag": "0x8DD3980DA3E93C6",
|
||||||
|
"checksum": "a1e7fb17bc929ffd02e0e847a8c109f371407afec90180ef576d554d29cff3e0"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD3980DB3807EC",
|
||||||
|
"checksum": "d83fe0c2d3c3c67762f84a794045e020b0bfe1f4b1c56a138d59e2bbb9a04d2f"
|
||||||
|
},
|
||||||
|
"aarch64_windows": {
|
||||||
|
"etag": "0x8DD3980DD632632",
|
||||||
|
"checksum": "60caa468edf711454ab9fd6900ef71e9fdb6d7c94f76740181e64bca2e1b3110"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"version": "28.0.0"
|
"version": "28.0.1"
|
||||||
},
|
},
|
||||||
"28.0": {
|
"28.0": {
|
||||||
"version": "28.0.0"
|
"version": "28.0.1"
|
||||||
|
},
|
||||||
|
"28.0.1": {
|
||||||
|
"x86_64_linux_gnu": {
|
||||||
|
"etag": "0x8DD34F2BB0BD3D7",
|
||||||
|
"checksum": "f2500c046d92d68c5db66244e8685d0ba84a0fdce4780fb0f1e78e9666d9c920"
|
||||||
|
},
|
||||||
|
"x86_64_macos": {
|
||||||
|
"etag": "0x8DD34F2BBCD5FF0",
|
||||||
|
"checksum": "872c6d078f6ac1058be6f0f5219001b0e445aa00f96fc4c1242548701d9933b5"
|
||||||
|
},
|
||||||
|
"x86_64_windows": {
|
||||||
|
"etag": "0x8DD34F2BEBC9FE0",
|
||||||
|
"checksum": "b6564429cb6a0e930465204da11ae66e717508358e737d491eaa095b4a85792e"
|
||||||
|
},
|
||||||
|
"aarch64_linux_gnu": {
|
||||||
|
"etag": "0x8DD34F2B4A33B3D",
|
||||||
|
"checksum": "d18d05ad1482b8a0fa5040e2d4a9576a06c9b61890fac2d4a2e0824e3b308a7a"
|
||||||
|
},
|
||||||
|
"aarch64_macos": {
|
||||||
|
"etag": "0x8DD34F2B555486E",
|
||||||
|
"checksum": "0dc360747b46d0632e1d9d81299ed653ce5d31f43247780c6c20af2a3f4ad67c"
|
||||||
|
},
|
||||||
|
"aarch64_windows": {
|
||||||
|
"etag": "0x8DD34F2B635AB9D",
|
||||||
|
"checksum": "db3a8bbccb56a05a62fd3dfc4936ea396558f0a1ae6ffe4eee66e7b15a6230f2"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"28.0.0": {
|
"28.0.0": {
|
||||||
"x86_64_linux_gnu": {
|
"x86_64_linux_gnu": {
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ trap -- 's=$?; printf >&2 "%s\n" "${0##*/}:${LINENO}: \`${BASH_COMMAND}\` exit w
|
|||||||
cd -- "$(dirname -- "$0")"/../..
|
cd -- "$(dirname -- "$0")"/../..
|
||||||
|
|
||||||
bail() {
|
bail() {
|
||||||
printf >&2 'error: %s\n' "$*"
|
printf >&2 'error: %s\n' "$*"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ -z "${CI:-}" ]]; then
|
if [[ -z "${CI:-}" ]]; then
|
||||||
bail "this script is intended to call from release workflow on CI"
|
bail "this script is intended to call from release workflow on CI"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
git config user.name 'Taiki Endo'
|
git config user.name 'Taiki Endo'
|
||||||
@@ -21,28 +21,28 @@ set -x
|
|||||||
|
|
||||||
has_update=''
|
has_update=''
|
||||||
for manifest in manifests/*.json; do
|
for manifest in manifests/*.json; do
|
||||||
git add -N "${manifest}"
|
git add -N "${manifest}"
|
||||||
if ! git diff --exit-code -- "${manifest}"; then
|
if ! git diff --exit-code -- "${manifest}"; then
|
||||||
name="${manifest##*/}"
|
name="${manifest##*/}"
|
||||||
name="${name%.*}"
|
name="${name%.*}"
|
||||||
git stash
|
git stash
|
||||||
old_version=$(jq -r '.latest.version' "${manifest}")
|
old_version=$(jq -r '.latest.version' "${manifest}")
|
||||||
git stash pop
|
git stash pop
|
||||||
new_version=$(jq -r '.latest.version' "${manifest}")
|
new_version=$(jq -r '.latest.version' "${manifest}")
|
||||||
if [[ "${old_version}" != "${new_version}" ]]; then
|
if [[ "${old_version}" != "${new_version}" ]]; then
|
||||||
# TODO: If there is a line about updating the same tool in the "Unreleased" section, replace it.
|
# TODO: If there is a line about updating the same tool in the "Unreleased" section, replace it.
|
||||||
msg="Update \`${name}@latest\` to ${new_version}"
|
msg="Update \`${name}@latest\` to ${new_version}"
|
||||||
sed -Ei "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n- ${msg}./" CHANGELOG.md
|
sed -Ei "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n- ${msg}./" CHANGELOG.md
|
||||||
git add "${manifest}" CHANGELOG.md
|
git add "${manifest}" CHANGELOG.md
|
||||||
else
|
else
|
||||||
msg="Update ${name} manifest"
|
msg="Update ${name} manifest"
|
||||||
git add "${manifest}"
|
git add "${manifest}"
|
||||||
fi
|
|
||||||
git commit -m "${msg}"
|
|
||||||
has_update=1
|
|
||||||
fi
|
fi
|
||||||
|
git commit -m "${msg}"
|
||||||
|
has_update=1
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ -n "${has_update}" ]] && [[ -n "${GITHUB_OUTPUT:-}" ]]; then
|
if [[ -n "${has_update}" ]] && [[ -n "${GITHUB_OUTPUT:-}" ]]; then
|
||||||
printf 'success=false\n' >>"${GITHUB_OUTPUT}"
|
printf 'success=false\n' >>"${GITHUB_OUTPUT}"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -8,171 +8,181 @@ cd -- "$(dirname -- "$0")"/../..
|
|||||||
# They don't provide prebuilt binaries for musl or old glibc host.
|
# They don't provide prebuilt binaries for musl or old glibc host.
|
||||||
# version `GLIBC_2.34' not found
|
# version `GLIBC_2.34' not found
|
||||||
glibc_pre_2_34_incompat=(
|
glibc_pre_2_34_incompat=(
|
||||||
cargo-cyclonedx
|
cargo-cyclonedx
|
||||||
cargo-spellcheck
|
cargo-spellcheck
|
||||||
wait-for-them
|
wait-for-them
|
||||||
xbuild
|
xbuild
|
||||||
)
|
)
|
||||||
# version `GLIBC_2.31' not found
|
# version `GLIBC_2.31' not found
|
||||||
glibc_pre_2_31_incompat=(
|
glibc_pre_2_31_incompat=(
|
||||||
"${glibc_pre_2_34_incompat[@]}"
|
"${glibc_pre_2_34_incompat[@]}"
|
||||||
cargo-sort
|
cargo-sort
|
||||||
espup
|
espup
|
||||||
zola
|
zola
|
||||||
)
|
)
|
||||||
# version `GLIBC_2.28' not found
|
# version `GLIBC_2.28' not found
|
||||||
glibc_pre_2_28_incompat=(
|
glibc_pre_2_28_incompat=(
|
||||||
"${glibc_pre_2_31_incompat[@]}"
|
"${glibc_pre_2_31_incompat[@]}"
|
||||||
wasmtime
|
wasmtime
|
||||||
)
|
)
|
||||||
# version `GLIBC_2.27' not found
|
# version `GLIBC_2.27' not found
|
||||||
glibc_pre_2_27_incompat=(
|
glibc_pre_2_27_incompat=(
|
||||||
"${glibc_pre_2_28_incompat[@]}"
|
"${glibc_pre_2_28_incompat[@]}"
|
||||||
cargo-watch
|
cargo-watch
|
||||||
mdbook-linkcheck
|
mdbook-linkcheck
|
||||||
protoc
|
protoc
|
||||||
valgrind
|
valgrind
|
||||||
)
|
)
|
||||||
# version `GLIBC_2.17' not found
|
# version `GLIBC_2.17' not found
|
||||||
glibc_pre_2_17_incompat=(
|
glibc_pre_2_17_incompat=(
|
||||||
"${glibc_pre_2_27_incompat[@]}"
|
"${glibc_pre_2_27_incompat[@]}"
|
||||||
deepsource
|
deepsource
|
||||||
)
|
)
|
||||||
musl_incompat=(
|
musl_incompat=(
|
||||||
"${glibc_pre_2_17_incompat[@]}"
|
"${glibc_pre_2_17_incompat[@]}"
|
||||||
)
|
)
|
||||||
win2019_gnu_incompat=(
|
win2019_gnu_incompat=(
|
||||||
cargo-spellcheck
|
cargo-spellcheck
|
||||||
)
|
)
|
||||||
|
|
||||||
incompat_tools=()
|
incompat_tools=()
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
'') version=latest ;;
|
'') version=latest ;;
|
||||||
major.minor.patch | major.minor | major)
|
major.minor.patch | major.minor | major)
|
||||||
version="$1"
|
version="$1"
|
||||||
# Specifying the version of valgrind and cargo-binstall is not supported.
|
# Specifying the version of valgrind and cargo-binstall is not supported.
|
||||||
incompat_tools+=(valgrind cargo-binstall)
|
incompat_tools+=(valgrind cargo-binstall)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printf 'tool=%s\n', "$1"
|
printf 'tool=%s\n', "$1"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
runner="${2:-}"
|
runner="${2:-}"
|
||||||
bash="${3:-}"
|
bash="${3:-}"
|
||||||
case "$(uname -s)" in
|
case "$(uname -s)" in
|
||||||
Linux)
|
Linux)
|
||||||
host_os=linux
|
host_os=linux
|
||||||
ldd_version=$(ldd --version 2>&1 || true)
|
ldd_version=$(ldd --version 2>&1 || true)
|
||||||
if grep -Fq musl <<<"${ldd_version}"; then
|
if grep -Fq musl <<<"${ldd_version}"; then
|
||||||
incompat_tools+=("${musl_incompat[@]}")
|
incompat_tools+=("${musl_incompat[@]}")
|
||||||
else
|
else
|
||||||
host_glibc_version=$(grep -E "GLIBC|GNU libc" <<<"${ldd_version}" | sed "s/.* //g")
|
host_glibc_version=$(grep -E "GLIBC|GNU libc" <<<"${ldd_version}" | sed "s/.* //g")
|
||||||
higher_glibc_version=$(sort -Vu <<<"2.34"$'\n'"${host_glibc_version}" | tail -1)
|
higher_glibc_version=$(sort -Vu <<<"2.34"$'\n'"${host_glibc_version}" | tail -1)
|
||||||
|
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
||||||
|
higher_glibc_version=$(sort -Vu <<<"2.31"$'\n'"${host_glibc_version}" | tail -1)
|
||||||
|
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
||||||
|
higher_glibc_version=$(sort -Vu <<<"2.28"$'\n'"${host_glibc_version}" | tail -1)
|
||||||
|
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
||||||
|
higher_glibc_version=$(sort -Vu <<<"2.27"$'\n'"${host_glibc_version}" | tail -1)
|
||||||
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
||||||
higher_glibc_version=$(sort -Vu <<<"2.31"$'\n'"${host_glibc_version}" | tail -1)
|
higher_glibc_version=$(sort -Vu <<<"2.17"$'\n'"${host_glibc_version}" | tail -1)
|
||||||
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
||||||
higher_glibc_version=$(sort -Vu <<<"2.28"$'\n'"${host_glibc_version}" | tail -1)
|
incompat_tools+=("${glibc_pre_2_17_incompat[@]}")
|
||||||
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
else
|
||||||
higher_glibc_version=$(sort -Vu <<<"2.27"$'\n'"${host_glibc_version}" | tail -1)
|
incompat_tools+=("${glibc_pre_2_27_incompat[@]}")
|
||||||
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
fi
|
||||||
higher_glibc_version=$(sort -Vu <<<"2.17"$'\n'"${host_glibc_version}" | tail -1)
|
else
|
||||||
if [[ "${higher_glibc_version}" != "${host_glibc_version}" ]]; then
|
incompat_tools+=("${glibc_pre_2_28_incompat[@]}")
|
||||||
incompat_tools+=("${glibc_pre_2_17_incompat[@]}")
|
|
||||||
else
|
|
||||||
incompat_tools+=("${glibc_pre_2_27_incompat[@]}")
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
incompat_tools+=("${glibc_pre_2_28_incompat[@]}")
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
incompat_tools+=("${glibc_pre_2_31_incompat[@]}")
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
incompat_tools+=("${glibc_pre_2_34_incompat[@]}")
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
incompat_tools+=("${glibc_pre_2_31_incompat[@]}")
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
incompat_tools+=("${glibc_pre_2_34_incompat[@]}")
|
||||||
fi
|
fi
|
||||||
if ! type -P snap >/dev/null; then
|
fi
|
||||||
incompat_tools+=(valgrind)
|
fi
|
||||||
|
if ! type -P snap >/dev/null; then
|
||||||
|
incompat_tools+=(valgrind)
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
Darwin) host_os=macos ;;
|
||||||
|
MINGW* | MSYS* | CYGWIN* | Windows_NT)
|
||||||
|
host_os=windows
|
||||||
|
case "${bash}" in
|
||||||
|
msys64 | cygwin)
|
||||||
|
if [[ "${runner}" == "windows-2019" ]]; then
|
||||||
|
incompat_tools+=("${win2019_gnu_incompat[@]}")
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
Darwin) host_os=macos ;;
|
esac
|
||||||
MINGW* | MSYS* | CYGWIN* | Windows_NT)
|
;;
|
||||||
host_os=windows
|
*) bail "unrecognized OS type '$(uname -s)'" ;;
|
||||||
case "${bash}" in
|
esac
|
||||||
msys64 | cygwin)
|
# See main.sh
|
||||||
if [[ "${runner}" == "windows-2019" ]]; then
|
case "$(uname -m)" in
|
||||||
incompat_tools+=("${win2019_gnu_incompat[@]}")
|
aarch64 | arm64) host_arch=aarch64 ;;
|
||||||
fi
|
xscale | arm | armv*l) bail "32-bit Arm runner is not supported yet by this action; if you need support for this platform, please submit an issue at <https://github.com/taiki-e/install-action>" ;;
|
||||||
;;
|
*) host_arch=x86_64 ;;
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*) bail "unrecognized OS type '$(uname -s)'" ;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
tools=()
|
tools=()
|
||||||
for manifest in tools/codegen/base/*.json; do
|
for manifest in tools/codegen/base/*.json; do
|
||||||
tool_name="${manifest##*/}"
|
tool_name="${manifest##*/}"
|
||||||
tool_name="${tool_name%.*}"
|
tool_name="${tool_name%.*}"
|
||||||
# cross -V requires rustc
|
# cross -V requires rustc
|
||||||
if [[ "${tool_name}" == "cross" ]] && ! type -P rustc >/dev/null; then
|
if [[ "${tool_name}" == "cross" ]] && ! type -P rustc >/dev/null; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
case "${host_os}" in
|
||||||
|
linux*)
|
||||||
|
if [[ "${host_arch}" != "x86_64" ]] && [[ "$(jq -r ".platform.${host_arch}_${host_os}_gnu" "${manifest}")" == "null" ]] && [[ "$(jq -r ".platform.${host_arch}_${host_os}_musl" "${manifest}")" == "null" ]]; then
|
||||||
continue
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ "$(jq -r ".platform.x86_64_${host_os}" "${manifest}")" == "null" ]] && [[ "$(jq -r ".platform.${host_arch}_${host_os}" "${manifest}")" == "null" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
for incompat in ${incompat_tools[@]+"${incompat_tools[@]}"}; do
|
||||||
|
if [[ "${incompat}" == "${tool_name}" ]]; then
|
||||||
|
tool_name=''
|
||||||
|
break
|
||||||
fi
|
fi
|
||||||
case "${host_os}" in
|
done
|
||||||
linux*) ;;
|
if [[ -n "${tool_name}" ]]; then
|
||||||
*)
|
if [[ "${version}" != "latest" ]]; then
|
||||||
if [[ "$(jq -r ".platform.x86_64_${host_os}" "${manifest}")" == "null" ]]; then
|
latest_version=$(jq -r '.latest.version' "manifests/${tool_name}.json")
|
||||||
continue
|
case "${version}" in
|
||||||
fi
|
major.minor.patch) tool_name+="@${latest_version}" ;;
|
||||||
;;
|
major.minor) tool_name+="@${latest_version%.*}" ;;
|
||||||
esac
|
major) tool_name+="@${latest_version%%.*}" ;;
|
||||||
for incompat in ${incompat_tools[@]+"${incompat_tools[@]}"}; do
|
*) exit 1 ;;
|
||||||
if [[ "${incompat}" == "${tool_name}" ]]; then
|
esac
|
||||||
tool_name=''
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -n "${tool_name}" ]]; then
|
|
||||||
if [[ "${version}" != "latest" ]]; then
|
|
||||||
latest_version=$(jq -r '.latest.version' "manifests/${tool_name}.json")
|
|
||||||
case "${version}" in
|
|
||||||
major.minor.patch) tool_name+="@${latest_version}" ;;
|
|
||||||
major.minor) tool_name+="@${latest_version%.*}" ;;
|
|
||||||
major) tool_name+="@${latest_version%%.*}" ;;
|
|
||||||
*) exit 1 ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if [[ "${tool_name}" != *"@0" ]] && [[ "${tool_name}" != *"@0.0" ]]; then
|
|
||||||
tools+=("${tool_name}")
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
if [[ "${tool_name}" != *"@0" ]] && [[ "${tool_name}" != *"@0.0" ]]; then
|
||||||
|
tools+=("${tool_name}")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
if [[ "${version}" != "latest" ]]; then
|
if [[ "${version}" != "latest" ]]; then
|
||||||
tools_tmp=()
|
tools_tmp=()
|
||||||
for tool in "${tools[@]}"; do
|
for tool in "${tools[@]}"; do
|
||||||
tools_tmp+=("${tool}")
|
tools_tmp+=("${tool}")
|
||||||
done
|
done
|
||||||
tools=("${tools_tmp[@]}")
|
tools=("${tools_tmp[@]}")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Not manifest-based
|
# Not manifest-based
|
||||||
case "${host_os}" in
|
case "${host_os}" in
|
||||||
linux*)
|
linux*)
|
||||||
# Installing snap to container is difficult...
|
# Installing snap to container is difficult...
|
||||||
# Specifying the version of valgrind is not supported.
|
# Specifying the version of valgrind is not supported.
|
||||||
if type -P snap >/dev/null && [[ "${version}" == "latest" ]]; then
|
if type -P snap >/dev/null && [[ "${version}" == "latest" ]]; then
|
||||||
tools+=(valgrind)
|
tools+=(valgrind)
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
# cargo-watch/watchexec-cli is supported by cargo-binstall (through quickinstall)
|
# cargo-watch/watchexec-cli is supported by cargo-binstall (through quickinstall)
|
||||||
case "${version}" in
|
case "${version}" in
|
||||||
latest) tools+=(cargo-watch watchexec-cli) ;;
|
latest) tools+=(cargo-watch watchexec-cli) ;;
|
||||||
major.minor.patch) tools+=(cargo-watch@8.5.2 watchexec-cli@2.1.2) ;;
|
major.minor.patch) tools+=(cargo-watch@8.5.2 watchexec-cli@2.1.2) ;;
|
||||||
major.minor) tools+=(cargo-watch@8.5 watchexec-cli@2.1) ;;
|
major.minor) tools+=(cargo-watch@8.5 watchexec-cli@2.1) ;;
|
||||||
major) tools+=(cargo-watch@8 watchexec-cli@2) ;;
|
major) tools+=(cargo-watch@8 watchexec-cli@2) ;;
|
||||||
*) exit 1 ;;
|
*) exit 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# sort and dedup
|
# sort and dedup
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use std::{
|
|||||||
collections::{BTreeMap, BTreeSet},
|
collections::{BTreeMap, BTreeSet},
|
||||||
env,
|
env,
|
||||||
ffi::OsStr,
|
ffi::OsStr,
|
||||||
io::Read,
|
io::Read as _,
|
||||||
path::Path,
|
path::Path,
|
||||||
sync::{LazyLock, RwLock},
|
sync::{LazyLock, RwLock},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
@@ -17,7 +17,7 @@ use install_action_internal_codegen::{
|
|||||||
workspace_root, BaseManifest, HostPlatform, Manifest, ManifestDownloadInfo, ManifestRef,
|
workspace_root, BaseManifest, HostPlatform, Manifest, ManifestDownloadInfo, ManifestRef,
|
||||||
ManifestTemplate, ManifestTemplateDownloadInfo, Manifests, Signing, SigningKind, Version,
|
ManifestTemplate, ManifestTemplateDownloadInfo, Manifests, Signing, SigningKind, Version,
|
||||||
};
|
};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest as _, Sha256};
|
||||||
use spdx::expression::{ExprNode, ExpressionReq, Operator};
|
use spdx::expression::{ExprNode, ExpressionReq, Operator};
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
|
||||||
use std::{env, fmt, io::Write, path::PathBuf};
|
use std::{env, fmt, io::Write as _, path::PathBuf};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use fs_err as fs;
|
use fs_err as fs;
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ cd -- "$(dirname -- "$0")"/..
|
|||||||
# ./tools/manifest.sh [PACKAGE [VERSION_REQ]]
|
# ./tools/manifest.sh [PACKAGE [VERSION_REQ]]
|
||||||
|
|
||||||
if [[ $# -gt 0 ]]; then
|
if [[ $# -gt 0 ]]; then
|
||||||
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "$@"
|
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "$@"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for manifest in tools/codegen/base/*.json; do
|
for manifest in tools/codegen/base/*.json; do
|
||||||
package="${manifest##*/}"
|
package="${manifest##*/}"
|
||||||
package="${package%.*}"
|
package="${package%.*}"
|
||||||
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "${package}" latest
|
cargo run --manifest-path tools/codegen/Cargo.toml --release -- "${package}" latest
|
||||||
done
|
done
|
||||||
|
|||||||
138
tools/publish.sh
138
tools/publish.sh
@@ -14,18 +14,18 @@ cd -- "$(dirname -- "$0")"/..
|
|||||||
# - parse-changelog <https://github.com/taiki-e/parse-changelog>
|
# - parse-changelog <https://github.com/taiki-e/parse-changelog>
|
||||||
|
|
||||||
retry() {
|
retry() {
|
||||||
for i in {1..10}; do
|
for i in {1..10}; do
|
||||||
if "$@"; then
|
if "$@"; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
sleep "${i}"
|
sleep "${i}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
"$@"
|
"$@"
|
||||||
}
|
}
|
||||||
bail() {
|
bail() {
|
||||||
printf >&2 'error: %s\n' "$*"
|
printf >&2 'error: %s\n' "$*"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
version="${1:?}"
|
version="${1:?}"
|
||||||
@@ -34,15 +34,15 @@ tag_prefix="v"
|
|||||||
tag="${tag_prefix}${version}"
|
tag="${tag_prefix}${version}"
|
||||||
changelog="CHANGELOG.md"
|
changelog="CHANGELOG.md"
|
||||||
if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then
|
if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then
|
||||||
bail "invalid version format '${version}'"
|
bail "invalid version format '${version}'"
|
||||||
fi
|
fi
|
||||||
if [[ $# -gt 1 ]]; then
|
if [[ $# -gt 1 ]]; then
|
||||||
bail "invalid argument '$2'"
|
bail "invalid argument '$2'"
|
||||||
fi
|
fi
|
||||||
if { sed --help 2>&1 || true; } | grep -Eq -e '-i extension'; then
|
if { sed --help 2>&1 || true; } | grep -Eq -e '-i extension'; then
|
||||||
in_place=(-i '')
|
in_place=(-i '')
|
||||||
else
|
else
|
||||||
in_place=(-i)
|
in_place=(-i)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure there is no uncommitted change.
|
# Make sure there is no uncommitted change.
|
||||||
@@ -51,67 +51,67 @@ git diff --exit-code --staged
|
|||||||
|
|
||||||
# Make sure the same release has not been created in the past.
|
# Make sure the same release has not been created in the past.
|
||||||
if gh release view "${tag}" &>/dev/null; then
|
if gh release view "${tag}" &>/dev/null; then
|
||||||
bail "tag '${tag}' has already been created and pushed"
|
bail "tag '${tag}' has already been created and pushed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure that the release was created from an allowed branch.
|
# Make sure that the release was created from an allowed branch.
|
||||||
if ! git branch | grep -Eq '\* main$'; then
|
if ! git branch | grep -Eq '\* main$'; then
|
||||||
bail "current branch is not 'main'"
|
bail "current branch is not 'main'"
|
||||||
fi
|
fi
|
||||||
if ! git remote -v | grep -F origin | grep -Eq 'github\.com[:/]taiki-e/'; then
|
if ! git remote -v | grep -F origin | grep -Eq 'github\.com[:/]taiki-e/'; then
|
||||||
bail "cannot publish a new release from fork repository"
|
bail "cannot publish a new release from fork repository"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
release_date=$(date -u '+%Y-%m-%d')
|
release_date=$(date -u '+%Y-%m-%d')
|
||||||
tags=$(git --no-pager tag | { grep -E "^${tag_prefix}[0-9]+" || true; })
|
tags=$(git --no-pager tag | { grep -E "^${tag_prefix}[0-9]+" || true; })
|
||||||
if [[ -n "${tags}" ]]; then
|
if [[ -n "${tags}" ]]; then
|
||||||
# Make sure the same release does not exist in changelog.
|
# Make sure the same release does not exist in changelog.
|
||||||
if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then
|
if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then
|
||||||
bail "release ${version} already exist in ${changelog}"
|
bail "release ${version} already exist in ${changelog}"
|
||||||
fi
|
fi
|
||||||
if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
||||||
bail "link to ${version} already exist in ${changelog}"
|
bail "link to ${version} already exist in ${changelog}"
|
||||||
fi
|
fi
|
||||||
# Update changelog.
|
# Update changelog.
|
||||||
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed -E 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
|
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed -E 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
|
||||||
prev_tag="${remote_url#*/compare/}"
|
prev_tag="${remote_url#*/compare/}"
|
||||||
remote_url="${remote_url%/compare/*}"
|
remote_url="${remote_url%/compare/*}"
|
||||||
sed -E "${in_place[@]}" \
|
sed -E "${in_place[@]}" \
|
||||||
-e "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" \
|
-e "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" \
|
||||||
-e "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${prev_tag}...${tag}#" "${changelog}"
|
-e "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${prev_tag}...${tag}#" "${changelog}"
|
||||||
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
|
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
|
||||||
bail "failed to update ${changelog}"
|
bail "failed to update ${changelog}"
|
||||||
fi
|
fi
|
||||||
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
||||||
bail "failed to update ${changelog}"
|
bail "failed to update ${changelog}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Make sure the release exists in changelog.
|
# Make sure the release exists in changelog.
|
||||||
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
|
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
|
||||||
bail "release ${version} does not exist in ${changelog} or has wrong release date"
|
bail "release ${version} does not exist in ${changelog} or has wrong release date"
|
||||||
fi
|
fi
|
||||||
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
|
||||||
bail "link to ${version} does not exist in ${changelog}"
|
bail "link to ${version} does not exist in ${changelog}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure that a valid release note for this version exists.
|
# Make sure that a valid release note for this version exists.
|
||||||
# https://github.com/taiki-e/parse-changelog
|
# https://github.com/taiki-e/parse-changelog
|
||||||
changes=$(parse-changelog "${changelog}" "${version}")
|
changes=$(parse-changelog "${changelog}" "${version}")
|
||||||
if [[ -z "${changes}" ]]; then
|
if [[ -z "${changes}" ]]; then
|
||||||
bail "changelog for ${version} has no body"
|
bail "changelog for ${version} has no body"
|
||||||
fi
|
fi
|
||||||
printf '============== CHANGELOG ==============\n'
|
printf '============== CHANGELOG ==============\n'
|
||||||
printf '%s\n' "${changes}"
|
printf '%s\n' "${changes}"
|
||||||
printf '=======================================\n'
|
printf '=======================================\n'
|
||||||
|
|
||||||
if [[ -n "${tags}" ]]; then
|
if [[ -n "${tags}" ]]; then
|
||||||
# Create a release commit.
|
# Create a release commit.
|
||||||
(
|
(
|
||||||
set -x
|
set -x
|
||||||
git add "${changelog}"
|
git add "${changelog}"
|
||||||
git commit -m "Release ${version}"
|
git commit -m "Release ${version}"
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set -x
|
set -x
|
||||||
@@ -124,8 +124,8 @@ major_version_tag="v${version%%.*}"
|
|||||||
git checkout -b "${major_version_tag}"
|
git checkout -b "${major_version_tag}"
|
||||||
retry git push origin refs/heads/"${major_version_tag}"
|
retry git push origin refs/heads/"${major_version_tag}"
|
||||||
if git --no-pager tag | grep -Eq "^${major_version_tag}$"; then
|
if git --no-pager tag | grep -Eq "^${major_version_tag}$"; then
|
||||||
git tag -d "${major_version_tag}"
|
git tag -d "${major_version_tag}"
|
||||||
retry git push --delete origin refs/tags/"${major_version_tag}"
|
retry git push --delete origin refs/tags/"${major_version_tag}"
|
||||||
fi
|
fi
|
||||||
git tag "${major_version_tag}"
|
git tag "${major_version_tag}"
|
||||||
retry git push origin --tags
|
retry git push origin --tags
|
||||||
@@ -134,8 +134,8 @@ git branch -d "${major_version_tag}"
|
|||||||
|
|
||||||
tools=()
|
tools=()
|
||||||
for tool in tools/codegen/base/*.json; do
|
for tool in tools/codegen/base/*.json; do
|
||||||
tool="${tool##*/}"
|
tool="${tool##*/}"
|
||||||
tools+=("${tool%.*}")
|
tools+=("${tool%.*}")
|
||||||
done
|
done
|
||||||
# Alias
|
# Alias
|
||||||
tools+=(nextest)
|
tools+=(nextest)
|
||||||
@@ -143,18 +143,18 @@ tools+=(nextest)
|
|||||||
tools+=(valgrind)
|
tools+=(valgrind)
|
||||||
|
|
||||||
for tool in "${tools[@]}"; do
|
for tool in "${tools[@]}"; do
|
||||||
git checkout -b "${tool}"
|
git checkout -b "${tool}"
|
||||||
sed -E "${in_place[@]}" "s/required: true/required: false/g" action.yml
|
sed -E "${in_place[@]}" "s/required: true/required: false/g" action.yml
|
||||||
sed -E "${in_place[@]}" "s/# default: #publish:tool/default: ${tool}/g" action.yml
|
sed -E "${in_place[@]}" "s/# default: #publish:tool/default: ${tool}/g" action.yml
|
||||||
git add action.yml
|
git add action.yml
|
||||||
git commit -m "${tool}"
|
git commit -m "${tool}"
|
||||||
retry git push origin -f refs/heads/"${tool}"
|
retry git push origin -f refs/heads/"${tool}"
|
||||||
if git --no-pager tag | grep -Eq "^${tool}$"; then
|
if git --no-pager tag | grep -Eq "^${tool}$"; then
|
||||||
git tag -d "${tool}"
|
git tag -d "${tool}"
|
||||||
retry git push --delete origin refs/tags/"${tool}"
|
retry git push --delete origin refs/tags/"${tool}"
|
||||||
fi
|
fi
|
||||||
git tag "${tool}"
|
git tag "${tool}"
|
||||||
retry git push origin --tags
|
retry git push origin --tags
|
||||||
git checkout main
|
git checkout main
|
||||||
git branch -D "${tool}"
|
git branch -D "${tool}"
|
||||||
done
|
done
|
||||||
|
|||||||
758
tools/tidy.sh
758
tools/tidy.sh
@@ -25,464 +25,464 @@ trap 's=$?; echo >&2 "$0: error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}
|
|||||||
# skipped if the corresponding files do not exist.
|
# skipped if the corresponding files do not exist.
|
||||||
|
|
||||||
check_diff() {
|
check_diff() {
|
||||||
if [[ -n "${CI:-}" ]]; then
|
if [[ -n "${CI:-}" ]]; then
|
||||||
if ! git --no-pager diff --exit-code "$@"; then
|
if ! git --no-pager diff --exit-code "$@"; then
|
||||||
should_fail=1
|
should_fail=1
|
||||||
fi
|
|
||||||
else
|
|
||||||
if ! git --no-pager diff --exit-code "$@" &>/dev/null; then
|
|
||||||
should_fail=1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
if ! git --no-pager diff --exit-code "$@" &>/dev/null; then
|
||||||
|
should_fail=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
check_config() {
|
check_config() {
|
||||||
if [[ ! -e "$1" ]]; then
|
if [[ ! -e "$1" ]]; then
|
||||||
error "could not found $1 in the repository root"
|
error "could not found $1 in the repository root"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
check_install() {
|
check_install() {
|
||||||
for tool in "$@"; do
|
for tool in "$@"; do
|
||||||
if ! type -P "${tool}" &>/dev/null; then
|
if ! type -P "${tool}" &>/dev/null; then
|
||||||
if [[ "${tool}" == "python3" ]]; then
|
if [[ "${tool}" == "python3" ]]; then
|
||||||
if type -P python &>/dev/null; then
|
if type -P python &>/dev/null; then
|
||||||
continue
|
continue
|
||||||
fi
|
|
||||||
fi
|
|
||||||
error "'${tool}' is required to run this check"
|
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
done
|
fi
|
||||||
|
error "'${tool}' is required to run this check"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
info() {
|
info() {
|
||||||
echo >&2 "info: $*"
|
echo >&2 "info: $*"
|
||||||
}
|
}
|
||||||
error() {
|
error() {
|
||||||
if [[ -n "${GITHUB_ACTIONS:-}" ]]; then
|
if [[ -n "${GITHUB_ACTIONS:-}" ]]; then
|
||||||
echo "::error::$*"
|
echo "::error::$*"
|
||||||
else
|
else
|
||||||
echo >&2 "error: $*"
|
echo >&2 "error: $*"
|
||||||
fi
|
fi
|
||||||
should_fail=1
|
should_fail=1
|
||||||
}
|
}
|
||||||
venv() {
|
venv() {
|
||||||
local bin="$1"
|
local bin="$1"
|
||||||
shift
|
shift
|
||||||
"${venv_bin}/${bin}${exe}" "$@"
|
"${venv_bin}/${bin}${exe}" "$@"
|
||||||
}
|
}
|
||||||
venv_install_yq() {
|
venv_install_yq() {
|
||||||
local py_suffix=''
|
local py_suffix=''
|
||||||
if type -P python3 &>/dev/null; then
|
if type -P python3 &>/dev/null; then
|
||||||
py_suffix='3'
|
py_suffix='3'
|
||||||
fi
|
fi
|
||||||
exe=''
|
exe=''
|
||||||
venv_bin='.venv/bin'
|
venv_bin='.venv/bin'
|
||||||
case "$(uname -s)" in
|
case "$(uname -s)" in
|
||||||
MINGW* | MSYS* | CYGWIN* | Windows_NT)
|
MINGW* | MSYS* | CYGWIN* | Windows_NT)
|
||||||
exe='.exe'
|
exe='.exe'
|
||||||
venv_bin='.venv/Scripts'
|
venv_bin='.venv/Scripts'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if [[ ! -d .venv ]]; then
|
if [[ ! -d .venv ]]; then
|
||||||
"python${py_suffix}" -m venv .venv
|
"python${py_suffix}" -m venv .venv
|
||||||
fi
|
fi
|
||||||
if [[ ! -e "${venv_bin}/yq${exe}" ]]; then
|
if [[ ! -e "${venv_bin}/yq${exe}" ]]; then
|
||||||
info "installing yq to ./.venv using pip"
|
info "installing yq to ./.venv using pip"
|
||||||
venv "pip${py_suffix}" install yq
|
venv "pip${py_suffix}" install yq
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ $# -gt 0 ]]; then
|
if [[ $# -gt 0 ]]; then
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
USAGE:
|
USAGE:
|
||||||
$0
|
$0
|
||||||
EOF
|
EOF
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Rust (if exists)
|
# Rust (if exists)
|
||||||
if [[ -n "$(git ls-files '*.rs')" ]]; then
|
if [[ -n "$(git ls-files '*.rs')" ]]; then
|
||||||
info "checking Rust code style"
|
info "checking Rust code style"
|
||||||
check_install cargo jq python3
|
check_install cargo jq python3
|
||||||
check_config .rustfmt.toml
|
check_config .rustfmt.toml
|
||||||
if check_install rustup; then
|
if check_install rustup; then
|
||||||
# `cargo fmt` cannot recognize files not included in the current workspace and modules
|
# `cargo fmt` cannot recognize files not included in the current workspace and modules
|
||||||
# defined inside macros, so run rustfmt directly.
|
# defined inside macros, so run rustfmt directly.
|
||||||
# We need to use nightly rustfmt because we use the unstable formatting options of rustfmt.
|
# We need to use nightly rustfmt because we use the unstable formatting options of rustfmt.
|
||||||
rustc_version=$(rustc -vV | grep '^release:' | cut -d' ' -f2)
|
rustc_version=$(rustc -vV | grep '^release:' | cut -d' ' -f2)
|
||||||
if [[ "${rustc_version}" == *"nightly"* ]] || [[ "${rustc_version}" == *"dev"* ]]; then
|
if [[ "${rustc_version}" == *"nightly"* ]] || [[ "${rustc_version}" == *"dev"* ]]; then
|
||||||
rustup component add rustfmt &>/dev/null
|
rustup component add rustfmt &>/dev/null
|
||||||
info "running \`rustfmt \$(git ls-files '*.rs')\`"
|
info "running \`rustfmt \$(git ls-files '*.rs')\`"
|
||||||
rustfmt $(git ls-files '*.rs')
|
rustfmt $(git ls-files '*.rs')
|
||||||
else
|
else
|
||||||
rustup component add rustfmt --toolchain nightly &>/dev/null
|
rustup component add rustfmt --toolchain nightly &>/dev/null
|
||||||
info "running \`rustfmt +nightly \$(git ls-files '*.rs')\`"
|
info "running \`rustfmt +nightly \$(git ls-files '*.rs')\`"
|
||||||
rustfmt +nightly $(git ls-files '*.rs')
|
rustfmt +nightly $(git ls-files '*.rs')
|
||||||
fi
|
|
||||||
check_diff $(git ls-files '*.rs')
|
|
||||||
fi
|
fi
|
||||||
cast_without_turbofish=$(grep -n -E '\.cast\(\)' $(git ls-files '*.rs') || true)
|
check_diff $(git ls-files '*.rs')
|
||||||
if [[ -n "${cast_without_turbofish}" ]]; then
|
fi
|
||||||
error "please replace \`.cast()\` with \`.cast::<type_name>()\`:"
|
cast_without_turbofish=$(grep -n -E '\.cast\(\)' $(git ls-files '*.rs') || true)
|
||||||
echo "${cast_without_turbofish}"
|
if [[ -n "${cast_without_turbofish}" ]]; then
|
||||||
|
error "please replace \`.cast()\` with \`.cast::<type_name>()\`:"
|
||||||
|
echo "${cast_without_turbofish}"
|
||||||
|
fi
|
||||||
|
# Sync readme and crate-level doc.
|
||||||
|
first='1'
|
||||||
|
for readme in $(git ls-files '*README.md'); do
|
||||||
|
if ! grep -q '^<!-- tidy:crate-doc:start -->' "${readme}"; then
|
||||||
|
continue
|
||||||
fi
|
fi
|
||||||
# Sync readme and crate-level doc.
|
lib="$(dirname "${readme}")/src/lib.rs"
|
||||||
first='1'
|
if [[ -n "${first}" ]]; then
|
||||||
for readme in $(git ls-files '*README.md'); do
|
first=''
|
||||||
if ! grep -q '^<!-- tidy:crate-doc:start -->' "${readme}"; then
|
info "checking readme and crate-level doc are synchronized"
|
||||||
continue
|
fi
|
||||||
fi
|
if ! grep -q '^<!-- tidy:crate-doc:end -->' "${readme}"; then
|
||||||
lib="$(dirname "${readme}")/src/lib.rs"
|
bail "missing '<!-- tidy:crate-doc:end -->' comment in ${readme}"
|
||||||
if [[ -n "${first}" ]]; then
|
fi
|
||||||
first=''
|
if ! grep -q '^<!-- tidy:crate-doc:start -->' "${lib}"; then
|
||||||
info "checking readme and crate-level doc are synchronized"
|
bail "missing '<!-- tidy:crate-doc:start -->' comment in ${lib}"
|
||||||
fi
|
fi
|
||||||
if ! grep -q '^<!-- tidy:crate-doc:end -->' "${readme}"; then
|
if ! grep -q '^<!-- tidy:crate-doc:end -->' "${lib}"; then
|
||||||
bail "missing '<!-- tidy:crate-doc:end -->' comment in ${readme}"
|
bail "missing '<!-- tidy:crate-doc:end -->' comment in ${lib}"
|
||||||
fi
|
fi
|
||||||
if ! grep -q '^<!-- tidy:crate-doc:start -->' "${lib}"; then
|
new=$(tr <"${readme}" '\n' '\a' | grep -o '<!-- tidy:crate-doc:start -->.*<!-- tidy:crate-doc:end -->' | sed 's/\&/\\\&/g; s/\\/\\\\/g')
|
||||||
bail "missing '<!-- tidy:crate-doc:start -->' comment in ${lib}"
|
new=$(tr <"${lib}" '\n' '\a' | awk -v new="${new}" 'gsub("<!-- tidy:crate-doc:start -->.*<!-- tidy:crate-doc:end -->",new)' | tr '\a' '\n')
|
||||||
fi
|
echo "${new}" >"${lib}"
|
||||||
if ! grep -q '^<!-- tidy:crate-doc:end -->' "${lib}"; then
|
check_diff "${lib}"
|
||||||
bail "missing '<!-- tidy:crate-doc:end -->' comment in ${lib}"
|
done
|
||||||
fi
|
# Make sure that public Rust crates don't contain executables and binaries.
|
||||||
new=$(tr <"${readme}" '\n' '\a' | grep -o '<!-- tidy:crate-doc:start -->.*<!-- tidy:crate-doc:end -->' | sed 's/\&/\\\&/g; s/\\/\\\\/g')
|
executables=''
|
||||||
new=$(tr <"${lib}" '\n' '\a' | awk -v new="${new}" 'gsub("<!-- tidy:crate-doc:start -->.*<!-- tidy:crate-doc:end -->",new)' | tr '\a' '\n')
|
binaries=''
|
||||||
echo "${new}" >"${lib}"
|
metadata=$(cargo metadata --format-version=1 --no-deps)
|
||||||
check_diff "${lib}"
|
has_public_crate=''
|
||||||
done
|
has_root_crate=''
|
||||||
# Make sure that public Rust crates don't contain executables and binaries.
|
venv_install_yq
|
||||||
executables=''
|
for id in $(jq <<<"${metadata}" '.workspace_members[]'); do
|
||||||
binaries=''
|
pkg=$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})")
|
||||||
metadata=$(cargo metadata --format-version=1 --no-deps)
|
publish=$(jq <<<"${pkg}" -r '.publish')
|
||||||
has_public_crate=''
|
manifest_path=$(jq <<<"${pkg}" -r '.manifest_path')
|
||||||
has_root_crate=''
|
if [[ "$(venv tomlq -c '.lints' "${manifest_path}")" == "null" ]]; then
|
||||||
venv_install_yq
|
error "no [lints] table in ${manifest_path} please add '[lints]' with 'workspace = true'"
|
||||||
for id in $(jq <<<"${metadata}" '.workspace_members[]'); do
|
fi
|
||||||
pkg=$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})")
|
# Publishing is unrestricted if null, and forbidden if an empty array.
|
||||||
publish=$(jq <<<"${pkg}" -r '.publish')
|
if [[ "${publish}" == "[]" ]]; then
|
||||||
manifest_path=$(jq <<<"${pkg}" -r '.manifest_path')
|
continue
|
||||||
if [[ "$(venv tomlq -c '.lints' "${manifest_path}")" == "null" ]]; then
|
fi
|
||||||
error "no [lints] table in ${manifest_path} please add '[lints]' with 'workspace = true'"
|
has_public_crate='1'
|
||||||
fi
|
done
|
||||||
|
if [[ -n "${has_public_crate}" ]]; then
|
||||||
|
info "checking public crates don't contain executables and binaries"
|
||||||
|
if [[ -f Cargo.toml ]]; then
|
||||||
|
root_manifest=$(cargo locate-project --message-format=plain --manifest-path Cargo.toml)
|
||||||
|
root_pkg=$(jq <<<"${metadata}" ".packages[] | select(.manifest_path == \"${root_manifest}\")")
|
||||||
|
if [[ -n "${root_pkg}" ]]; then
|
||||||
|
publish=$(jq <<<"${root_pkg}" -r '.publish')
|
||||||
# Publishing is unrestricted if null, and forbidden if an empty array.
|
# Publishing is unrestricted if null, and forbidden if an empty array.
|
||||||
if [[ "${publish}" == "[]" ]]; then
|
if [[ "${publish}" != "[]" ]]; then
|
||||||
continue
|
has_root_crate=1
|
||||||
fi
|
exclude=$(venv tomlq -r '.package.exclude[]' Cargo.toml)
|
||||||
has_public_crate='1'
|
if ! grep <<<"${exclude}" -Eq '^/\.\*$'; then
|
||||||
done
|
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/.*\""
|
||||||
if [[ -n "${has_public_crate}" ]]; then
|
fi
|
||||||
info "checking public crates don't contain executables and binaries"
|
if [[ -e tools ]] && ! grep <<<"${exclude}" -Eq '^/tools$'; then
|
||||||
if [[ -f Cargo.toml ]]; then
|
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/tools\" if it exists"
|
||||||
root_manifest=$(cargo locate-project --message-format=plain --manifest-path Cargo.toml)
|
fi
|
||||||
root_pkg=$(jq <<<"${metadata}" ".packages[] | select(.manifest_path == \"${root_manifest}\")")
|
if [[ -e target-specs ]] && ! grep <<<"${exclude}" -Eq '^/target-specs$'; then
|
||||||
if [[ -n "${root_pkg}" ]]; then
|
error "top-level Cargo.toml of non-virtual workspace should have 'exclude' field with \"/target-specs\" if it exists"
|
||||||
publish=$(jq <<<"${root_pkg}" -r '.publish')
|
fi
|
||||||
# Publishing is unrestricted if null, and forbidden if an empty array.
|
|
||||||
if [[ "${publish}" != "[]" ]]; then
|
|
||||||
has_root_crate=1
|
|
||||||
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 <<<"${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 <<<"${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
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
for p in $(git ls-files); do
|
|
||||||
# Skip directories.
|
|
||||||
if [[ -d "${p}" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
# Top-level hidden files/directories and tools/* are excluded from crates.io (ensured by the above check).
|
|
||||||
# TODO: fully respect exclude field in Cargo.toml.
|
|
||||||
case "${p}" in
|
|
||||||
.* | tools/* | target-specs/*) continue ;;
|
|
||||||
*/*) ;;
|
|
||||||
*)
|
|
||||||
# If there is no crate at root, executables at the repository root directory if always okay.
|
|
||||||
if [[ -z "${has_root_crate}" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if [[ -x "${p}" ]]; then
|
|
||||||
executables+="${p}"$'\n'
|
|
||||||
fi
|
|
||||||
# Use diff instead of file because file treats an empty file as a binary
|
|
||||||
# https://unix.stackexchange.com/questions/275516/is-there-a-convenient-way-to-classify-files-as-binary-or-text#answer-402870
|
|
||||||
if (diff .gitattributes "${p}" || true) | grep -q '^Binary file'; then
|
|
||||||
binaries+="${p}"$'\n'
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -n "${executables}" ]]; then
|
|
||||||
error "file-permissions-check failed: executables are only allowed to be present in directories that are excluded from crates.io"
|
|
||||||
echo "======================================="
|
|
||||||
echo -n "${executables}"
|
|
||||||
echo "======================================="
|
|
||||||
fi
|
|
||||||
if [[ -n "${binaries}" ]]; then
|
|
||||||
error "file-permissions-check failed: binaries are only allowed to be present in directories that are excluded from crates.io"
|
|
||||||
echo "======================================="
|
|
||||||
echo -n "${binaries}"
|
|
||||||
echo "======================================="
|
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
for p in $(git ls-files); do
|
||||||
|
# Skip directories.
|
||||||
|
if [[ -d "${p}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Top-level hidden files/directories and tools/* are excluded from crates.io (ensured by the above check).
|
||||||
|
# TODO: fully respect exclude field in Cargo.toml.
|
||||||
|
case "${p}" in
|
||||||
|
.* | tools/* | target-specs/*) continue ;;
|
||||||
|
*/*) ;;
|
||||||
|
*)
|
||||||
|
# If there is no crate at root, executables at the repository root directory if always okay.
|
||||||
|
if [[ -z "${has_root_crate}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ -x "${p}" ]]; then
|
||||||
|
executables+="${p}"$'\n'
|
||||||
|
fi
|
||||||
|
# Use diff instead of file because file treats an empty file as a binary
|
||||||
|
# https://unix.stackexchange.com/questions/275516/is-there-a-convenient-way-to-classify-files-as-binary-or-text#answer-402870
|
||||||
|
if (diff .gitattributes "${p}" || true) | grep -q '^Binary file'; then
|
||||||
|
binaries+="${p}"$'\n'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -n "${executables}" ]]; then
|
||||||
|
error "file-permissions-check failed: executables are only allowed to be present in directories that are excluded from crates.io"
|
||||||
|
echo "======================================="
|
||||||
|
echo -n "${executables}"
|
||||||
|
echo "======================================="
|
||||||
|
fi
|
||||||
|
if [[ -n "${binaries}" ]]; then
|
||||||
|
error "file-permissions-check failed: binaries are only allowed to be present in directories that are excluded from crates.io"
|
||||||
|
echo "======================================="
|
||||||
|
echo -n "${binaries}"
|
||||||
|
echo "======================================="
|
||||||
|
fi
|
||||||
|
fi
|
||||||
elif [[ -e .rustfmt.toml ]]; then
|
elif [[ -e .rustfmt.toml ]]; then
|
||||||
error ".rustfmt.toml is unused"
|
error ".rustfmt.toml is unused"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# C/C++ (if exists)
|
# C/C++ (if exists)
|
||||||
if [[ -n "$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')" ]]; then
|
if [[ -n "$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')" ]]; then
|
||||||
info "checking C/C++ code style"
|
info "checking C/C++ code style"
|
||||||
check_config .clang-format
|
check_config .clang-format
|
||||||
if check_install clang-format; then
|
if check_install clang-format; then
|
||||||
info "running \`clang-format -i \$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')\`"
|
info "running \`clang-format -i \$(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')\`"
|
||||||
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')
|
check_diff $(git ls-files '*.c' '*.h' '*.cpp' '*.hpp')
|
||||||
fi
|
fi
|
||||||
elif [[ -e .clang-format ]]; then
|
elif [[ -e .clang-format ]]; then
|
||||||
error ".clang-format is unused"
|
error ".clang-format is unused"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# YAML/JavaScript/JSON (if exists)
|
# YAML/JavaScript/JSON (if exists)
|
||||||
if [[ -n "$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')" ]]; then
|
if [[ -n "$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')" ]]; then
|
||||||
info "checking YAML/JavaScript/JSON code style"
|
info "checking YAML/JavaScript/JSON code style"
|
||||||
check_config .editorconfig
|
check_config .editorconfig
|
||||||
if check_install npm; then
|
if check_install npm; then
|
||||||
info "running \`npx -y prettier -l -w \$(git ls-files '*.yml' '*.yaml' '*.js' '*.json')\`"
|
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')
|
npx -y prettier -l -w $(git ls-files '*.yml' '*.yaml' '*.js' '*.json')
|
||||||
check_diff $(git ls-files '*.yml' '*.yaml' '*.js' '*.json')
|
check_diff $(git ls-files '*.yml' '*.yaml' '*.js' '*.json')
|
||||||
fi
|
fi
|
||||||
# Check GitHub workflows.
|
# Check GitHub workflows.
|
||||||
if [[ -d .github/workflows ]]; then
|
if [[ -d .github/workflows ]]; then
|
||||||
info "checking GitHub workflows"
|
info "checking GitHub workflows"
|
||||||
if check_install jq python3; then
|
if check_install jq python3; then
|
||||||
venv_install_yq
|
venv_install_yq
|
||||||
for workflow in .github/workflows/*.yml; do
|
for workflow in .github/workflows/*.yml; do
|
||||||
# The top-level permissions must be weak as they are referenced by all jobs.
|
# The top-level permissions must be weak as they are referenced by all jobs.
|
||||||
permissions=$(venv yq -c '.permissions' "${workflow}")
|
permissions=$(venv yq -c '.permissions' "${workflow}")
|
||||||
case "${permissions}" in
|
case "${permissions}" in
|
||||||
'{"contents":"read"}' | '{"contents":"none"}') ;;
|
'{"contents":"read"}' | '{"contents":"none"}') ;;
|
||||||
null) error "${workflow}: top level permissions not found; it must be 'contents: read' or weaker permissions" ;;
|
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" ;;
|
*) 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
|
esac
|
||||||
# Make sure the 'needs' section is not out of date.
|
# Make sure the 'needs' section is not out of date.
|
||||||
if grep -q '# tidy:needs' "${workflow}" && ! grep -Eq '# *needs: \[' "${workflow}"; then
|
if grep -q '# tidy:needs' "${workflow}" && ! grep -Eq '# *needs: \[' "${workflow}"; then
|
||||||
# shellcheck disable=SC2207
|
# shellcheck disable=SC2207
|
||||||
jobs_actual=($(venv yq '.jobs' "${workflow}" | jq -r 'keys_unsorted[]'))
|
jobs_actual=($(venv yq '.jobs' "${workflow}" | jq -r 'keys_unsorted[]'))
|
||||||
unset 'jobs_actual[${#jobs_actual[@]}-1]'
|
unset 'jobs_actual[${#jobs_actual[@]}-1]'
|
||||||
# shellcheck disable=SC2207
|
# shellcheck disable=SC2207
|
||||||
jobs_expected=($(venv yq -r '.jobs."ci-success".needs[]' "${workflow}"))
|
jobs_expected=($(venv yq -r '.jobs."ci-success".needs[]' "${workflow}"))
|
||||||
if [[ "${jobs_actual[*]}" != "${jobs_expected[*]+"${jobs_expected[*]}"}" ]]; then
|
if [[ "${jobs_actual[*]}" != "${jobs_expected[*]+"${jobs_expected[*]}"}" ]]; then
|
||||||
printf -v jobs '%s, ' "${jobs_actual[@]}"
|
printf -v jobs '%s, ' "${jobs_actual[@]}"
|
||||||
sed -i "s/needs: \[.*\] # tidy:needs/needs: [${jobs%, }] # tidy:needs/" "${workflow}"
|
sed -i "s/needs: \[.*\] # tidy:needs/needs: [${jobs%, }] # tidy:needs/" "${workflow}"
|
||||||
check_diff "${workflow}"
|
check_diff "${workflow}"
|
||||||
error "${workflow}: please update 'needs' section in 'ci-success' job"
|
error "${workflow}: please update 'needs' section in 'ci-success' job"
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [[ -n "$(git ls-files '*.yaml' | (grep -v .markdownlint-cli2.yaml || true))" ]]; then
|
if [[ -n "$(git ls-files '*.yaml' | (grep -v .markdownlint-cli2.yaml || true))" ]]; then
|
||||||
error "please use '.yml' instead of '.yaml' for consistency"
|
error "please use '.yml' instead of '.yaml' for consistency"
|
||||||
git ls-files '*.yaml' | (grep -v .markdownlint-cli2.yaml || true)
|
git ls-files '*.yaml' | (grep -v .markdownlint-cli2.yaml || true)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# TOML (if exists)
|
# TOML (if exists)
|
||||||
if [[ -n "$(git ls-files '*.toml' | (grep -v .taplo.toml || true))" ]]; then
|
if [[ -n "$(git ls-files '*.toml' | (grep -v .taplo.toml || true))" ]]; then
|
||||||
info "checking TOML style"
|
info "checking TOML style"
|
||||||
check_config .taplo.toml
|
check_config .taplo.toml
|
||||||
if check_install npm; then
|
if check_install npm; then
|
||||||
info "running \`npx -y @taplo/cli fmt \$(git ls-files '*.toml')\`"
|
info "running \`npx -y @taplo/cli fmt \$(git ls-files '*.toml')\`"
|
||||||
RUST_LOG=warn 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')
|
check_diff $(git ls-files '*.toml')
|
||||||
fi
|
fi
|
||||||
elif [[ -e .taplo.toml ]]; then
|
elif [[ -e .taplo.toml ]]; then
|
||||||
error ".taplo.toml is unused"
|
error ".taplo.toml is unused"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Markdown (if exists)
|
# Markdown (if exists)
|
||||||
if [[ -n "$(git ls-files '*.md')" ]]; then
|
if [[ -n "$(git ls-files '*.md')" ]]; then
|
||||||
info "checking Markdown style"
|
info "checking Markdown style"
|
||||||
check_config .markdownlint-cli2.yaml
|
check_config .markdownlint-cli2.yaml
|
||||||
if check_install npm; then
|
if check_install npm; then
|
||||||
info "running \`npx -y markdownlint-cli2 \$(git ls-files '*.md')\`"
|
info "running \`npx -y markdownlint-cli2 \$(git ls-files '*.md')\`"
|
||||||
npx -y markdownlint-cli2 $(git ls-files '*.md')
|
npx -y markdownlint-cli2 $(git ls-files '*.md')
|
||||||
fi
|
fi
|
||||||
elif [[ -e .markdownlint-cli2.yaml ]]; then
|
elif [[ -e .markdownlint-cli2.yaml ]]; then
|
||||||
error ".markdownlint-cli2.yaml is unused"
|
error ".markdownlint-cli2.yaml is unused"
|
||||||
fi
|
fi
|
||||||
if [[ -n "$(git ls-files '*.markdown')" ]]; then
|
if [[ -n "$(git ls-files '*.markdown')" ]]; then
|
||||||
error "please use '.md' instead of '.markdown' for consistency"
|
error "please use '.md' instead of '.markdown' for consistency"
|
||||||
git ls-files '*.markdown'
|
git ls-files '*.markdown'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Shell scripts
|
# Shell scripts
|
||||||
info "checking Shell scripts"
|
info "checking Shell scripts"
|
||||||
if check_install shfmt; then
|
if check_install shfmt; then
|
||||||
check_config .editorconfig
|
check_config .editorconfig
|
||||||
info "running \`shfmt -l -w \$(git ls-files '*.sh')\`"
|
info "running \`shfmt -l -w \$(git ls-files '*.sh')\`"
|
||||||
shfmt -l -w $(git ls-files '*.sh')
|
shfmt -l -w $(git ls-files '*.sh')
|
||||||
check_diff $(git ls-files '*.sh')
|
check_diff $(git ls-files '*.sh')
|
||||||
fi
|
fi
|
||||||
if check_install shellcheck; then
|
if check_install shellcheck; then
|
||||||
check_config .shellcheckrc
|
check_config .shellcheckrc
|
||||||
info "running \`shellcheck \$(git ls-files '*.sh')\`"
|
info "running \`shellcheck \$(git ls-files '*.sh')\`"
|
||||||
if ! shellcheck $(git ls-files '*.sh'); then
|
if ! shellcheck $(git ls-files '*.sh'); then
|
||||||
should_fail=1
|
should_fail=1
|
||||||
fi
|
fi
|
||||||
if [[ -n "$(git ls-files '*Dockerfile')" ]]; then
|
if [[ -n "$(git ls-files '*Dockerfile')" ]]; then
|
||||||
# SC2154 doesn't seem to work on dockerfile.
|
# SC2154 doesn't seem to work on dockerfile.
|
||||||
info "running \`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
|
if ! shellcheck -e SC2148,SC2154,SC2250 $(git ls-files '*Dockerfile'); then
|
||||||
should_fail=1
|
should_fail=1
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# License check
|
# License check
|
||||||
# TODO: This check is still experimental and does not track all files that should be tracked.
|
# TODO: This check is still experimental and does not track all files that should be tracked.
|
||||||
if [[ -f tools/.tidy-check-license-headers ]]; then
|
if [[ -f tools/.tidy-check-license-headers ]]; then
|
||||||
info "checking license headers (experimental)"
|
info "checking license headers (experimental)"
|
||||||
failed_files=''
|
failed_files=''
|
||||||
for p in $(eval $(<tools/.tidy-check-license-headers)); do
|
for p in $(eval $(<tools/.tidy-check-license-headers)); do
|
||||||
case "$(basename "${p}")" in
|
case "$(basename "${p}")" in
|
||||||
*.stderr | *.expanded.rs) continue ;; # generated files
|
*.stderr | *.expanded.rs) continue ;; # generated files
|
||||||
*.sh | *.py | *.rb | *Dockerfile) prefix=("# ") ;;
|
*.sh | *.py | *.rb | *Dockerfile) prefix=("# ") ;;
|
||||||
*.rs | *.c | *.h | *.cpp | *.hpp | *.s | *.S | *.js) prefix=("// " "/* ") ;;
|
*.rs | *.c | *.h | *.cpp | *.hpp | *.s | *.S | *.js) prefix=("// " "/* ") ;;
|
||||||
*.ld | *.x) prefix=("/* ") ;;
|
*.ld | *.x) prefix=("/* ") ;;
|
||||||
# TODO: More file types?
|
# TODO: More file types?
|
||||||
*) continue ;;
|
*) continue ;;
|
||||||
esac
|
esac
|
||||||
# TODO: The exact line number is not actually important; it is important
|
# TODO: The exact line number is not actually important; it is important
|
||||||
# that it be part of the top-level comments of the file.
|
# that it be part of the top-level comments of the file.
|
||||||
line="1"
|
line="1"
|
||||||
if IFS= LC_ALL=C read -rn3 -d '' shebang <"${p}" && [[ "${shebang}" == '#!/' ]]; then
|
if IFS= LC_ALL=C read -rn3 -d '' shebang <"${p}" && [[ "${shebang}" == '#!/' ]]; then
|
||||||
line="2"
|
line="2"
|
||||||
elif [[ "${p}" == *"Dockerfile" ]] && IFS= LC_ALL=C read -rn9 -d '' syntax <"${p}" && [[ "${syntax}" == '# syntax=' ]]; then
|
elif [[ "${p}" == *"Dockerfile" ]] && IFS= LC_ALL=C read -rn9 -d '' syntax <"${p}" && [[ "${syntax}" == '# syntax=' ]]; then
|
||||||
line="2"
|
line="2"
|
||||||
fi
|
|
||||||
header_found=''
|
|
||||||
for pre in "${prefix[@]}"; do
|
|
||||||
# TODO: check that the license is valid as SPDX and is allowed in this project.
|
|
||||||
if [[ "$(grep -E -n "${pre}SPDX-License-Identifier: " "${p}")" == "${line}:${pre}SPDX-License-Identifier: "* ]]; then
|
|
||||||
header_found='1'
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -z "${header_found}" ]]; then
|
|
||||||
failed_files+="${p}:${line}"$'\n'
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -n "${failed_files}" ]]; then
|
|
||||||
error "license-check failed: please add SPDX-License-Identifier to the following files"
|
|
||||||
echo "======================================="
|
|
||||||
echo -n "${failed_files}"
|
|
||||||
echo "======================================="
|
|
||||||
fi
|
fi
|
||||||
|
header_found=''
|
||||||
|
for pre in "${prefix[@]}"; do
|
||||||
|
# TODO: check that the license is valid as SPDX and is allowed in this project.
|
||||||
|
if [[ "$(grep -E -n "${pre}SPDX-License-Identifier: " "${p}")" == "${line}:${pre}SPDX-License-Identifier: "* ]]; then
|
||||||
|
header_found='1'
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -z "${header_found}" ]]; then
|
||||||
|
failed_files+="${p}:${line}"$'\n'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -n "${failed_files}" ]]; then
|
||||||
|
error "license-check failed: please add SPDX-License-Identifier to the following files"
|
||||||
|
echo "======================================="
|
||||||
|
echo -n "${failed_files}"
|
||||||
|
echo "======================================="
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Spell check (if config exists)
|
# Spell check (if config exists)
|
||||||
if [[ -f .cspell.json ]]; then
|
if [[ -f .cspell.json ]]; then
|
||||||
info "spell checking"
|
info "spell checking"
|
||||||
project_dictionary=.github/.cspell/project-dictionary.txt
|
project_dictionary=.github/.cspell/project-dictionary.txt
|
||||||
if check_install npm jq python3; then
|
if check_install npm jq python3; then
|
||||||
has_rust=''
|
has_rust=''
|
||||||
if [[ -n "$(git ls-files '*Cargo.toml')" ]]; then
|
if [[ -n "$(git ls-files '*Cargo.toml')" ]]; then
|
||||||
venv_install_yq
|
venv_install_yq
|
||||||
has_rust='1'
|
has_rust='1'
|
||||||
dependencies=''
|
dependencies=''
|
||||||
for manifest_path in $(git ls-files '*Cargo.toml'); do
|
for manifest_path in $(git ls-files '*Cargo.toml'); do
|
||||||
if [[ "${manifest_path}" != "Cargo.toml" ]] && [[ "$(venv tomlq -c '.workspace' "${manifest_path}")" == "null" ]]; then
|
if [[ "${manifest_path}" != "Cargo.toml" ]] && [[ "$(venv tomlq -c '.workspace' "${manifest_path}")" == "null" ]]; then
|
||||||
continue
|
continue
|
||||||
fi
|
|
||||||
metadata=$(cargo metadata --format-version=1 --no-deps --manifest-path "${manifest_path}")
|
|
||||||
for id in $(jq <<<"${metadata}" '.workspace_members[]'); do
|
|
||||||
dependencies+="$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})" | jq -r '.dependencies[].name')"$'\n'
|
|
||||||
done
|
|
||||||
done
|
|
||||||
# shellcheck disable=SC2001
|
|
||||||
dependencies=$(sed <<<"${dependencies}" 's/[0-9_-]/\n/g' | LC_ALL=C sort -f -u)
|
|
||||||
fi
|
fi
|
||||||
config_old=$(<.cspell.json)
|
metadata=$(cargo metadata --format-version=1 --no-deps --manifest-path "${manifest_path}")
|
||||||
config_new=$(grep <<<"${config_old}" -v '^ *//' | jq 'del(.dictionaries[] | select(index("organization-dictionary") | not))' | jq 'del(.dictionaryDefinitions[] | select(.name == "organization-dictionary" | not))')
|
for id in $(jq <<<"${metadata}" '.workspace_members[]'); do
|
||||||
trap -- 'echo "${config_old}" >.cspell.json; echo >&2 "$0: trapped SIGINT"; exit 1' SIGINT
|
dependencies+="$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})" | jq -r '.dependencies[].name')"$'\n'
|
||||||
echo "${config_new}" >.cspell.json
|
done
|
||||||
if [[ -n "${has_rust}" ]]; then
|
done
|
||||||
dependencies_words=$(npx <<<"${dependencies}" -y cspell stdin --no-progress --no-summary --words-only --unique || true)
|
# shellcheck disable=SC2001
|
||||||
fi
|
dependencies=$(sed <<<"${dependencies}" 's/[0-9_-]/\n/g' | LC_ALL=C sort -f -u)
|
||||||
all_words=$(npx -y cspell --no-progress --no-summary --words-only --unique $(git ls-files | (grep -v "${project_dictionary//\./\\.}" || true)) || true)
|
fi
|
||||||
echo "${config_old}" >.cspell.json
|
config_old=$(<.cspell.json)
|
||||||
trap - SIGINT
|
config_new=$(grep <<<"${config_old}" -v '^ *//' | jq 'del(.dictionaries[] | select(index("organization-dictionary") | not))' | jq 'del(.dictionaryDefinitions[] | select(.name == "organization-dictionary" | not))')
|
||||||
cat >.github/.cspell/rust-dependencies.txt <<EOF
|
trap -- 'echo "${config_old}" >.cspell.json; echo >&2 "$0: trapped SIGINT"; exit 1' SIGINT
|
||||||
|
echo "${config_new}" >.cspell.json
|
||||||
|
if [[ -n "${has_rust}" ]]; then
|
||||||
|
dependencies_words=$(npx <<<"${dependencies}" -y cspell stdin --no-progress --no-summary --words-only --unique || true)
|
||||||
|
fi
|
||||||
|
all_words=$(npx -y cspell --no-progress --no-summary --words-only --unique $(git ls-files | (grep -v "${project_dictionary//\./\\.}" || true)) || true)
|
||||||
|
echo "${config_old}" >.cspell.json
|
||||||
|
trap - SIGINT
|
||||||
|
cat >.github/.cspell/rust-dependencies.txt <<EOF
|
||||||
// This file is @generated by $(basename "$0").
|
// This file is @generated by $(basename "$0").
|
||||||
// It is not intended for manual editing.
|
// It is not intended for manual editing.
|
||||||
EOF
|
EOF
|
||||||
if [[ -n "${dependencies_words:-}" ]]; then
|
if [[ -n "${dependencies_words:-}" ]]; then
|
||||||
echo $'\n'"${dependencies_words}" >>.github/.cspell/rust-dependencies.txt
|
echo $'\n'"${dependencies_words}" >>.github/.cspell/rust-dependencies.txt
|
||||||
fi
|
|
||||||
if [[ -z "${REMOVE_UNUSED_WORDS:-}" ]]; then
|
|
||||||
check_diff .github/.cspell/rust-dependencies.txt
|
|
||||||
fi
|
|
||||||
if ! grep -Fq '.github/.cspell/rust-dependencies.txt linguist-generated' .gitattributes; then
|
|
||||||
error "you may want to mark .github/.cspell/rust-dependencies.txt linguist-generated"
|
|
||||||
fi
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
# Make sure the project-specific dictionary does not contain duplicated words.
|
|
||||||
for dictionary in .github/.cspell/*.txt; do
|
|
||||||
if [[ "${dictionary}" == "${project_dictionary}" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
dup=$(sed '/^$/d' "${project_dictionary}" "${dictionary}" | LC_ALL=C sort -f | uniq -d -i | (grep -v '//.*' || true))
|
|
||||||
if [[ -n "${dup}" ]]; then
|
|
||||||
error "duplicated words in dictionaries; please remove the following words from ${project_dictionary}"
|
|
||||||
echo "======================================="
|
|
||||||
echo "${dup}"
|
|
||||||
echo "======================================="
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Make sure the project-specific dictionary does not contain unused words.
|
|
||||||
if [[ -n "${REMOVE_UNUSED_WORDS:-}" ]]; then
|
|
||||||
grep_args=()
|
|
||||||
for word in $(grep -Ev '^//.*' "${project_dictionary}" || true); do
|
|
||||||
if ! grep -Eqi "^${word}$" <<<"${all_words}"; then
|
|
||||||
grep_args+=(-e "^${word}$")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ ${#grep_args[@]} -gt 0 ]]; then
|
|
||||||
info "removing unused words from ${project_dictionary}"
|
|
||||||
res=$(grep -Ev "${grep_args[@]}" "${project_dictionary}")
|
|
||||||
printf '%s\n' "${res}" >|"${project_dictionary}"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
unused=''
|
|
||||||
for word in $(grep -Ev '^//.*' "${project_dictionary}" || true); do
|
|
||||||
if ! grep -Eqi "^${word}$" <<<"${all_words}"; then
|
|
||||||
unused+="${word}"$'\n'
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [[ -n "${unused}" ]]; then
|
|
||||||
error "unused words in dictionaries; please remove the following words from ${project_dictionary} or run ${0##*/} with REMOVE_UNUSED_WORDS=1"
|
|
||||||
printf '=======================================\n'
|
|
||||||
printf '%s' "${unused}"
|
|
||||||
printf '=======================================\n'
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
if [[ -z "${REMOVE_UNUSED_WORDS:-}" ]]; then
|
||||||
|
check_diff .github/.cspell/rust-dependencies.txt
|
||||||
|
fi
|
||||||
|
if ! grep -Fq '.github/.cspell/rust-dependencies.txt linguist-generated' .gitattributes; then
|
||||||
|
error "you may want to mark .github/.cspell/rust-dependencies.txt linguist-generated"
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# Make sure the project-specific dictionary does not contain duplicated words.
|
||||||
|
for dictionary in .github/.cspell/*.txt; do
|
||||||
|
if [[ "${dictionary}" == "${project_dictionary}" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
dup=$(sed '/^$/d' "${project_dictionary}" "${dictionary}" | LC_ALL=C sort -f | uniq -d -i | (grep -v '//.*' || true))
|
||||||
|
if [[ -n "${dup}" ]]; then
|
||||||
|
error "duplicated words in dictionaries; please remove the following words from ${project_dictionary}"
|
||||||
|
echo "======================================="
|
||||||
|
echo "${dup}"
|
||||||
|
echo "======================================="
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Make sure the project-specific dictionary does not contain unused words.
|
||||||
|
if [[ -n "${REMOVE_UNUSED_WORDS:-}" ]]; then
|
||||||
|
grep_args=()
|
||||||
|
for word in $(grep -Ev '^//.*' "${project_dictionary}" || true); do
|
||||||
|
if ! grep -Eqi "^${word}$" <<<"${all_words}"; then
|
||||||
|
grep_args+=(-e "^${word}$")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ ${#grep_args[@]} -gt 0 ]]; then
|
||||||
|
info "removing unused words from ${project_dictionary}"
|
||||||
|
res=$(grep -Ev "${grep_args[@]}" "${project_dictionary}")
|
||||||
|
printf '%s\n' "${res}" >|"${project_dictionary}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
unused=''
|
||||||
|
for word in $(grep -Ev '^//.*' "${project_dictionary}" || true); do
|
||||||
|
if ! grep -Eqi "^${word}$" <<<"${all_words}"; then
|
||||||
|
unused+="${word}"$'\n'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -n "${unused}" ]]; then
|
||||||
|
error "unused words in dictionaries; please remove the following words from ${project_dictionary} or run ${0##*/} with REMOVE_UNUSED_WORDS=1"
|
||||||
|
printf '=======================================\n'
|
||||||
|
printf '%s' "${unused}"
|
||||||
|
printf '=======================================\n'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${should_fail:-}" ]]; then
|
if [[ -n "${should_fail:-}" ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user