Changeset View
Changeset View
Standalone View
Standalone View
contrib/source-control-tools/automated-commits.sh
#!/usr/bin/env bash | #!/usr/bin/env bash | ||||
# Note: Any bot running this script must have the appropriate permissions to | # Note: Any bot running this script must have the appropriate permissions to | ||||
# push commits upstream. When running locally, this script will git push in a | # push commits upstream. When running locally, this script will git push in a | ||||
# dry run by default. | # dry run by default. | ||||
export LC_ALL=C.UTF-8 | export LC_ALL=C.UTF-8 | ||||
set -euxo pipefail | set -euxo pipefail | ||||
DEFAULT_PARENT_COMMIT="origin/master" | DEFAULT_PARENT_COMMIT="origin/master" | ||||
help_message() { | help_message() { | ||||
cat <<EOF | cat <<EOF | ||||
$0 [options] [script] [script_args...] | |||||
deadalnix: You probably want to incentivize the use of `--` | |||||
Generate a commit from available recipes. | Generate a commit from available recipes. | ||||
The given script may produce a commit. If a commit is generated this way, it will be landed. | |||||
Options: | Options: | ||||
-p, --parent The parent commit to build ontop of. Default: '${DEFAULT_PARENT_COMMIT}' | -p, --parent The parent commit to build ontop of. Default: '${DEFAULT_PARENT_COMMIT}' | ||||
Note: This should only be used for testing since the behavior of setting | Note: This should only be used for testing since the behavior of setting | ||||
this to a particular commit varies slightly from the default. | this to a particular commit varies slightly from the default. | ||||
-h, --help Display this help message. | -h, --help Display this help message. | ||||
Environment Variables: | Environment Variables: | ||||
COMMIT_TYPE (required) The commit recipe to run. | COMMIT_TYPE (required) The commit recipe to run. | ||||
DRY_RUN If set to 'no', this script will push the generated changes upstream. Default: 'yes' | DRY_RUN If set to 'no', this script will push the generated changes upstream. Default: 'yes' | ||||
EOF | EOF | ||||
} | } | ||||
SCRIPT="" | |||||
SCRIPT_ARGS=() | |||||
PARENT_COMMIT="${DEFAULT_PARENT_COMMIT}" | PARENT_COMMIT="${DEFAULT_PARENT_COMMIT}" | ||||
# Parse command line arguments | # Parse command line arguments | ||||
while [[ $# -gt 0 ]]; do | while [[ $# -gt 0 ]]; do | ||||
case $1 in | case $1 in | ||||
-p|--parent) | -p|--parent) | ||||
PARENT_COMMIT=$(git rev-parse "$2") | PARENT_COMMIT=$(git rev-parse "$2") | ||||
shift # shift past argument | shift # shift past argument | ||||
shift # shift past value | shift # shift past value | ||||
;; | ;; | ||||
-h|--help) | -h|--help) | ||||
help_message | help_message | ||||
exit 0 | exit 0 | ||||
;; | ;; | ||||
*) | *) | ||||
echo "Unknown argument: $1" | SCRIPT="$1" | ||||
help_message | shift | ||||
exit 1 | SCRIPT_ARGS=("$@") | ||||
break | |||||
;; | ;; | ||||
esac | esac | ||||
done | done | ||||
: "${COMMIT_TYPE:=}" | : "${COMMIT_TYPE:=}" | ||||
if [ -z "${COMMIT_TYPE}" ]; then | if [ -z "${COMMIT_TYPE}" ]; then | ||||
echo "Error: Environment variable COMMIT_TYPE must be set" | echo "Error: Environment variable COMMIT_TYPE must be set" | ||||
exit 2 | exit 2 | ||||
Show All 22 Lines | |||||
export BUILD_DIR | export BUILD_DIR | ||||
DEVTOOLS_DIR="${TOPLEVEL}"/contrib/devtools | DEVTOOLS_DIR="${TOPLEVEL}"/contrib/devtools | ||||
# Make sure tree is clean | # Make sure tree is clean | ||||
git checkout master | git checkout master | ||||
git reset --hard "${PARENT_COMMIT}" | git reset --hard "${PARENT_COMMIT}" | ||||
# Common script to update the AUR packages. | |||||
# Usage: update-aur-version <package_name> | |||||
update-aur-version() { | |||||
# shellcheck source=../utils/compare-version.sh | |||||
source "${TOPLEVEL}"/contrib/utils/compare-version.sh | |||||
PACKAGE="$1" | |||||
CURRENT_VERSION="" | |||||
get_current_version CURRENT_VERSION | |||||
# Get the current version of the AUR package | |||||
PKGBUILD="${TOPLEVEL}"/contrib/aur/${PACKAGE}/PKGBUILD | |||||
# shellcheck source=../aur/bitcoin-abc/PKGBUILD | |||||
source "${PKGBUILD}" | |||||
# Compare the versions. We only want to update if | |||||
# (software version > package version) to prevent downgrades. | |||||
if version_less_equal "${CURRENT_VERSION}" "${pkgver}" | |||||
then | |||||
echo "Current version ${CURRENT_VERSION} <= ${PACKAGE} AUR package version ${pkgver}, skip the update" | |||||
exit 0 | |||||
fi | |||||
# Reset the release version to 0 and update the package version in the | |||||
# PKGBUILD file. | |||||
# Note that this pattern is very safe: because of the shell script syntax, | |||||
# no whitespace can occur and we have the original value as a variable. | |||||
sed -i "s/pkgrel=${pkgrel}/pkgrel=0/" "${PKGBUILD}" | |||||
sed -i "s/pkgver=${pkgver}/pkgver=${CURRENT_VERSION}/" "${PKGBUILD}" | |||||
git add "${PKGBUILD}" | |||||
git commit -m "Bump ${PACKAGE} AUR package version to ${CURRENT_VERSION}" | |||||
} | |||||
case "${COMMIT_TYPE}" in | case "${COMMIT_TYPE}" in | ||||
archive-release-notes) | archive-release-notes) | ||||
# shellcheck source=../utils/compare-version.sh | # shellcheck source=../utils/compare-version.sh | ||||
source "${TOPLEVEL}"/contrib/utils/compare-version.sh | source "${TOPLEVEL}"/contrib/utils/compare-version.sh | ||||
RELEASE_NOTES_FILE="${TOPLEVEL}/doc/release-notes.md" | RELEASE_NOTES_FILE="${TOPLEVEL}/doc/release-notes.md" | ||||
RELEASE_NOTES_VERSION=$(sed -n "1s/^Bitcoin ABC version \([0-9]\+\.[0-9]\+\.[0-9]\+\).\+$/\1/p" "${RELEASE_NOTES_FILE}") | RELEASE_NOTES_VERSION=$(sed -n "1s/^Bitcoin ABC version \([0-9]\+\.[0-9]\+\.[0-9]\+\).\+$/\1/p" "${RELEASE_NOTES_FILE}") | ||||
RELEASE_NOTES_ARCHIVE="${TOPLEVEL}/doc/release-notes/release-notes-${RELEASE_NOTES_VERSION}.md" | RELEASE_NOTES_ARCHIVE="${TOPLEVEL}/doc/release-notes/release-notes-${RELEASE_NOTES_VERSION}.md" | ||||
Show All 13 Lines | archive-release-notes) | ||||
# Generate a fresh blank release notes file for the new version | # Generate a fresh blank release notes file for the new version | ||||
PROJECT_VERSION="${CURRENT_VERSION}" envsubst < "${TOPLEVEL}/doc/release-notes/release-notes.md.in" > "${RELEASE_NOTES_FILE}" | PROJECT_VERSION="${CURRENT_VERSION}" envsubst < "${TOPLEVEL}/doc/release-notes/release-notes.md.in" > "${RELEASE_NOTES_FILE}" | ||||
git add "${RELEASE_NOTES_FILE}" "${RELEASE_NOTES_ARCHIVE}" | git add "${RELEASE_NOTES_FILE}" "${RELEASE_NOTES_ARCHIVE}" | ||||
git commit -m "${BOT_PREFIX} Archive release notes for version ${RELEASE_NOTES_VERSION}" | git commit -m "${BOT_PREFIX} Archive release notes for version ${RELEASE_NOTES_VERSION}" | ||||
;; | ;; | ||||
update-aur-version-bitcoin-abc) | |||||
update-aur-version "bitcoin-abc" | |||||
;; | |||||
update-aur-version-bitcoin-abc-qt) | |||||
update-aur-version "bitcoin-abc-qt" | |||||
;; | |||||
update-chainparams) | update-chainparams) | ||||
CHAINPARAMS_SCRIPTS_DIR="${DEVTOOLS_DIR}"/chainparams | CHAINPARAMS_SCRIPTS_DIR="${DEVTOOLS_DIR}"/chainparams | ||||
# Assumes bitcoind instances are already running on mainnet and testnet | # Assumes bitcoind instances are already running on mainnet and testnet | ||||
pushd "${CHAINPARAMS_SCRIPTS_DIR}" | pushd "${CHAINPARAMS_SCRIPTS_DIR}" | ||||
CHAINPARAMS_MAINNET_TXT="chainparams_main.txt" | CHAINPARAMS_MAINNET_TXT="chainparams_main.txt" | ||||
./make_chainparams.py > "${CHAINPARAMS_MAINNET_TXT}" | ./make_chainparams.py > "${CHAINPARAMS_MAINNET_TXT}" | ||||
git add "${CHAINPARAMS_MAINNET_TXT}" | git add "${CHAINPARAMS_MAINNET_TXT}" | ||||
▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | update-timings) | ||||
popd | popd | ||||
git add "${TIMING_SRC_FILE}" | git add "${TIMING_SRC_FILE}" | ||||
git commit -m "${BOT_PREFIX} Update timing.json" | git commit -m "${BOT_PREFIX} Update timing.json" | ||||
;; | ;; | ||||
*) | *) | ||||
if [ -z "${SCRIPT}" ]; then | |||||
echo "Error: Invalid commit name '${COMMIT_TYPE}'" | echo "Error: Invalid commit name '${COMMIT_TYPE}'" | ||||
exit 10 | exit 10 | ||||
fi | |||||
if [ ! -f "${SCRIPT}" ]; then | |||||
echo "Error: '${SCRIPT}' does not exist" | |||||
exit 10 | |||||
fi | |||||
"${SCRIPT}" "${SCRIPT_ARGS[@]}" | |||||
;; | ;; | ||||
esac | esac | ||||
# Bail early if there's nothing to land | |||||
if [ "$(git rev-parse HEAD)" == "$(git rev-parse ${PARENT_COMMIT})" ]; then | |||||
echo "No new changes. Nothing to do." | |||||
exit 0 | |||||
fi | |||||
# Land the generated commit | # Land the generated commit | ||||
"${TOPLEVEL}"/contrib/source-control-tools/land-patch.sh "${LAND_PATCH_ARGS[@]}" | "${TOPLEVEL}"/contrib/source-control-tools/land-patch.sh "${LAND_PATCH_ARGS[@]}" |
You probably want to incentivize the use of --