#!/bin/bash # this is comically complicated - why does GitHub not have a monotonic number # that tracks how many times any action was kicked off? Or an atomic way to update a variable? # So we use the fact that git itself does a great job of preventing us from overwriting an # existing branch and abuse that to create atomicity SHA_BRANCH="branch-for-$1" # first - make sure git is configured so we can do stuff git config --global user.email "ci@subsurface-divelog.org" git config --global user.name "Subsurface CI" # next, clone the release repo [ -d nightly-builds ] || git clone https://github.com/subsurface/nightly-builds cd nightly-builds # this is from the main branch, so this should be the PREVIOUS build number latest=$(<latest-subsurface-buildnumber) # now let's see if a branch for the current SHA exists if git checkout "$SHA_BRANCH" then # one of the other workflows created a release number already latest=$(<latest-subsurface-buildnumber) else # this is almost certainly a race between the different workflow files # the main branch should have held the previous release number # increment by one and write as new build number into the named branch latest=$((latest+1)) git checkout -b "$SHA_BRANCH" echo $latest > latest-subsurface-buildnumber git commit -a -m "record build number for this SHA" # now comes the moment of truth - are we the first one? # the push will succeed for exactly one of the workflows if git push origin "$SHA_BRANCH" then # yay - we win! now let's make sure that we remember this number for next time git checkout main echo $latest > latest-subsurface-buildnumber git commit -a -m "record latest build number in main branch" if ! git push origin main then echo "push to main failed - we'll lose monotonic property" exit 1 fi else # someone else was faster - get the number they wrote git checkout main &> /dev/null git branch -D "$SHA_BRANCH" &> /dev/null if ! git checkout "$SHA_BRANCH" &> /dev/null then echo "push to $SHA_BRANCH failed, but switching to it failed as well" exit 2 fi latest=$(<latest-subsurface-buildnumber) fi fi # if we get here, we have the next build number - wow that was weird. echo "Build number is $latest"