Update version on pr approval #530
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Update version on pr approval | |
on: | |
pull_request_review: | |
types: [submitted] | |
issue_comment: | |
types: [created] | |
pull_request: | |
paths: '.github/workflows/updateversion.yml' | |
jobs: | |
update_version: | |
if: > | |
( github.event_name == 'pull_request_review' && | |
github.event.review.state == 'approved' && | |
( github.event.review.author_association == 'OWNER' || | |
github.event.review.author_association == 'MEMBER' | |
) && | |
! contains( github.event.review.body, '@github-actions noop' ) | |
) || | |
( github.event_name == 'issue_comment' && | |
github.event.issue.pull_request && | |
( github.event.comment.author_association == 'OWNER' || | |
github.event.comment.author_association == 'MEMBER' | |
) && | |
endsWith( github.event.comment.body, '@github-actions update version' ) | |
) || | |
( github.event_name == 'pull_request' ) | |
runs-on: ubuntu-latest | |
steps: | |
- name: Get proper pr info | |
id: configure | |
env: | |
EVENT: ${{github.event_name}} | |
NUMBER: ${{github.event.issue.number}} | |
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} | |
REF: ${{github.event.pull_request.head.ref}} | |
REPO_PAGE: ${{github.event.pull_request.head.repo.svn_url}} | |
REPO_NAME: ${{github.event.pull_request.head.repo.full_name}} | |
UPSTREAM: ${{github.event.pull_request.base.repo.clone_url}} | |
LINK: ${{github.event.pull_request.html}} | |
run: | | |
if [[ $EVENT == "issue_comment" ]]; then | |
tmp="$(mktemp)" | |
api="$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/pulls/$NUMBER" | |
echo "fetching $api" | |
gh api "$api" >"$tmp" | |
REF="$(jq -r ".head.ref" "$tmp")" | |
REPO_PAGE="$(jq -r ".head.repo.svn_url" "$tmp")" | |
REPO_NAME="$(jq -r ".head.repo.full_name" "$tmp")" | |
UPSTREAM="$(jq -r ".base.repo.clone_url" "$tmp")" | |
LINK="${{github.event.issue.html_url}}" | |
fi | |
echo "link=$LINK" >> $GITHUB_OUTPUT | |
echo "ref=$REF" >> $GITHUB_OUTPUT | |
echo "page=$REPO_PAGE" >> $GITHUB_OUTPUT | |
echo "name=$REPO_NAME" >> $GITHUB_OUTPUT | |
echo "upstream=$UPSTREAM" >> $GITHUB_OUTPUT | |
- name: Checkout pull request | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
repository: ${{steps.configure.outputs.name}} | |
ref: ${{steps.configure.outputs.ref}} | |
- name: Check for changes | |
id: check | |
shell: bash | |
env: | |
UPSTREAM: ${{steps.configure.outputs.upstream}} | |
LINK: ${{steps.configure.outputs.link}} | |
run: | | |
git config user.name github-actions | |
git config user.email [email protected] | |
git fetch "$UPSTREAM" | |
if ! git merge FETCH_HEAD; then | |
echo "::error::failed to merge pull request" | |
echo "::notice::you can resolve merge conflicts at $LINK/conflicts" | |
exit 2 | |
elif git diff --quiet FETCH_HEAD tokens.xml; then | |
echo "update=false" >> $GITHUB_OUTPUT | |
else | |
echo "update=true" >> $GITHUB_OUTPUT | |
fi | |
- name: Get date | |
if: steps.check.outputs.update == 'true' | |
id: date | |
shell: bash | |
run: | | |
git checkout FETCH_HEAD version.txt | |
previous="$(<version.txt)" | |
date="$(date --utc +%Y%m%d)" | |
echo "it is currently $date" | |
echo "date=$date" >> $GITHUB_OUTPUT | |
echo "previous=$previous" >> $GITHUB_OUTPUT | |
- name: Check for suffix used when multiple changes happen in a day | |
if: steps.check.outputs.update == 'true' | |
id: version | |
shell: python | |
run: | | |
import os | |
import re | |
previous = "${{steps.date.outputs.previous}}" | |
date = "${{steps.date.outputs.date}}" | |
version = date | |
if previous.startswith(date): | |
match = re.search(r"[a-z]+", previous) | |
if match is None: | |
suffix = "a" # the first a is actually hidden | |
else: | |
suffix = match[0] | |
charlist = [] | |
rev = reversed(suffix) | |
for char in rev: | |
if char == "z": | |
charlist.append("a") | |
else: | |
nextchar = chr(ord(char) + 1) | |
charlist.append(nextchar) | |
charlist.extend(rev) | |
break | |
else: | |
charlist.append("a") | |
version += "".join(reversed(charlist)) | |
with open(os.environ["GITHUB_OUTPUT"], "a") as envFile: | |
print(f"version={version}", file=envFile) | |
- name: Update date in files | |
if: steps.check.outputs.update == 'true' | |
shell: bash | |
env: | |
VERSION: ${{steps.version.outputs.version}} | |
PREVIOUS: ${{steps.date.outputs.previous}} | |
run: | | |
echo "updating version from $PREVIOUS to $VERSION" | |
tag="sourceVersion" | |
sed -i "s?<$tag>.*</$tag>?<$tag>$VERSION</$tag>?" tokens.xml | |
echo "$VERSION" >version.txt | |
- name: Push changes | |
if: github.event_name != 'pull_request' | |
shell: bash | |
env: | |
REPO_PAGE: ${{steps.configure.outputs.page}} | |
VERSION: ${{steps.version.outputs.version}} | |
run: | | |
if git diff --quiet tokens.xml; then | |
echo "there are no changes to tokens.xml" | |
echo "::notice::no commit created" | |
exit 0 | |
fi | |
git add tokens.xml version.txt | |
git commit -m "update version to $VERSION" | |
git push | |
commit="$(git rev-parse HEAD)" | |
echo "::notice::pushed commit: $REPO_PAGE/commit/$commit" |