Following an idle wonder last week on Using Git Commit Messages as a Command Line?, I had a play and came up with a demo of sorts: ouseful-testing/action-steps.
The idea is that by creating a Github Action that performs actions based, in part at least, on the contents of a Github commit message, we can start to use commit messages as as a CLI to invoke particular Github Action mediated activities.
My first couple of proofs of concept were:
- a simple script that replaces one file (the README) with the contents of another. At the moment, both files need to be in the same branch (ideally, the replacement files would be pulled in from another branch but I couldn’t figure out how to do that offhand). If you just make a “dummy” commit to any old file with the commit message Update Readme the README will be updated with the contents of one file. If you use the commit message Reset Readme it will be replaced with the contents of another. My thinking in part, here, is that you could “commit” progress messages as you work through a thing and the README keeps getting updated with the next thing you have to do as you commit to say you’ve done the previous thing.
name: Updates on: push jobs: update_readme: if: (github.event.commits[0].message == 'Update Readme') runs-on: ubuntu-latest steps: - name: Copy Repository Contents uses: actions/checkout@v2 - name: commit changes run: | git config --global user.email "${GH_EMAIL}" git config --global user.name "${GH_USERNAME}" # git checkout -B fastpages-automated-setup mv README2.md README.md git add README.md git commit -m'Update README' git push env: GH_EMAIL: ${{ github.event.commits[0].author.email }} GH_USERNAME: ${{ github.event.commits[0].author.username }} reset_readme: if: (github.event.commits[0].message == 'Reset Readme') runs-on: ubuntu-latest steps: - name: Copy Repository Contents uses: actions/checkout@v2 - name: commit changes run: | git config --global user.email "${GH_EMAIL}" git config --global user.name "${GH_USERNAME}" # git checkout -B fastpages-automated-setup mv README1.md README.md git add README.md git commit -m'Reset README' git push env: GH_EMAIL: ${{ github.event.commits[0].author.email }} GH_USERNAME: ${{ github.event.commits[0].author.username }}
- a simple script that lets you upload one or more zip files as part of a push; if the commit message starts with Unzip, in response to the commit, unzip the committed zip files, and then delete the
.zip
archive files you had just committed, pushing the unzipped files in their place.
name: Unzip on: push: paths: - '**.zip' jobs: unzip-files: if: startsWith(github.event.commits[0].message, 'Unzip') runs-on: ubuntu-latest steps: - name: Copy Repository Contents uses: actions/checkout@v2 with: fetch-depth: 2 - name: handle zip run: | git config --global user.email "${GH_EMAIL}" git config --global user.name "${GH_USERNAME}" for f in $(git diff HEAD^..HEAD --no-commit-id --name-only | grep -E '.zip$') do echo $f fn=`unzip $f | grep -m1 'creating:' | cut -d' ' -f5-` echo $fn git rm $f git add $fn git commit -m"unzip $f" done git push env: GH_EMAIL: ${{ github.event.commits[0].author.email }} GH_USERNAME: ${{ github.event.commits[0].author.username }}
I did also wonder about whether it would be possible to implement something like Adventure, played by issuing instructions through Git commit messages and maybe updating the readme with the game response to each step… Stepping through the hstory of READMEs would be your game transcript…