util/scripts: Add options to update_submodules

This extends and adds various options to the update_submodules script.

Extensions:
- Add help text
- Add all options, but specifically allow a single repo to be specified,
along with a minimum number of changes instead of being fixed at 10.
- Make it a more formal script with main() and functions
- Show changes in commit message, unless there are > 65 commits.

Options:
-c | --changes <#>     Specify the minimum number of changes to update a repo
-h | --help            Print usage and exit
-R | --repo <dir>      Specify a single repo directory to update
-s | --skipsync        Assume that repos are already synced
-V | --version         Print the version and exit

This does not fix style issues in the original, which will be fixed in
a follow-on commit.

Signed-off-by: Martin Roth <gaumless@gmail.com>
Change-Id: I222103babff7d5f4f8eb02869c598a4e06748a17
Reviewed-on: https://review.coreboot.org/c/coreboot/+/60831
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
This commit is contained in:
Martin Roth 2022-01-05 22:54:30 -07:00 committed by Felix Held
parent 623e2b351c
commit 3201e1e68c
1 changed files with 135 additions and 38 deletions

View File

@ -7,40 +7,135 @@
# number of changes, create a commit to update the submodule to the # number of changes, create a commit to update the submodule to the
# new version. # new version.
set -eu -o pipefail
VERSION="1.01"
PROGRAM=$0
PROGNAME="$(basename "${PROGRAM}")"
export LANG=C export LANG=C
export LC_ALL=C export LC_ALL=C
export TZ=UTC0 export TZ=UTC0
min_commits=10 min_commits=10
TOP=${PWD} TOP=${PWD}
SUBMODULES_WITH_UPDATES=0 SUBMODULES_WITH_UPDATES=0
submodule_dirs=$(git submodule foreach pwd | grep -v Entering) submodule_dirs=()
skip_sync=""
max_commits_to_list=65
show_version() {
echo "${PROGNAME} version ${VERSION}"
echo
}
usage() {
echo "Usage: ${PROGNAME} [options]"
echo
echo "Options:"
echo " -c | --changes <#> Specify the minimum number of changes to update a repo"
echo " -h | --help Print usage and exit"
echo " -R | --repo <dir> Specify a single repo directory to update"
echo " -s | --skipsync Assume that repos are already synced"
echo " -V | --version Print the version and exit"
echo
}
get_args() {
args=$(getopt -l changes:,help,repo:,skipsync,version -o c:hR:sV -- "$@")
getopt_ret=$?
eval set -- "${args}"
if [ ${getopt_ret} != 0 ]; then
usage
exit 1
fi
while true; do
local opt
opt="$1"
shift
case "${opt}" in
-c | --changes)
min_commits="${1}"
shift
;;
-h | --help)
usage
exit 0
;;
-R | --repo)
submodule_dirs=("$(readlink -f "${1}")")
shift
if [[ ! -d "${submodule_dirs[0]}" ]]; then
echo "Error: ${submodule_dirs[0]} is not valid."
usage
exit 1
fi
;;
-s | --skipsync)
skip_sync=1
;;
-V | --version)
exit 0
;;
*)
break
;;
esac
done
}
main() {
show_version
get_args "$@"
if (( ${#submodule_dirs[@]} == 0 )); then
readarray -t submodule_dirs < <(git submodule foreach pwd | grep -v "Entering")
fi
for submodule in "${submodule_dirs[@]}"; do
echo "Checking submodule ${submodule}"
if ! cd "$submodule"; then
echo "Error: could not cd to $submodule"
exit 1
fi
(
echo "Checking submodules..."
for submodule in $submodule_dirs; do
cd "$submodule" || exit 1
initial_commit_id="$(git log --pretty='%h' -n 1)" initial_commit_id="$(git log --pretty='%h' -n 1)"
initial_commit_description="$(git log --pretty='%ci - (%s)' -n 1)" initial_commit_description="$(git log --pretty='%ci - (%s)' -n 1)"
if [[ ${skip_sync} != "1" ]]; then
git fetch 2>/dev/null git fetch 2>/dev/null
updated_commit_id="$(git log --pretty='%h' -n 1 origin/master)" fi
if git branch -a | grep -q "origin/main"; then
branch_name="origin/main"
else
branch_name="origin/master"
fi
updated_commit_id="$(git log --pretty='%h' -n 1 "${branch_name}" -- )"
updated_commit_description="$(git log --pretty='%ci - (%s)' -n 1 "${updated_commit_id}")" updated_commit_description="$(git log --pretty='%ci - (%s)' -n 1 "${updated_commit_id}")"
if [ "${initial_commit_id}" = "${updated_commit_id}" ]; then if [ "${initial_commit_id}" = "${updated_commit_id}" ]; then
# echo "No updates for ${submodule}" echo "No updates for ${submodule}"
continue continue
fi fi
SUBMODULES_WITH_UPDATES+=1 SUBMODULES_WITH_UPDATES+=1
update_count="$(git log --oneline "${initial_commit_id}..${updated_commit_id}" | wc -l)" update_log="$(git log --oneline "${initial_commit_id}..${updated_commit_id}")"
update_count="$(echo "${update_log}" | wc -l)"
if [[ "${update_count}" -gt "${max_commits_to_list}" ]]; then
update_log=""
new_commit_terminator="."
else
new_commit_terminator=":"
fi
echo "${update_count} new commits for ${submodule}" echo "${update_count} new commits for ${submodule}"
if [ "${update_count}" -ge "${min_commits}" ]; then if [ "${update_count}" -ge "${min_commits}" ]; then
echo "Creating commit to update ${submodule##*/} submodule" echo "Creating commit to update ${submodule##*/} submodule"
git checkout "${updated_commit_id}" > /dev/null 2>&1 git checkout "${updated_commit_id}" > /dev/null 2>&1
cd "${TOP}" || exit 1 cd "${TOP}" || exit 1
sleep 1
git add "${submodule}" > /dev/null 2>&1 || exit 1 git add "${submodule}" > /dev/null 2>&1 || exit 1
sleep 1 git commit -s -F- > /dev/null 2>&1 <<-EOF
git commit -s -F- > /dev/null 2>&1 <<EOF
Update ${submodule##*/} submodule to upstream master Update ${submodule##*/} submodule to upstream master
Updating from commit id ${initial_commit_id}: Updating from commit id ${initial_commit_id}:
@ -49,13 +144,15 @@ $initial_commit_description
to commit id ${updated_commit_id}: to commit id ${updated_commit_id}:
${updated_commit_description} ${updated_commit_description}
This brings in ${update_count} new commits. This brings in ${update_count} new commits${new_commit_terminator}
${update_log}
EOF EOF
sleep 1
fi fi
done done
if [ "${SUBMODULES_WITH_UPDATES}" = "0" ]; then if [ "${SUBMODULES_WITH_UPDATES}" = "0" ]; then
echo "No submodules with any updates." echo "No submodules with any updates."
fi fi
) }
main "$@"