chore: Update generation configuration at Fri Dec 13 02:28:28 UTC 202… · googleapis/java-datastore@106ee4d
@@ -28,11 +28,23 @@ function update_config() {
2828 sed -i -e "s/^${key_word}.*$/${key_word}: ${new_value}/" "${file}"
2929}
303031+# Update an action to a new version in GitHub action.
32+function update_action() {
33+local key_word=$1
34+local new_value=$2
35+local file=$3
36+echo "Update ${key_word} to ${new_value} in ${file}"
37+# use a different delimiter because the key_word contains "/".
38+ sed -i -e "s|${key_word}@v.*$|${key_word}@v${new_value}|" "${file}"
39+}
40+3141# The parameters of this script is:
3242# 1. base_branch, the base branch of the result pull request.
3343# 2. repo, organization/repo-name, e.g., googleapis/google-cloud-java
3444# 3. [optional] generation_config, the path to the generation configuration,
3545# the default value is generation_config.yaml in the repository root.
46+# 4. [optional] workflow, the library generation workflow file,
47+# the default value is .github/workflows/hermetic_library_generation.yaml.
3648while [[ $# -gt 0 ]]; do
3749key="$1"
3850case "${key}" in
@@ -48,6 +60,10 @@ case "${key}" in
4860 generation_config="$2"
4961shift
5062 ;;
63+ --workflow)
64+ workflow="$2"
65+shift
66+ ;;
5167*)
5268echo "Invalid option: [$1]"
5369exit 1
@@ -71,21 +87,34 @@ if [ -z "${generation_config}" ]; then
7187echo "Use default generation config: ${generation_config}"
7288fi
738990+if [ -z "${workflow}" ]; then
91+ workflow=".github/workflows/hermetic_library_generation.yaml"
92+echo "Use default library generation workflow file: ${workflow}"
93+fi
94+7495current_branch="generate-libraries-${base_branch}"
7596title="chore: Update generation configuration at $(date)"
769777-# try to find a open pull request associated with the branch
98+git checkout "${base_branch}"
99+# Try to find a open pull request associated with the branch
78100pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number")
79-# create a branch if there's no open pull request associated with the
101+# Create a branch if there's no open pull request associated with the
80102# branch; otherwise checkout the pull request.
81103if [ -z "${pr_num}" ]; then
82104 git checkout -b "${current_branch}"
105+# Push the current branch to remote so that we can
106+# compare the commits later.
107+ git push -u origin "${current_branch}"
83108else
84109 gh pr checkout "${pr_num}"
85110fi
86111112+# Only allow fast-forward merging; exit with non-zero result if there's merging
113+# conflict.
114+git merge -m "chore: merge ${base_branch} into ${current_branch}" "${base_branch}"
115+87116mkdir tmp-googleapis
88-# use partial clone because only commit history is needed.
117+# Use partial clone because only commit history is needed.
89118git clone --filter=blob:none https://github.com/googleapis/googleapis.git tmp-googleapis
90119pushd tmp-googleapis
91120git pull
@@ -94,25 +123,43 @@ popd
94123rm -rf tmp-googleapis
95124update_config "googleapis_commitish" "${latest_commit}" "${generation_config}"
9612597-# update gapic-generator-java version to the latest
126+# Update gapic-generator-java version to the latest
98127latest_version=$(get_latest_released_version "com.google.api" "gapic-generator-java")
99128update_config "gapic_generator_version" "${latest_version}" "${generation_config}"
100129101-# update libraries-bom version to the latest
130+# Update composite action version to latest gapic-generator-java version
131+update_action "googleapis/sdk-platform-java/.github/scripts" \
132+"${latest_version}" \
133+"${workflow}"
134+135+# Update libraries-bom version to the latest
102136latest_version=$(get_latest_released_version "com.google.cloud" "libraries-bom")
103137update_config "libraries_bom_version" "${latest_version}" "${generation_config}"
104138105-git add "${generation_config}"
139+git add "${generation_config}" "${workflow}"
106140changed_files=$(git diff --cached --name-only)
107141if [[ "${changed_files}" == "" ]]; then
108142echo "The latest generation config is not changed."
109143echo "Skip committing to the pull request."
144+else
145+ git commit -m "${title}"
146+fi
147+148+# There are potentially at most two commits: merge commit and change commit.
149+# We want to exit the script if no commit happens (otherwise this will be an
150+# infinite loop).
151+# `git cherry` is a way to find whether the local branch has commits that are
152+# not in the remote branch.
153+# If we find any such commit, push them to remote branch.
154+unpushed_commit=$(git cherry -v "origin/${current_branch}" | wc -l)
155+if [[ "${unpushed_commit}" -eq 0 ]]; then
156+echo "No unpushed commits, exit"
110157exit 0
111158fi
112-git commit -m "${title}"
159+113160if [ -z "${pr_num}" ]; then
114161 git remote add remote_repo https://cloud-java-bot:"${GH_TOKEN}@github.com/${repo}.git"
115- git fetch -q --unshallow remote_repo
162+ git fetch -q remote_repo
116163 git push -f remote_repo "${current_branch}"
117164 gh pr create --title "${title}" --head "${current_branch}" --body "${title}" --base "${base_branch}"
118165else