Files
scylladb/scripts/refresh-submodules.sh
Avi Kivity cf72c31617 treewide: improve bash error reporting
bash error handling and reporting is atrocious. Without -e it will
just ignore errors. With -e it will stop on errors, but not report
where the error happened (apart from exiting itself with an error code).

Improve that with the `trap ERR` command. Note that this won't be invoked
on intentional error exit with `exit 1`.

We apply this on every bash script that contains -e or that it appears
trivial to set it in. Non-trivial scripts without -e are left unmodified,
since they might intentionally invoke failing scripts.

Closes scylladb/scylladb#22747
2025-02-10 18:28:52 +03:00

56 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
#
# Refresh git submodules by fast-forward merging them to the tip of the
# master branch of their respective repositories and committing the
# update with a default commit message of "git submodule summary".
#
# Copyright (C) 2020-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
set -euo pipefail
trap 'echo "error $? in $0 line $LINENO"' ERR
# The following is the default list of submodules to refresh. To only refresh
# some of them, pass the list of modules to refresh as arguments. For example,
# "scripts/refresh-submodules.sh seastar tools/java" only refreshes the
# two submodules seastar and tools/java.
submodules=(
seastar
tools/jmx
tools/java
tools/python3
)
for ent in "${@:-${submodules[@]}}"; do
submodule=${ent%%:*}
[ ${submodule} == ${ent} ] && branch="master" || branch=${ent#*:}
bump_to=origin/${branch}
pushd .
cd $submodule
git fetch origin ${branch}
if ! git merge-base --is-ancestor HEAD ${bump_to}; then
echo "Non fast-forward changes detected! Fire three red flares from your flare pistol."
exit 1
fi
# collect the summary
head_ref=$(git rev-parse --short=8 HEAD)
branch_ref=$(git rev-parse --short=8 origin/${branch})
count=$(git rev-list --no-merges --count HEAD..${bump_to})
# create a summary using the output format of "git submodule summary"
SUMMARY="
* ${submodule} ${head_ref}...${branch_ref} (${count}):
$(git log --pretty='format: > %s' --no-merges HEAD..${bump_to})"
# fast-forward to origin/master
git merge --ff-only ${bump_to}
popd
if [ ! -z "$SUMMARY" ]; then
git commit --edit -m "Update $submodule submodule" -m "$SUMMARY" $submodule
fi
done