3 # SPDX-License-Identifier: GPL-2.0-only
6 # Check all submodules for updates. If there are more than a minimum
7 # number of changes, create a commit to update the submodule to the
14 PROGNAME
="$(basename "${PROGRAM}")"
22 SUBMODULES_WITH_UPDATES
=0
25 max_commits_to_list
=65
28 echo "${PROGNAME} version ${VERSION}"
33 echo "Usage: ${PROGNAME} [options]"
36 echo " -c | --changes <#> Specify the minimum number of changes to update a repo"
37 echo " -h | --help Print usage and exit"
38 echo " -R | --repo <dir> Specify a single repo directory to update"
39 echo " -s | --skipsync Assume that repos are already synced"
40 echo " -V | --version Print the version and exit"
45 args
=$
(getopt
-l changes
:,help,repo
:,skipsync
,version
-o c
:hR
:sV
-- "$@")
49 if [ ${getopt_ret} != 0 ]; then
68 submodule_dirs
=("$(readlink -f "${1}")")
70 if [[ ! -d "${submodule_dirs[0]}" ]]; then
71 echo "Error: ${submodule_dirs[0]} is not valid."
94 if (( ${#submodule_dirs[@]} == 0 )); then
95 readarray
-t submodule_dirs
< <(git submodule foreach
pwd |
grep -v "Entering")
98 for submodule
in "${submodule_dirs[@]}"; do
99 echo "Checking submodule ${submodule}"
100 if ! cd "$submodule"; then
101 echo "Error: could not cd to $submodule"
105 initial_commit_id
="$(git log --pretty='%h' -n 1 --abbrev=12)"
106 initial_commit_description
="$(git log --pretty='%ci - (%s)' -n 1)"
107 if [[ ${skip_sync} != "1" ]]; then
108 git fetch
2>/dev
/null
111 declare -a branches
=("origin/main" "origin/master" "origin/trunk")
112 for branch
in "${branches[@]}"; do
113 if git branch
-a |
grep "${branch}" > /dev
/null
; then
114 branch_name
="${branch}"
119 updated_commit_id
="$(git log --pretty='%h' -n 1 --abbrev=12 "${branch_name}" -- )"
120 updated_commit_description
="$(git log --pretty='%ci - (%s)' -n 1 "${updated_commit_id}")"
121 if [ "${initial_commit_id}" = "${updated_commit_id}" ]; then
122 echo "No updates for ${submodule}"
125 SUBMODULES_WITH_UPDATES
+=1
126 update_log
="$(git log --oneline --abbrev=12 "${initial_commit_id}..
${updated_commit_id}")"
127 update_count
="$(echo "${update_log}" | wc -l)"
128 if [[ "${update_count}" -gt "${max_commits_to_list}" ]]; then
130 new_commit_terminator
="."
132 new_commit_terminator
=":"
134 echo "${update_count} new commits for ${submodule}"
135 if [ "${update_count}" -ge "${min_commits}" ]; then
136 echo "Creating commit to update ${submodule##*/} submodule"
137 git checkout
"${updated_commit_id}" > /dev
/null
2>&1
138 cd "${TOP}" ||
exit 1
139 git add
"${submodule}" > /dev
/null
2>&1 ||
exit 1
140 git commit
-s -F- > /dev
/null
2>&1 <<-EOF
141 Update ${submodule##*/} submodule to upstream ${branch##*/}
143 Updating from commit id ${initial_commit_id}:
144 $initial_commit_description
146 to commit id ${updated_commit_id}:
147 ${updated_commit_description}
149 This brings in ${update_count} new commits${new_commit_terminator}
155 if [ "${SUBMODULES_WITH_UPDATES}" = "0" ]; then
156 echo "No submodules with any updates."