@@ -28,11 +28,23 @@ function update_config() {
2828    sed -i -e " s/^${key_word} .*$/${key_word} : ${new_value} /"   " ${file} " 
2929}
3030
31+ #  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 " 
4961    shift 
5062    ;;
63+   --workflow)
64+     workflow=" $2 " 
65+     shift 
66+     ;;
5167  * )
5268    echo  " Invalid option: [$1 ]" 
5369    exit  1
@@ -71,21 +87,34 @@ if [ -z "${generation_config}" ]; then
7187  echo  " Use default generation config: ${generation_config} " 
7288fi 
7389
90+ 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) " 
7697
77- #  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 
86111
112+ #  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} " 
96125
97- #  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} " 
100129
101- #  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} " 
104138
105- git add " ${generation_config} " 
139+ git add " ${generation_config} "   " ${workflow} " 
106140changed_files=$( git diff --cached --name-only) 
107141if  [[ " ${changed_files} "   ==  " "   ]];  then 
108142    echo  " The latest generation config is not changed." 
109143    echo  " 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" 
110157    exit  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 
0 commit comments