The command "git branch -a | grep -q ${branch}" may not exit with 0 when
pipefail is set. "grep -q" exits immediately with exit code 0 as soon as
a match is found. However, at that point "git branch -a" may be still
writing to the pipe, leading to SIGPIPE. When pipefail is set,
PIPESTATUS 141 will be returned. Fix the problem by not using "grep -q".
Also fix the branch name in the generated commit subject.
Change-Id: Ic07efb5e2a4f3b7bbc6e76da9e026771bc685bdb
Signed-off-by: Yu-Ping Wu <yupingso@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/77085
Reviewed-by: Yidi Lin <yidilin@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
		
	
		
			
				
	
	
		
			161 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: GPL-2.0-only
 | 
						|
 | 
						|
# Description:
 | 
						|
# Check all submodules for updates.  If there are more than a minimum
 | 
						|
# 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=()
 | 
						|
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
 | 
						|
 | 
						|
		initial_commit_id="$(git log --pretty='%h' -n 1)"
 | 
						|
		initial_commit_description="$(git log --pretty='%ci - (%s)' -n 1)"
 | 
						|
		if [[ ${skip_sync} != "1" ]]; then
 | 
						|
			git fetch 2>/dev/null
 | 
						|
		fi
 | 
						|
 | 
						|
		declare -a branches=("origin/main" "origin/master" "origin/trunk")
 | 
						|
		for branch in "${branches[@]}"; do
 | 
						|
			if git branch -a | grep "${branch}" > /dev/null; then
 | 
						|
				branch_name="${branch}"
 | 
						|
				break
 | 
						|
			fi
 | 
						|
		done
 | 
						|
 | 
						|
		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 ${branch##*/}
 | 
						|
 | 
						|
	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 "$@"
 |