Compare commits

...

41 Commits

Author SHA1 Message Date
Taiki Endo
9fa9fafb73 Release 2.3.2 2023-01-20 10:27:59 +09:00
Taiki Endo
ad042ad7b1 Update just@latest to 1.12.0 2023-01-20 10:22:34 +09:00
Taiki Endo
a085553f57 Update cargo-no-dev-deps@latest to 0.2.0 2023-01-20 10:22:34 +09:00
Taiki Endo
06af96936d Update cspell dictionary 2023-01-19 01:57:13 +09:00
Taiki Endo
0b8b246f3d Set rust-related env vars for building codegen in CI 2023-01-18 22:10:38 +09:00
Taiki Endo
9b917368c2 clippy: Set avoid-breaking-exported-api = false 2023-01-18 21:59:47 +09:00
Taiki Endo
67f0979373 Release 2.3.1 2023-01-18 11:15:19 +09:00
Taiki Endo
e74b1e0d86 Update dprint@latest to 0.34.4 2023-01-18 11:14:22 +09:00
Taiki Endo
46d672f17d Update cargo-binstall@latest to 0.19.3 2023-01-18 11:14:22 +09:00
Taiki Endo
06dac1bb47 Release 2.3.0 2023-01-16 23:04:34 +09:00
Taiki Endo
a3609ab69a Tweak docs 2023-01-16 23:03:45 +09:00
Taiki Endo
8b9de1e094 Update changelog 2023-01-16 20:31:06 +09:00
Taiki Endo
2ed407fd17 codegen: Sort releases returned from GitHub API 2023-01-16 20:24:12 +09:00
Taiki Endo
ad8540ac77 Use cargo-binstall batching mode (#54) 2023-01-16 19:56:58 +09:00
Taiki Endo
b95ae1b223 Set CARGO_NET_RETRY and RUSTUP_MAX_RETRIES 2023-01-16 19:45:56 +09:00
Taiki Endo
c1300c3f7c Update cargo-binstall@latest to 0.19.2 2023-01-16 14:06:10 +09:00
Taiki Endo
bbd2d52c58 Update readme 2023-01-16 09:19:14 +09:00
Taiki Endo
ce26f7e3c8 Release 2.2.3 2023-01-16 09:14:31 +09:00
Taiki Endo
92ab599e22 Update cargo-llvm-cov@latest to 0.5.9 2023-01-16 09:13:46 +09:00
Taiki Endo
6a31ba8d6d Release 2.2.2 2023-01-15 23:53:06 +09:00
Taiki Endo
4b8b61e298 Fix info message 2023-01-15 21:38:36 +09:00
Taiki Endo
4269f7d620 codegen: Tweak retry 2023-01-15 21:05:37 +09:00
Taiki Endo
c92838b65e codegen: Format with rustfmt 2023-01-15 19:58:27 +09:00
Taiki Endo
f6e4dc6296 Improve retry on download failure 2023-01-15 19:55:57 +09:00
Taiki Endo
d538488fe5 Update cargo-llvm-cov@latest to 0.5.8 2023-01-15 19:48:54 +09:00
Taiki Endo
6e129b86d0 Add cache-cargo-install-action to related project list
https://github.com/taiki-e/cache-cargo-install-action
2023-01-15 18:38:24 +09:00
Taiki Endo
3b58ab42ed Tweak main.sh 2023-01-15 18:38:19 +09:00
Taiki Endo
38250d8ada Update CI config 2023-01-15 18:34:57 +09:00
Taiki Endo
d89f3d4042 Update tools/publish.sh 2023-01-15 18:33:24 +09:00
Taiki Endo
00f11cb267 Update cargo-nextest@latest to 0.9.49 2023-01-15 11:56:39 +09:00
Taiki Endo
8db8546a9c Add note about composite action 2023-01-14 00:02:59 +09:00
Taiki Endo
5fc2b23470 Tweak main.sh 2023-01-14 00:02:02 +09:00
Taiki Endo
aae39e2ce4 Set timeout-minutes in all jobs 2023-01-13 00:54:25 +09:00
Taiki Endo
54eee5470f Release 2.2.1 2023-01-12 23:35:47 +09:00
Taiki Endo
2411265c71 Tweak output 2023-01-12 23:13:17 +09:00
Taiki Endo
8066254c63 Update cargo-binstall@latest to 0.19.1 2023-01-12 23:13:10 +09:00
Taiki Endo
0feb352bd8 Update comments 2023-01-12 23:13:02 +09:00
Taiki Endo
9a9630c7b3 codegen: Fix retry on download 2023-01-12 23:12:45 +09:00
Taiki Endo
baf51dce12 codegen: Reject cases where any of binaries are missing 2023-01-12 23:12:20 +09:00
Taiki Endo
c096cea2cf codegen: Reject unknown fields in base manifest 2023-01-12 23:11:54 +09:00
Taiki Endo
cde5fb702d codegen: Fix handling of latest_only tool 2023-01-12 22:34:21 +09:00
18 changed files with 413 additions and 130 deletions

1
.clippy.toml Normal file
View File

@@ -0,0 +1 @@
avoid-breaking-exported-api = false

View File

@@ -79,15 +79,20 @@ xous
// Rust other
alloc
bools
builtins
canonicalize
consts
deque
doctest
hasher
impls
inlateout
intrinsics
lateout
msrv
nomem
nostack
peekable
punct
repr
@@ -99,16 +104,19 @@ supertrait
supertraits
toolchains
uninit
unsized
upcastable
// Other
connrefused
cygwin
dpkg
euxo
msys
noninteractive
noprofile
norc
nproc
pipefail
powerset
proto

View File

@@ -3,7 +3,6 @@ bytecodealliance
coreutils
distro
doas
Dpkg
dprint
enablerepo
epel
@@ -26,4 +25,5 @@ shellcheck
shfmt
udeps
wasmtime
watchexec
xscale

View File

@@ -13,13 +13,22 @@ on:
- cron: '0 1 * * *'
workflow_dispatch:
env:
CARGO_INCREMENTAL: 0
CARGO_NET_GIT_FETCH_WITH_CLI: true
CARGO_NET_RETRY: 10
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
RUSTFLAGS: -D warnings
RUSTUP_MAX_RETRIES: 10
defaults:
run:
shell: bash
jobs:
tidy:
uses: taiki-e/workflows/.github/workflows/tidy-rust.yml@main
uses: taiki-e/workflows/.github/workflows/tidy.yml@main
test:
strategy:
@@ -29,22 +38,23 @@ jobs:
- ubuntu-20.04
- ubuntu-22.04
tool:
# cargo-watch is supported by cargo-binstall (through quickinstall)
# cargo-watch/watchexec-cli is supported by cargo-binstall (through quickinstall)
# TODO: valgrind installation sometime hangs.
- cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
- cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
include:
# Note: Specifying the version of valgrind and cargo-binstall is not supported.
- os: ubuntu-20.04
tool: cargo-hack@0.5.24,cargo-llvm-cov@0.5.3,cargo-minimal-versions@0.1.8,cargo-no-dev-deps@0.1.0,parse-changelog@0.5.2,cargo-udeps@0.1.35,cargo-valgrind@2.1.0,cargo-deny@0.13.5,cross@0.2.4,dprint@0.34.1,just@1.9.0,nextest@0.9.11,protoc@3.21.12,shellcheck@0.9.0,shfmt@3.6.0,wasm-pack@0.10.3,wasmtime@4.0.0,mdbook@0.4.25,mdbook-linkcheck@0.7.7,cargo-watch@8.1.1,grcov@0.8.13
tool: cargo-hack@0.5.24,cargo-llvm-cov@0.5.3,cargo-minimal-versions@0.1.8,cargo-no-dev-deps@0.1.0,parse-changelog@0.5.2,cargo-udeps@0.1.35,cargo-valgrind@2.1.0,cargo-deny@0.13.5,cross@0.2.4,dprint@0.34.1,just@1.9.0,nextest@0.9.11,protoc@3.21.12,shellcheck@0.9.0,shfmt@3.6.0,wasm-pack@0.10.3,wasmtime@4.0.0,mdbook@0.4.25,mdbook-linkcheck@0.7.7,cargo-watch@8.1.1,grcov@0.8.13,watchexec-cli@1.20.5
- os: ubuntu-20.04
tool: cargo-hack@0.5,cargo-llvm-cov@0.5,cargo-minimal-versions@0.1,cargo-no-dev-deps@0.1,parse-changelog@0.5,cargo-udeps@0.1,cargo-valgrind@2.1,cargo-deny@0.13,cross@0.2,dprint@0.34,just@1.9,nextest@0.9,protoc@3.21,shellcheck@0.9,shfmt@3.5,wasm-pack@0.10,wasmtime@4.0,mdbook@0.4,mdbook-linkcheck@0.7,cargo-watch@8.1,grcov@0.8
tool: cargo-hack@0.5,cargo-llvm-cov@0.5,cargo-minimal-versions@0.1,cargo-no-dev-deps@0.1,parse-changelog@0.5,cargo-udeps@0.1,cargo-valgrind@2.1,cargo-deny@0.13,cross@0.2,dprint@0.34,just@1.9,nextest@0.9,protoc@3.21,shellcheck@0.9,shfmt@3.5,wasm-pack@0.10,wasmtime@4.0,mdbook@0.4,mdbook-linkcheck@0.7,cargo-watch@8.1,grcov@0.8,watchexec-cli@1.20
- os: ubuntu-20.04
tool: cargo-valgrind@2,just@1,protoc@3,shfmt@3,wasmtime@4,cargo-watch@8
tool: cargo-valgrind@2,just@1,protoc@3,shfmt@3,wasmtime@4,cargo-watch@8,watchexec-cli@1
- os: macos-11
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
- os: windows-2019
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
runs-on: ${{ matrix.os }}
timeout-minutes: 60
steps:
- uses: actions/checkout@v3
with:
@@ -76,21 +86,22 @@ jobs:
- rockylinux:8-minimal # glibc 2.28
tool:
# valgrind: installing snap to container is difficult...
- cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
- cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-udeps,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
include:
- container: ubuntu:22.04 # glibc 2.35
# cargo-udeps depends on openssl 1.1
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
- container: fedora:latest # glibc 2.36 (as of fedora 37)
# cargo-udeps depends on openssl 1.1
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,protoc,shellcheck,shfmt,wasm-pack,wasmtime,mdbook,mdbook-linkcheck,cargo-watch,grcov,watchexec-cli
- container: centos:7 # glibc 2.17
# cargo-udeps,protoc,valgrind,wasmtime,mdbook-linkcheck,cargo-watch don't provide prebuilt binaries for musl host.
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,shellcheck,shfmt,wasm-pack,mdbook,cargo-binstall,grcov
# cargo-udeps,protoc,valgrind,wasmtime,mdbook-linkcheck,cargo-watch don't provide prebuilt binaries for musl or old glibc host.
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,shellcheck,shfmt,wasm-pack,mdbook,cargo-binstall,grcov,watchexec-cli
- container: alpine:latest # musl 1.2.3 (as of alpine 3.17)
# cargo-udeps,protoc,valgrind,wasmtime,mdbook-linkcheck,cargo-watch don't provide prebuilt binaries for musl host.
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,shellcheck,shfmt,wasm-pack,mdbook,cargo-binstall,grcov
tool: cargo-hack,cargo-llvm-cov,cargo-minimal-versions,cargo-no-dev-deps,parse-changelog,cargo-valgrind,cargo-deny,cross,dprint,just,nextest,shellcheck,shfmt,wasm-pack,mdbook,cargo-binstall,grcov,watchexec-cli
runs-on: ubuntu-latest
timeout-minutes: 60
container: ${{ matrix.container }}
steps:
- name: Install requirements (ubuntu/debian)
@@ -132,6 +143,7 @@ jobs:
manifest:
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: write # TODO test
pull-requests: write
@@ -142,6 +154,8 @@ jobs:
- name: Install Rust
run: rustup toolchain add nightly --no-self-update && rustup default nightly
- run: tools/manifest.sh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: git add -N . && git diff --exit-code
if: github.repository_owner != 'taiki-e' || github.event_name != 'schedule' && !(github.event_name == 'push' && github.ref == 'refs/heads/main')
- id: diff

View File

@@ -17,6 +17,7 @@ jobs:
create-release:
if: github.repository_owner == 'taiki-e'
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v3
with:

View File

@@ -10,6 +10,40 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
## [Unreleased]
## [2.3.2] - 2023-01-20
- Update `just@latest` to 1.12.0.
- Update `cargo-no-dev-deps@latest` to 0.2.0.
## [2.3.1] - 2023-01-18
- Update `dprint@latest` to 0.34.4.
- Update `cargo-binstall@latest` to 0.19.3.
## [2.3.0] - 2023-01-16
- Update `cargo-binstall@latest` to 0.19.2.
- Use `cargo-binstall` batching mode (#54)
## [2.2.3] - 2023-01-16
- Update `cargo-llvm-cov@latest` to 0.5.9.
## [2.2.2] - 2023-01-15
- Update `cargo-llvm-cov@latest` to 0.5.8.
- Update `cargo-nextest@latest` to 0.9.49.
## [2.2.1] - 2023-01-12
- Update `cargo-binstall@latest` to 0.19.1.
- Support `cargo-binstall` on aarch64 Windows.
## [2.2.0] - 2023-01-11
- Update `cargo-llvm-cov@latest` to 0.5.7.
@@ -543,7 +577,13 @@ Note: This release is considered a breaking change because installing on version
Initial release
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.2.0...HEAD
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.3.2...HEAD
[2.3.2]: https://github.com/taiki-e/install-action/compare/v2.3.1...v2.3.2
[2.3.1]: https://github.com/taiki-e/install-action/compare/v2.3.0...v2.3.1
[2.3.0]: https://github.com/taiki-e/install-action/compare/v2.2.3...v2.3.0
[2.2.3]: https://github.com/taiki-e/install-action/compare/v2.2.2...v2.2.3
[2.2.2]: https://github.com/taiki-e/install-action/compare/v2.2.1...v2.2.2
[2.2.1]: https://github.com/taiki-e/install-action/compare/v2.2.0...v2.2.1
[2.2.0]: https://github.com/taiki-e/install-action/compare/v2.1.4...v2.2.0
[2.1.4]: https://github.com/taiki-e/install-action/compare/v2.1.3...v2.1.4
[2.1.3]: https://github.com/taiki-e/install-action/compare/v2.1.2...v2.1.3

View File

@@ -25,6 +25,8 @@ GitHub Action for installing development tools (mainly from GitHub Releases).
### Example workflow
To install the latest version:
```yaml
- uses: taiki-e/install-action@v2
with:
@@ -118,17 +120,19 @@ See the linked documentation for information on security when installed using [s
## Compatibility
This action has been tested for GitHub-hosted runners (Ubuntu, macOS, Windows) and containers (Ubuntu, Debian, Alpine, Fedora, CentOS, Rocky).
To use this action in self-hosted runners or in containers, you will need to install at least the following:
To use this action in self-hosted runners or in containers, at least the following tools are required:
- bash
- cargo (if you install cargo subcommands or use cargo-binstall fallback)
## Related Projects
- [cache-cargo-install-action]: GitHub Action for `cargo install` with cache.
- [create-gh-release-action]: GitHub Action for creating GitHub Releases based on changelog.
- [upload-rust-binary-action]: GitHub Action for building and uploading Rust binary to GitHub Releases.
- [setup-cross-toolchain-action]: GitHub Action for setup toolchains for cross compilation and cross testing for Rust.
[cache-cargo-install-action]: https://github.com/taiki-e/cache-cargo-install-action
[cargo-binstall]: https://github.com/cargo-bins/cargo-binstall
[create-gh-release-action]: https://github.com/taiki-e/create-gh-release-action
[setup-cross-toolchain-action]: https://github.com/taiki-e/setup-cross-toolchain-action

12
main.js
View File

@@ -1,3 +1,15 @@
// This is a script that just calls the bash script that does the main
// processing of the action. It works like a composite action that calls
// a single bash script.
//
// This was originally a trick adopted to make bash script-based actions work
// without docker before composite actions were supported. However, due to
// various problems with composite actions, this trick is still needed:
// - https://github.com/actions/runner/issues/665
// - https://github.com/actions/runner/issues/2185
// Although there are ways to work around these like cache-cargo-install-action does:
// https://github.com/taiki-e/cache-cargo-install-action/blob/v1.0.1/action.yml#L9-L11
const { execFileSync } = require('child_process');
function main() {

108
main.sh
View File

@@ -11,7 +11,7 @@ x() {
)
}
retry() {
for i in {1..5}; do
for i in {1..10}; do
if "$@"; then
return 0
else
@@ -226,10 +226,10 @@ install_cargo_binstall() {
local install_binstall='1'
if [[ -f "${cargo_bin}/cargo-binstall${exe}" ]]; then
if [[ "$(cargo binstall -V)" == "${binstall_version}" ]]; then
info "cargo-binstall already installed on in ${cargo_bin}/cargo-binstall${exe}"
info "cargo-binstall already installed at ${cargo_bin}/cargo-binstall${exe}"
install_binstall=''
else
info "cargo-binstall already installed on in ${cargo_bin}/cargo-binstall${exe}, but is not compatible version with install-action, upgrading"
info "cargo-binstall already installed at ${cargo_bin}/cargo-binstall${exe}, but is not compatible version with install-action, upgrading"
rm "${cargo_bin}/cargo-binstall${exe}"
fi
fi
@@ -241,22 +241,6 @@ install_cargo_binstall() {
x cargo binstall -V
fi
}
cargo_binstall() {
local tool="$1"
local version="$2"
info "install-action does not support ${tool}, fallback to cargo-binstall"
install_cargo_binstall
# By default, cargo-binstall enforce downloads over secure transports only.
# As a result, http will be disabled, and it will also set
# min tls version to be 1.2
case "${version}" in
latest) cargo binstall --force --no-confirm "${tool}" ;;
*) cargo binstall --force --no-confirm --version "${version}" "${tool}" ;;
esac
}
apt_update() {
if type -P sudo &>/dev/null; then
retry sudo apt-get -o Acquire::Retries=10 -qq update
@@ -291,9 +275,9 @@ snap_install() {
}
apk_install() {
if type -P doas &>/dev/null; then
doas apk add "$@"
doas apk add --no-cache "$@"
else
apk add "$@"
apk add --no-cache "$@"
fi
}
dnf_install() {
@@ -311,6 +295,11 @@ sys_install() {
esac
}
# cargo-binstall may call `cargo install` on their fallback: https://github.com/taiki-e/install-action/pull/54#issuecomment-1383140833
# cross calls rustup on `cross --version` if the current directly is cargo workspace.
export CARGO_NET_RETRY=10
export RUSTUP_MAX_RETRIES=10
if [[ $# -gt 0 ]]; then
bail "invalid argument '$1'"
fi
@@ -324,6 +313,11 @@ tools=()
if [[ -n "${tool}" ]]; then
while read -rd,; do tools+=("${REPLY}"); done <<<"${tool},"
fi
if [[ ${#tools[@]} -eq 0 ]]; then
warn "no tool specified; this could be caused by a dependabot bug where @<tool_name> tags on this action are replaced by @<version> tags"
# Exit with 0 for backward compatibility, we want to reject it in the next major release.
exit 0
fi
enable_checksum="${INPUT_CHECKSUM:-}"
case "${enable_checksum}" in
@@ -333,33 +327,16 @@ case "${enable_checksum}" in
esac
# Refs: https://github.com/rust-lang/rustup/blob/HEAD/rustup-init.sh
case "$(uname -m)" in
aarch64 | arm64) host_arch="aarch64" ;;
xscale | arm | armv6l | armv7l | armv8l)
# Ignore arm for now, as we need to consider the version and whether hard-float is supported.
# https://github.com/rust-lang/rustup/pull/593
# https://github.com/cross-rs/cross/pull/1018
# Does it seem only armv7l is supported?
# https://github.com/actions/runner/blob/6b9e8a6be411a6e63d5ccaf3c47e7b7622c5ec49/src/Misc/externals.sh#L174
bail "32-bit ARM runner is not supported yet by this action"
;;
# GitHub Actions Runner supports Linux (x86_64, aarch64, arm), Windows (x86_64, aarch64),
# and macOS (x86_64, aarch64).
# https://github.com/actions/runner
# https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners#supported-architectures-and-operating-systems-for-self-hosted-runners
# So we can assume x86_64 unless it is aarch64 or arm.
*) host_arch="x86_64" ;;
esac
base_distro=""
exe=""
case "$(uname -s)" in
Linux)
host_os=linux
host_env="gnu"
ldd_version=$(ldd --version 2>&1 || true)
if grep <<<"${ldd_version}" -q 'musl'; then
host_env="musl"
else
host_env="gnu"
host_glibc_version=$(grep <<<"${ldd_version}" -E "GLIBC|GNU libc" | sed "s/.* //g")
fi
if grep -q '^ID_LIKE=' /etc/os-release; then
@@ -397,6 +374,24 @@ case "$(uname -s)" in
;;
*) bail "unrecognized OS type '$(uname -s)'" ;;
esac
case "$(uname -m)" in
aarch64 | arm64) host_arch="aarch64" ;;
xscale | arm | armv6l | armv7l | armv8l)
# Ignore arm for now, as we need to consider the version and whether hard-float is supported.
# https://github.com/rust-lang/rustup/pull/593
# https://github.com/cross-rs/cross/pull/1018
# Does it seem only armv7l is supported?
# https://github.com/actions/runner/blob/caec043085990710070108f375cd0aeab45e1017/src/Misc/externals.sh#L174
bail "32-bit ARM runner is not supported yet by this action"
;;
# GitHub Actions Runner supports Linux (x86_64, aarch64, arm), Windows (x86_64, aarch64),
# and macOS (x86_64, aarch64).
# https://github.com/actions/runner
# https://github.com/actions/runner/blob/caec043085990710070108f375cd0aeab45e1017/.github/workflows/build.yml#L21
# https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners#supported-architectures-and-operating-systems-for-self-hosted-runners
# So we can assume x86_64 unless it is aarch64 or arm.
*) host_arch="x86_64" ;;
esac
tmp_dir="${HOME}/.install-action/tmp"
cargo_bin="${CARGO_HOME:-"${HOME}/.cargo"}/bin"
@@ -419,28 +414,23 @@ if ! type -P jq &>/dev/null || ! type -P curl &>/dev/null || ! type -P tar &>/de
esac
fi
if [[ ${#tools[@]} -eq 0 ]]; then
warn "no tool specified; this could be caused by a dependabot bug where @<tool_name> tags on this action are replaced by @<version> tags"
# Exit with 0 for backward compatibility, we want to reject it in the next major release.
exit 0
fi
unsupported_tools=()
for tool in "${tools[@]}"; do
if [[ "${tool}" == *"@"* ]]; then
version="${tool#*@}"
tool="${tool%@*}"
if [[ ! "${version}" =~ ^([1-9][0-9]*(\.[0-9]+(\.[0-9]+)?)?|0\.[1-9][0-9]*(\.[0-9]+)?|^0\.0\.[0-9]+)$|^latest$ ]]; then
if [[ ! "${version}" =~ ^([1-9][0-9]*(\.[0-9]+(\.[0-9]+)?)?|0\.[1-9][0-9]*(\.[0-9]+)?|^0\.0\.[0-9]+)(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$|^latest$ ]]; then
bail "install-action does not support semver operators"
bail "install-action does not support semver operators: '${version}'"
fi
bail "install-action v2 does not support semver pre-release and build-metadata; please submit an issue if you need these supports again"
bail "install-action v2 does not support semver pre-release and build-metadata; please submit an issue if you need these supports again: '${version}'"
fi
else
version="latest"
fi
tool="${tool%@*}"
info "installing ${tool}@${version}"
case "${tool}" in
protoc)
info "installing ${tool}@${version}"
read_manifest "protoc" "${version}"
# Copying files to /usr/local/include requires sudo, so do not use it.
bin_dir="${HOME}/.install-action/bin"
@@ -475,6 +465,7 @@ for tool in "${tools[@]}"; do
rm -rf "${tmp_dir}"
;;
valgrind)
info "installing ${tool}@${version}"
case "${version}" in
latest) ;;
*) warn "specifying the version of ${tool} is not supported yet by this action" ;;
@@ -491,6 +482,7 @@ for tool in "${tools[@]}"; do
snap_install valgrind --classic
;;
cargo-binstall)
info "installing ${tool}@${version}"
case "${version}" in
latest) ;;
*) warn "specifying the version of ${tool} is not supported by this action" ;;
@@ -507,10 +499,15 @@ for tool in "${tools[@]}"; do
# Use cargo-binstall fallback if tool is not available.
if [[ ! -f "${manifest_dir}/${tool}.json" ]]; then
cargo_binstall "${tool}" "${version}"
case "${version}" in
latest) unsupported_tools+=("${tool}") ;;
*) unsupported_tools+=("${tool}@${version}") ;;
esac
continue
fi
info "installing ${tool}@${version}"
# Pre-install
case "${tool}" in
shellcheck)
@@ -537,3 +534,14 @@ for tool in "${tools[@]}"; do
esac
echo
done
if [[ ${#unsupported_tools[@]} -gt 0 ]]; then
IFS=$','
info "install-action does not support ${unsupported_tools[*]}; fallback to cargo-binstall"
IFS=$'\n\t'
install_cargo_binstall
# By default, cargo-binstall enforce downloads over secure transports only.
# As a result, http will be disabled, and it will also set
# min tls version to be 1.2
cargo binstall --force --no-confirm "${unsupported_tools[@]}"
fi

View File

@@ -14,26 +14,32 @@
},
"aarch64_macos": {
"url": "https://github.com/cargo-bins/cargo-binstall/releases/download/v${version}/cargo-binstall-aarch64-apple-darwin.zip"
},
"aarch64_windows": {
"url": "https://github.com/cargo-bins/cargo-binstall/releases/download/v${version}/cargo-binstall-aarch64-pc-windows-msvc.zip"
}
},
"latest": {
"version": "0.18.1"
"version": "0.19.3"
},
"0.18.1": {
"0.19.3": {
"x86_64_linux_musl": {
"checksum": "ef05f04e951665b617fe0796ec72e5dc51e8724ee0b09a0da129fa24162369a0"
"checksum": "da46fac978af7d86820d1b6bbd14cfd10187bc25ac14c0236d3de8da7d92a183"
},
"x86_64_macos": {
"checksum": "291ad8f69e3f31a620c17a68cb456f64ab736947a76c57ffcc6f8602a09b4cb5"
"checksum": "237a702ac2ee3130bff3624a7296ec471c6b6ff45cc29af30216b50f2124af5d"
},
"x86_64_windows": {
"checksum": "bfc078cb22626bb80e1bb23a3cc74f4362c1326ec3f3dfc1cc46e1bd13528906"
"checksum": "053a32c20f44439366fdff80f5106097d6c3d128cb436cb0f425f32ed608d78b"
},
"aarch64_linux_musl": {
"checksum": "d26b5bbe14bbf7bd0f5fdd5b843f7f6df2c75d01168d42909932a422f17a4d5b"
"checksum": "be6c2542f093f393aa72734c96b12a353ec94232afba86fa6e93f25ed6d0669e"
},
"aarch64_macos": {
"checksum": "9ea261b7617bf6161447aa42b8e8979a7369aed3e5cef6b3774bec55fa4c70b6"
"checksum": "ba01100fbd810977b4e12deddfaab0516acc96cded05e00ccb4acfcab7d67f7c"
},
"aarch64_windows": {
"checksum": "22aa13d36cba7d1aee1a531bed53374c6ed3d02daf542fd65eee3c5dad700bc8"
}
}
}

View File

@@ -17,10 +17,44 @@
}
},
"latest": {
"version": "0.5.7"
"version": "0.5.9"
},
"0.5": {
"version": "0.5.7"
"version": "0.5.9"
},
"0.5.9": {
"x86_64_linux_musl": {
"checksum": "aadde3416c86403f72986f6c68001d2a46497ee8892f5affdb6b681213b586a2"
},
"x86_64_macos": {
"checksum": "7f7d17223237cc2ea65a4cd2d3ea0f0868711bd44dd56ee35839b41202b08685"
},
"x86_64_windows": {
"checksum": "efd986565868a0f1a255af9b913e77b95eb77b49940a93dde4e2c88874f2da39"
},
"aarch64_linux_musl": {
"checksum": "d6d539c038a07c12e04954af3357afadadf92ca3eacf5a155eb555b47d3b1ca4"
},
"aarch64_macos": {
"checksum": "4a023a922507d8a63424cb4b3d98c695fc2a66f8596b1e93b3a573afc2a384c5"
}
},
"0.5.8": {
"x86_64_linux_musl": {
"checksum": "78a2b85c54d2ecf76ad7309278901c2f4d6dcc611ef095844e8c6bd87b2d6a72"
},
"x86_64_macos": {
"checksum": "b1227359e4994f9ee96247bc2d47e36612f0b5344f9010f31ac965163a44e98c"
},
"x86_64_windows": {
"checksum": "d18f4da434596eb2c4aa2eaa95e00482130affa0a1710046c2d29c5c6edcb202"
},
"aarch64_linux_musl": {
"checksum": "11a3018bd91ff62806e7aa3413c5dc9af22ede870af4850866dbfe94cec0bd70"
},
"aarch64_macos": {
"checksum": "d4c67fac1dfa16cb130142bb572b310de856a8ec0494cc95351b5d82507793f2"
}
},
"0.5.7": {
"x86_64_linux_musl": {

View File

@@ -17,10 +17,27 @@
}
},
"latest": {
"version": "0.9.48"
"version": "0.9.49"
},
"0.9": {
"version": "0.9.48"
"version": "0.9.49"
},
"0.9.49": {
"x86_64_linux_gnu": {
"checksum": "5e19c5038c9940da4c47a9ae87f94b352dc98c2ab75b4b9aeae227cdff8440d2"
},
"x86_64_linux_musl": {
"checksum": "b09d7870bba824af1acfce505811951f0d81cf21b144490c6a3f34f59bcc182b"
},
"x86_64_macos": {
"checksum": "171bc696474667208587c74d9acce0250f3b2eac1faad39458e828a65c3f1c93"
},
"x86_64_windows": {
"checksum": "e9c532bb99c6e8e7edb65578f8c251fb3d87a3377bef1128763442dc7f088ebb"
},
"aarch64_linux_gnu": {
"checksum": "40ff81ed279e8a6d38ebe06ee75bba47785e8cb006267e35a15c157724e8e437"
}
},
"0.9.48": {
"x86_64_linux_gnu": {

View File

@@ -20,7 +20,30 @@
}
},
"latest": {
"version": "0.1.0"
"version": "0.2.0"
},
"0.2": {
"version": "0.2.0"
},
"0.2.0": {
"x86_64_linux_musl": {
"checksum": "446d7879e260d1a6170ee105c211255e0729d2db50d4d6378c60ebc19b26b056"
},
"x86_64_macos": {
"checksum": "7eb91033a29c16c02a67162858adcd592804b3f393b981a3f0e00c1c3ce7a29c"
},
"x86_64_windows": {
"checksum": "aa49deac93a3bf7d29809f5b687e1e39ad5dcb21d7f227c9690a400846dda144"
},
"aarch64_linux_musl": {
"checksum": "085738eb7b1377034c2f569bd6a6402499a1f2e71d5e89bccaa5d85303c32627"
},
"aarch64_macos": {
"checksum": "9854154d4f044807dd1ad06c9b2a94f93e0f8551f44c90cab1a955eb909457a2"
},
"aarch64_windows": {
"checksum": "8fafabd875be78457349ad2c860793d28a92efaf881de16fcda3e68bf9286baf"
}
},
"0.1": {
"version": "0.1.0"

View File

@@ -20,10 +20,44 @@
}
},
"latest": {
"version": "0.34.1"
"version": "0.34.4"
},
"0.34": {
"version": "0.34.1"
"version": "0.34.4"
},
"0.34.4": {
"x86_64_linux_musl": {
"checksum": "088d41a1b13b4623148119af9a3c2f618794170484294c210d5acd64f94a5cc6"
},
"x86_64_macos": {
"checksum": "74a1751e335ffde8385fb415365290b81d26f3509007a0cead1f62f8bb6d0e37"
},
"x86_64_windows": {
"checksum": "209e751b693f1c076fbd3d204af01bcb5c10be3f9dd99106bd14145e98de01fc"
},
"aarch64_linux_gnu": {
"checksum": "80607da90a920448d4361ad4993f7c5e770f3e8b6062d492ac00dd2eb558f256"
},
"aarch64_macos": {
"checksum": "bb052fa8f0cc995c09563adb07fb554a5386c2ed1152ba97a76734ed6ac55c4e"
}
},
"0.34.2": {
"x86_64_linux_musl": {
"checksum": "aee0a7ee92e67b9cc3d8d215dce4e0985c1239a1e674fbb987ac9e719f969ac8"
},
"x86_64_macos": {
"checksum": "5127902352952d5d913aafa16b65a52d3dd7b10f2f0f8c984b2d177f427f6c73"
},
"x86_64_windows": {
"checksum": "fdcb3c85e11b90ad18f2a967af6a259c881adbd895582a675ab5fd87798d05b4"
},
"aarch64_linux_gnu": {
"checksum": "507541fb2580113e2933ea34c5afe28bfb82cfb61650fa05827dd8c9981242da"
},
"aarch64_macos": {
"checksum": "038f0d391fdcf33214f0cd2793377c5673a39ebf8ff3a19225afd320efb0f8a2"
}
},
"0.34.1": {
"x86_64_linux_musl": {

View File

@@ -17,10 +17,30 @@
}
},
"latest": {
"version": "1.11.0"
"version": "1.12.0"
},
"1": {
"version": "1.11.0"
"version": "1.12.0"
},
"1.12": {
"version": "1.12.0"
},
"1.12.0": {
"x86_64_linux_musl": {
"checksum": "a8e1278f3a2c81384f9a146e74fc40b5204f00776cccfb4da4d36e45716546d4"
},
"x86_64_macos": {
"checksum": "22eeed0bcff05f5cd280345b611a9950b81c3a5b4cabb925cf5c0c77475b2dfd"
},
"x86_64_windows": {
"checksum": "a19d34d8b08e08a2d5b6839db6ece5bfd05faefa45b8924ecbe93f07d3e86e76"
},
"aarch64_linux_musl": {
"checksum": "a8f990336308179103c7776b463f89d751d7c910b757765dd47713b4a32b93a1"
},
"aarch64_macos": {
"checksum": "d08bcc10a690fed8db84e7a64c8665e69d56ad601a85fa970f0a82bee23ec204"
}
},
"1.11": {
"version": "1.11.0"

View File

@@ -14,6 +14,9 @@
"aarch64_linux_musl": {},
"aarch64_macos": {
"asset_name": "${package}-${rust_target}.zip"
},
"aarch64_windows": {
"asset_name": "${package}-${rust_target}.zip"
}
}
}

View File

@@ -29,6 +29,7 @@ fn main() -> Result<()> {
.join(format!("{package}.json"));
let download_cache_dir = &workspace_root.join("tools/codegen/tmp/cache").join(package);
fs::create_dir_all(download_cache_dir)?;
let base_info: BaseManifest = serde_json::from_slice(&fs::read(
workspace_root
.join("tools/codegen/base")
@@ -39,8 +40,10 @@ fn main() -> Result<()> {
.strip_prefix("https://github.com/")
.context("repository must be starts with https://github.com/")?;
eprintln!("downloading releases of https://github.com/{repo}");
eprintln!("downloading releases of https://github.com/{repo} from https://api.github.com/repos/{repo}/releases");
let mut releases: github::Releases = vec![];
// GitHub API returns up to 100 results at a time. If the number of releases
// is greater than 100, multiple fetches are needed.
for page in 1.. {
let per_page = 100;
let mut r: github::Releases = download(&format!(
@@ -53,13 +56,17 @@ fn main() -> Result<()> {
}
releases.append(&mut r);
}
let releases: Vec<_> = releases
let releases: BTreeMap<_, _> = releases
.iter()
.filter_map(|release| {
release
.tag_name
.strip_prefix(&base_info.tag_prefix)
.map(|version| (version, release))
let version = release.tag_name.strip_prefix(&base_info.tag_prefix)?;
let mut semver_version = version.parse::<semver::Version>();
if semver_version.is_err() {
if let Some(default_major_version) = &base_info.default_major_version {
semver_version = format!("{default_major_version}.{version}").parse();
}
}
Some((Reverse(semver_version.ok()?), (version, release)))
})
.collect();
@@ -109,13 +116,15 @@ fn main() -> Result<()> {
ManifestRef::Real(_) => &m.0 .0,
};
if !manifests.map.is_empty()
&& *version == releases.first().unwrap().0.parse()?
&& *version >= releases.first_key_value().unwrap().0 .0.clone().into()
{
return Ok(());
}
}
}
Some(format!("={}", releases.first().unwrap().0).parse()?)
let req = format!("={}", releases.first_key_value().unwrap().0 .0).parse()?;
eprintln!("update manifest for versions '{req}'");
Some(req)
}
None => match base_info.version_range {
Some(version_range) => Some(version_range.parse()?),
@@ -134,7 +143,7 @@ fn main() -> Result<()> {
let req = if version_req == "latest" {
if manifests.map.is_empty() {
format!("={}", releases.first().unwrap().0).parse()?
format!("={}", releases.first_key_value().unwrap().0 .0).parse()?
} else {
format!(">{}", semver_versions.last().unwrap()).parse()?
}
@@ -147,18 +156,9 @@ fn main() -> Result<()> {
};
let mut buf = vec![];
for &(version, release) in &releases {
let mut semver_version = version.parse::<semver::Version>();
if semver_version.is_err() {
if let Some(default_major_version) = &base_info.default_major_version {
semver_version = format!("{default_major_version}.{version}").parse();
}
}
let Ok(semver_version) = semver_version else {
continue;
};
for (Reverse(semver_version), (version, release)) in &releases {
if let Some(version_req) = &version_req {
if !version_req.matches(&semver_version) {
if !version_req.matches(semver_version) {
continue;
}
}
@@ -286,10 +286,37 @@ fn main() -> Result<()> {
);
}
let ManifestRef::Ref { version: latest_version } = manifests.map.first_key_value().unwrap().1.clone() else { unreachable!() };
if latest_only {
manifests
.map
.retain(|k, m| k.0 == Version::latest() || matches!(m, ManifestRef::Real(..)));
.retain(|k, _| k.0 == Version::latest() || k.0 == latest_version);
}
let ManifestRef::Real(latest_manifest) = &manifests.map[&Reverse(latest_version.clone())] else { unreachable!() };
for &p in base_info.platform.keys() {
if latest_manifest.download_info.contains_key(&p) {
continue;
}
if !base_info.prefer_linux_gnu {
if p == HostPlatform::x86_64_linux_gnu
&& latest_manifest
.download_info
.contains_key(&HostPlatform::x86_64_linux_musl)
{
continue;
}
if p == HostPlatform::aarch64_linux_gnu
&& latest_manifest
.download_info
.contains_key(&HostPlatform::aarch64_linux_musl)
{
continue;
}
}
bail!(
"platform list in base manifest for {package} contains {p:?}, \
but latest release ({latest_version}) doesn't contain it"
);
}
let original_manifests = manifests.clone();
@@ -355,21 +382,36 @@ fn replace_vars(s: &str, package: &str, version: &str, platform: HostPlatform) -
}
fn download(url: &str) -> Result<ureq::Response> {
let token = env::var("INTERNAL_CODEGEN_GH_PAT").ok();
let mut token1 = env::var("INTERNAL_CODEGEN_GH_PAT")
.ok()
.filter(|v| !v.is_empty());
let mut token2 = env::var("GITHUB_TOKEN").ok().filter(|v| !v.is_empty());
let mut retry = 0;
let mut last_error = None;
while retry < 5 {
let mut last_error;
loop {
let mut req = ureq::get(url);
if let Some(token) = &token {
if let Some(token) = &token1 {
req = req.set("Authorization", token);
} else if let Some(token) = &token2 {
req = req.set("Authorization", token);
}
match req.call() {
Ok(res) => return Ok(res),
Err(e) => last_error = Some(e),
}
if retry == 3 || retry == 6 {
if token1.is_some() {
token1 = None;
} else if token2.is_some() {
token2 = None;
}
}
retry += 1;
eprintln!("download failed; retrying ({retry}/5)");
std::thread::sleep(Duration::from_secs(retry));
if retry > 10 {
break;
}
eprintln!("download failed; retrying ({retry}/10)");
std::thread::sleep(Duration::from_secs(retry * 2));
}
Err(last_error.unwrap().into())
}
@@ -562,6 +604,7 @@ struct ManifestTemplateDownloadInfo {
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
struct BaseManifest {
/// Link to the GitHub repository.
repository: String,
@@ -582,6 +625,7 @@ struct BaseManifest {
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
struct BaseManifestPlatformInfo {
/// Asset name patterns. Default to the value at `BaseManifest::asset_name`.
asset_name: Option<StringOrArray>,
@@ -610,6 +654,7 @@ impl StringOrArray {
/// GitHub Actions Runner supports Linux (x86_64, aarch64, arm), Windows (x86_64, aarch64),
/// and macOS (x86_64, aarch64).
/// https://github.com/actions/runner
/// https://github.com/actions/runner/blob/caec043085990710070108f375cd0aeab45e1017/.github/workflows/build.yml#L21
/// https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners#supported-architectures-and-operating-systems-for-self-hosted-runners
///
/// Note:
@@ -622,7 +667,7 @@ impl StringOrArray {
/// https://github.com/rust-lang/rustup/pull/593
/// https://github.com/cross-rs/cross/pull/1018
/// Does it seem only armv7l is supported?
/// https://github.com/actions/runner/blob/6b9e8a6be411a6e63d5ccaf3c47e7b7622c5ec49/src/Misc/externals.sh#L174
/// https://github.com/actions/runner/blob/caec043085990710070108f375cd0aeab45e1017/src/Misc/externals.sh#L174
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
enum HostPlatform {

View File

@@ -21,7 +21,9 @@ bail() {
version="${1:?}"
version="${version#v}"
tag="v${version}"
tag_prefix="v"
tag="${tag_prefix}${version}"
changelog="CHANGELOG.md"
if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then
bail "invalid version format '${version}'"
fi
@@ -38,44 +40,55 @@ if gh release view "${tag}" &>/dev/null; then
bail "tag '${tag}' has already been created and pushed"
fi
if ! git branch | grep -q '\* main'; then
if ! git branch | grep -q '\* main$'; then
bail "current branch is not 'main'"
fi
tags=$(git --no-pager tag)
release_date=$(date -u '+%Y-%m-%d')
tags=$(git --no-pager tag | (grep -E "^${tag_prefix}[0-9]+" || true))
if [[ -n "${tags}" ]]; then
# Make sure the same release does not exist in CHANGELOG.md.
release_date=$(date -u '+%Y-%m-%d')
if grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then
bail "release ${version} already exist in CHANGELOG.md"
# Make sure the same release does not exist in changelog.
if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then
bail "release ${version} already exist in ${changelog}"
fi
if grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then
bail "link to ${version} already exist in CHANGELOG.md"
if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} already exist in ${changelog}"
fi
# Update changelog.
remote_url=$(grep -E '^\[Unreleased\]: https://' CHANGELOG.md | sed 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
before_tag="${remote_url#*/compare/}"
remote_url="${remote_url%/compare/*}"
sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" CHANGELOG.md
sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/v${version}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...v${version}#" CHANGELOG.md
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" CHANGELOG.md; then
bail "failed to update CHANGELOG.md"
sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" "${changelog}"
sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...${tag}#" "${changelog}"
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "failed to update ${changelog}"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " CHANGELOG.md; then
bail "failed to update CHANGELOG.md"
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "failed to update ${changelog}"
fi
else
# Make sure the release exists in changelog.
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "release ${version} does not exist in ${changelog} or has wrong release date"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} does not exist in ${changelog}"
fi
fi
# Make sure that a valid release note for this version exists.
# https://github.com/taiki-e/parse-changelog
changes=$(parse-changelog "${changelog}" "${version}")
if [[ -z "${changes}" ]]; then
bail "changelog for ${version} has no body"
fi
echo "============== CHANGELOG =============="
parse-changelog CHANGELOG.md "${version}"
echo "${changes}"
echo "======================================="
if [[ -n "${tags}" ]]; then
# Create a release commit.
git add CHANGELOG.md
git add "${changelog}"
git commit -m "Release ${version}"
fi