132 lines
3.2 KiB
Bash
Executable File
132 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Creates a new release of all the ethers crates in the workspace
|
|
#
|
|
# Note that this intended be run with the --execute flag, as the dry run will
|
|
# perform all the checks that a normal `cargo release` command would.
|
|
# This is because this script will execute only a few of the steps because it
|
|
# has to run `git-cliff` to create the changelog in between steps, and exclude
|
|
# all the example crates from the version bump.
|
|
|
|
set -e
|
|
|
|
info() {
|
|
printf "\e[34;1minfo\e[0m: %s\n" "$1"
|
|
}
|
|
|
|
throw() {
|
|
printf "\e[31;1merror\e[0m: %s\n\n%s\n" "$1" "$USAGE" 1>&2
|
|
exit 1
|
|
}
|
|
|
|
exec_or_print() {
|
|
if [ "$EXECUTE" ]; then
|
|
"$@"
|
|
else
|
|
echo "Skipping due to dry run. Command:" "$@"
|
|
fi
|
|
}
|
|
|
|
USAGE="Create a new release of the ethers workspace crates
|
|
|
|
Usage:
|
|
$(basename "$0") [OPTIONS] <VERSION>
|
|
|
|
Options:
|
|
-s, --sign Sign commits and tag
|
|
-v, --verbose Use verbose Cargo output
|
|
-e, --execute Actually perform a release. Dry-run mode is the default
|
|
-h, --help Show this help text and exit
|
|
|
|
Arguments:
|
|
<VERSION> See 'cargo release --help'. Levels are not supported"
|
|
|
|
SIGN_COMMIT=""
|
|
SIGN_TAG=""
|
|
VERBOSE=""
|
|
EXECUTE=""
|
|
VERSION=""
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-s|--sign)
|
|
SIGN_COMMIT="--sign-commit"
|
|
SIGN_TAG="--sign-tag"
|
|
shift
|
|
;;
|
|
-v|--verbose)
|
|
VERBOSE="--verbose"
|
|
shift
|
|
;;
|
|
-x|--execute)
|
|
EXECUTE="--execute"
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
echo "$USAGE"
|
|
exit 0
|
|
;;
|
|
|
|
--)
|
|
VERSION="$2"
|
|
break
|
|
;;
|
|
|
|
-*)
|
|
throw "unrecognized option: '$1'"
|
|
;;
|
|
|
|
*)
|
|
if [ "$VERSION" ]; then
|
|
throw "only one version can be specified"
|
|
else
|
|
VERSION="$1"
|
|
fi
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ ! "$VERSION" ]; then
|
|
throw "a version must be set" 1>&2
|
|
fi
|
|
|
|
# check for necessary binaries
|
|
NECESSARY=(cargo-release git-cliff)
|
|
MISSING=""
|
|
for bin in "${NECESSARY[@]}"; do
|
|
if ! command -v "$bin" &>/dev/null; then
|
|
MISSING=true
|
|
echo "'$bin' is required to run this command, but it is not installed" 1>&2
|
|
fi
|
|
done
|
|
[ "$MISSING" ] && throw "missing necessary binaries"
|
|
|
|
# exclude examples
|
|
WORKSPACE_FLAGS=(--workspace)
|
|
for ex in examples/*; do
|
|
if [ -d "$ex" ]; then
|
|
crate=$(echo "$ex" | tr / -)
|
|
WORKSPACE_FLAGS+=(--exclude "$crate")
|
|
fi
|
|
done
|
|
|
|
# shellcheck disable=SC2206
|
|
COMMON_FLAGS=($VERBOSE $EXECUTE)
|
|
|
|
info "bumping crate versions"
|
|
cargo release version "${WORKSPACE_FLAGS[@]}" "${COMMON_FLAGS[@]}" "$VERSION"
|
|
|
|
info "creating changelog"
|
|
exec_or_print git cliff -t "$VERSION" -o CHANGELOG.md
|
|
|
|
info "creating git commit"
|
|
exec_or_print cargo release commit "${COMMON_FLAGS[@]}" $SIGN_COMMIT
|
|
|
|
info "publishing crates"
|
|
exec_or_print cargo release publish "${COMMON_FLAGS[@]}" "${WORKSPACE_FLAGS[@]}"
|
|
|
|
info "tagging commits"
|
|
cargo release tag "${COMMON_FLAGS[@]}" "${WORKSPACE_FLAGS[@]}" $SIGN_TAG
|
|
|
|
info "pushing commits and tags to remote"
|
|
cargo release push "${COMMON_FLAGS[@]}" "${WORKSPACE_FLAGS[@]}"
|