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 github-actions@github.com 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="$(> $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>$VERSION?" 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"