diff --git a/util/scripts/update_submodules b/util/scripts/update_submodules
index 854a943cb5..6b8eb09960 100755
--- a/util/scripts/update_submodules
+++ b/util/scripts/update_submodules
@@ -7,55 +7,152 @@
# number of changes, create a commit to update the submodule to the
# new version.
+set -eu -o pipefail
+
+VERSION="1.01"
+PROGRAM=$0
+PROGNAME="$(basename "${PROGRAM}")"
+
export LANG=C
export LC_ALL=C
export TZ=UTC0
min_commits=10
-
TOP=${PWD}
SUBMODULES_WITH_UPDATES=0
-submodule_dirs=$(git submodule foreach pwd | grep -v Entering)
+submodule_dirs=()
+skip_sync=""
+max_commits_to_list=65
-(
-echo "Checking submodules..."
-for submodule in $submodule_dirs; do
- cd "$submodule" || exit 1
- initial_commit_id="$(git log --pretty='%h' -n 1)"
- initial_commit_description="$(git log --pretty='%ci - (%s)' -n 1)"
- git fetch 2>/dev/null
- updated_commit_id="$(git log --pretty='%h' -n 1 origin/master)"
- updated_commit_description="$(git log --pretty='%ci - (%s)' -n 1 "${updated_commit_id}")"
- if [ "${initial_commit_id}" = "${updated_commit_id}" ]; then
- # echo "No updates for ${submodule}"
- continue
+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
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
- SUBMODULES_WITH_UPDATES+=1
- update_count="$(git log --oneline "${initial_commit_id}..${updated_commit_id}" | wc -l)"
- echo "${update_count} new commits for ${submodule}"
- if [ "${update_count}" -ge "${min_commits}" ]; then
- echo "Creating commit to update ${submodule##*/} submodule"
- git checkout "${updated_commit_id}" > /dev/null 2>&1
- cd "${TOP}" || exit 1
- sleep 1
- git add "${submodule}" > /dev/null 2>&1 || exit 1
- sleep 1
- git commit -s -F- > /dev/null 2>&1 </dev/null
+ 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}")"
+ if [ "${initial_commit_id}" = "${updated_commit_id}" ]; then
+ echo "No updates for ${submodule}"
+ continue
+ fi
+ SUBMODULES_WITH_UPDATES+=1
+ 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}"
+ if [ "${update_count}" -ge "${min_commits}" ]; then
+ echo "Creating commit to update ${submodule##*/} submodule"
+ git checkout "${updated_commit_id}" > /dev/null 2>&1
+ cd "${TOP}" || exit 1
+ git add "${submodule}" > /dev/null 2>&1 || exit 1
+ git commit -s -F- > /dev/null 2>&1 <<-EOF
+ Update ${submodule##*/} submodule to upstream master
+
+ Updating from commit id ${initial_commit_id}:
+ $initial_commit_description
+
+ to commit id ${updated_commit_id}:
+ ${updated_commit_description}
+
+ This brings in ${update_count} new commits${new_commit_terminator}
+ ${update_log}
+ EOF
+ fi
+ done
+
+ if [ "${SUBMODULES_WITH_UPDATES}" = "0" ]; then
+ echo "No submodules with any updates."
+ fi
+}
+
+main "$@"