|
1 | 1 | #!/bin/bash |
2 | | -set -ex |
| 2 | +set -e |
3 | 3 | # This script should be run at the root of the repository. |
4 | | -# This script is used to update googleapis_commitish, gapic_generator_version, |
5 | | -# and libraries_bom_version in generation configuration at the time of running |
6 | | -# and create a pull request. |
| 4 | +# This script is used to update googleapis commit to latest in generation |
| 5 | +# configuration at the time of running and create a pull request. |
7 | 6 |
|
8 | 7 | # The following commands need to be installed before running the script: |
9 | 8 | # 1. git |
10 | 9 | # 2. gh |
11 | | -# 3. jq |
12 | | - |
13 | | -# Utility functions |
14 | | -# Get the latest released version of a Maven artifact. |
15 | | -function get_latest_released_version() { |
16 | | - local group_id=$1 |
17 | | - local artifact_id=$2 |
18 | | - latest=$(curl -s "https://search.maven.org/solrsearch/select?q=g:${group_id}+AND+a:${artifact_id}&core=gav&rows=500&wt=json" | jq -r '.response.docs[] | select(.v | test("^[0-9]+(\\.[0-9]+)*$")) | .v' | sort -V | tail -n 1) |
19 | | - echo "${latest}" |
20 | | -} |
21 | | - |
22 | | -# Update a key to a new value in the generation config. |
23 | | -function update_config() { |
24 | | - local key_word=$1 |
25 | | - local new_value=$2 |
26 | | - local file=$3 |
27 | | - echo "Update ${key_word} to ${new_value} in ${file}" |
28 | | - sed -i -e "s/^${key_word}.*$/${key_word}: ${new_value}/" "${file}" |
29 | | -} |
30 | 10 |
|
31 | 11 | # The parameters of this script is: |
32 | 12 | # 1. base_branch, the base branch of the result pull request. |
@@ -72,50 +52,62 @@ if [ -z "${generation_config}" ]; then |
72 | 52 | fi |
73 | 53 |
|
74 | 54 | current_branch="generate-libraries-${base_branch}" |
75 | | -title="chore: Update generation configuration at $(date)" |
| 55 | +title="chore: update googleapis commit at $(date)" |
76 | 56 |
|
77 | | -# try to find a open pull request associated with the branch |
| 57 | +git checkout "${base_branch}" |
| 58 | +# Try to find a open pull request associated with the branch |
78 | 59 | pr_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 |
| 60 | +# Create a branch if there's no open pull request associated with the |
80 | 61 | # branch; otherwise checkout the pull request. |
81 | 62 | if [ -z "${pr_num}" ]; then |
82 | 63 | git checkout -b "${current_branch}" |
| 64 | + # Push the current branch to remote so that we can |
| 65 | + # compare the commits later. |
| 66 | + git push -u origin "${current_branch}" |
83 | 67 | else |
84 | 68 | gh pr checkout "${pr_num}" |
85 | 69 | fi |
86 | 70 |
|
| 71 | +# Only allow fast-forward merging; exit with non-zero result if there's merging |
| 72 | +# conflict. |
| 73 | +git merge -m "chore: merge ${base_branch} into ${current_branch}" "${base_branch}" |
| 74 | + |
87 | 75 | mkdir tmp-googleapis |
88 | | -# use partial clone because only commit history is needed. |
| 76 | +# Use partial clone because only commit history is needed. |
89 | 77 | git clone --filter=blob:none https://github.com/googleapis/googleapis.git tmp-googleapis |
90 | 78 | pushd tmp-googleapis |
91 | 79 | git pull |
92 | 80 | latest_commit=$(git rev-parse HEAD) |
93 | 81 | popd |
94 | 82 | rm -rf tmp-googleapis |
95 | | -update_config "googleapis_commitish" "${latest_commit}" "${generation_config}" |
96 | | - |
97 | | -# update gapic-generator-java version to the latest |
98 | | -latest_version=$(get_latest_released_version "com.google.api" "gapic-generator-java") |
99 | | -update_config "gapic_generator_version" "${latest_version}" "${generation_config}" |
100 | | - |
101 | | -# update libraries-bom version to the latest |
102 | | -latest_version=$(get_latest_released_version "com.google.cloud" "libraries-bom") |
103 | | -update_config "libraries_bom_version" "${latest_version}" "${generation_config}" |
| 83 | +sed -i -e "s/^googleapis_commitish.*$/googleapis_commitish: ${latest_commit}/" "${generation_config}" |
104 | 84 |
|
105 | 85 | git add "${generation_config}" |
106 | 86 | changed_files=$(git diff --cached --name-only) |
107 | 87 | if [[ "${changed_files}" == "" ]]; then |
108 | | - echo "The latest generation config is not changed." |
| 88 | + echo "The latest googleapis commit is not changed." |
109 | 89 | echo "Skip committing to the pull request." |
| 90 | +else |
| 91 | + git commit -m "${title}" |
| 92 | +fi |
| 93 | + |
| 94 | +# There are potentially at most two commits: merge commit and change commit. |
| 95 | +# We want to exit the script if no commit happens (otherwise this will be an |
| 96 | +# infinite loop). |
| 97 | +# `git cherry` is a way to find whether the local branch has commits that are |
| 98 | +# not in the remote branch. |
| 99 | +# If we find any such commit, push them to remote branch. |
| 100 | +unpushed_commit=$(git cherry -v "origin/${current_branch}" | wc -l) |
| 101 | +if [[ "${unpushed_commit}" -eq 0 ]]; then |
| 102 | + echo "No unpushed commits, exit" |
110 | 103 | exit 0 |
111 | 104 | fi |
112 | | -git commit -m "${title}" |
| 105 | + |
113 | 106 | if [ -z "${pr_num}" ]; then |
114 | 107 | git remote add remote_repo https://cloud-java-bot:"${GH_TOKEN}@github.com/${repo}.git" |
115 | | - git fetch -q --unshallow remote_repo |
| 108 | + git fetch -q remote_repo |
116 | 109 | git push -f remote_repo "${current_branch}" |
117 | 110 | gh pr create --title "${title}" --head "${current_branch}" --body "${title}" --base "${base_branch}" |
118 | 111 | else |
119 | 112 | git push |
120 | | - gh pr edit "${pr_num}" --title "${title}" --body "${title}" |
121 | 113 | fi |
0 commit comments