Complete redesign of Subsurface version numbers

- for now all versions start with v6.0
- CICD builds use the monolithic build number as patch level, e.g. v6.0.12345
- local builds use the following algorithm
  - find the newest commit with a CICD build number that is included in the
    working tree
  - count the number of commits in the working tree since that commit
  - if there are no commits since the last CICD build, the local build version
    will be v6.0.12345-local
  - if there are N commits since the last CICD build, it will be
    v6.0.12345-N-local
- test builds in the CICD that don't create artifacts simply use a dummy release
  in order to not incorrectly increment the build number and also not to waste
  time and resources by manually checking out the nightly-build repo for each of
  these builds.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2024-01-04 20:44:31 -08:00
parent 8a2dd8db74
commit 62477d8c65
24 changed files with 295 additions and 126 deletions

View file

@ -1,76 +1,80 @@
#!/bin/sh
#!/bin/bash
# shellcheck disable=SC2164
# $1 - os name {linux|darwin|win}
# $2 - [optional] raw version string "vX.Y-patchN-sha1". as from `git describe'
# (see below)
set -eu
#set -x
# consistently name all builds, regardless of OS or desktop/mobile
#
# we do need to be able to create three digit (M.m.p) and four digit (M.m.p.c) version strings
# default is VERSION_EXTENSION version - an argument of '4' or '3' gets you a digits only version string
#
# we hardcode a base version - this will rarely change
# (we actually haven't discussed a situation where it would change...)
SUBSURFACE_BASE_VERSION=6.0
# little silly helper functions
croak() {
echo "$0: $*" >&2
exit 1
}
croak_usage() {
croak "Usage: $0 [3|4]"
}
[ $# -ge 1 ] || croak "missing OS argument"
os=$1
if [ $# -eq 2 ] && [ "$2" ]; then
v0=$2
else
cmd="git describe --match "v[0-9]*" --abbrev=12"
v0=$($cmd) || v0=$(cat .gitversion) || croak "odd; command '$cmd' failed"
if [[ $# -gt 1 ]] ; then croak_usage ; fi
if [[ $# -eq 1 ]] ; then
if [[ $1 != "4" && $1 != "3" ]] ; then croak_usage ; fi
DIGITS="$1"
fi
# strip off the 'v' prefix, if any
v0=${v0#v}
# figure out where we are in the file system
cd "$(dirname "$0")/../"
export SUBSURFACE_SOURCE=$PWD
case $os in
linux)
v=$v0
;;
darwin)
# just the dots in the version string - this way we can
# count them
IFS=.
set -- $v0 # split $v0 using $IFS separator
dots=$(($# - 1)) # use positional argument count
# split version string using a '-' separator
IFS=-
set -- $v0
v=$1
# do we need to add another digit?
# We know there are 1 or 2 dots in $v, so if it's just one
# or we are trying to get to 4, add one digit
if [ $dots -eq 1 ]; then
if [ $# -gt 1 ]; then
v=$v.$2
else
v=$v.0
fi
fi
;;
full|win)
# just the dots in the version string - this way we can
# count them
IFS=.
set -- $v0 # split $v0 using $IFS separator
dots=$(($# - 1)) # use positional argument count
# split version string using a '-' separator
IFS=-
set -- $v0
v=$1
if [ $dots -eq 1 ]; then
v=$v.0
fi
if [ $# -gt 1 ]; then
v=$v.$2
else
v=$v.0
fi
;;
*)
v=git.missing.please.hardcode.version
;;
esac
printf '%s' $v
# add the build number to this as 'patch' component
# if we run in an environment where we are given a build number (e.g. CICD builds)
# we just grab that - otherwise we have to figure it out on the fly
if [ ! -f latest-subsurface-buildnumber ] ; then
# figure out the most recent build number, given our own git history
# this assumes that (a) we are in a checked out git tree and
# (b) we have the ability to check out another git repo
# in situations where either of these isn't true, it's the caller's
# responsibility to ensure that the latest-subsurface-buildnumber file exists
if [ ! -d "$SUBSURFACE_SOURCE/nightly-builds" ] ; then
git clone https://github.com/subsurface/nightly-builds &> /dev/null || croak "failed to clone nightly-builds repo"
fi
cd nightly-builds
git fetch &> /dev/null
LAST_BUILD_BRANCHS=$(git branch -a --sort=-committerdate --list | grep remotes/origin/branch-for | head -50 | cut -d/ -f3)
for LAST_BUILD_BRANCH in $LAST_BUILD_BRANCHS "not-found" ; do
LAST_BUILD_SHA=$(cut -d- -f 3 <<< "$LAST_BUILD_BRANCH")
git -C "$SUBSURFACE_SOURCE" merge-base --is-ancestor "$LAST_BUILD_SHA" HEAD && break
done
[ "not-found" = "$LAST_BUILD_BRANCH" ] && croak "can't find a build number for the current working tree"
git checkout "$LAST_BUILD_BRANCH" &> /dev/null || croak "failed to check out $LAST_BUILD_BRANCH in nightly-builds"
BUILDNR=$(<./latest-subsurface-buildnumber)
cd "$SUBSURFACE_SOURCE"
VERSION_EXTENSION="-"
VERSION_EXTENSION+=$(git log --pretty="oneline" "${LAST_BUILD_SHA}...HEAD" | wc -l | tr -d '[:space:]')
VERSION_EXTENSION+="-"
[ "$VERSION_EXTENSION" = "-0-" ] && VERSION_EXTENSION="-"
VERSION_EXTENSION+="local"
else
# use the files included with the sources
BUILDNR=$(<"$SUBSURFACE_SOURCE/latest-subsurface-buildnumber")
VERSION_EXTENSION=""
if [ -f "$SUBSURFACE_SOURCE/latest-subsurface-buildnumber-extension" ] ; then
VERSION_EXTENSION="-"
VERSION_EXTENSION+=$(<"$SUBSURFACE_SOURCE/latest-subsurface-buildnumber-extension")
fi
fi
COMMITS_SINCE=$(tr -cd "[:digit:]" <<<"$VERSION_EXTENSION")
[[ -z $COMMITS_SINCE ]] && COMMITS_SINCE="0"
if [[ $DIGITS == "3" ]] ; then
VERSION="${SUBSURFACE_BASE_VERSION}.${BUILDNR}"
elif [[ $DIGITS == "4" ]] ; then
VERSION="${SUBSURFACE_BASE_VERSION}.${BUILDNR}.${COMMITS_SINCE}"
else
VERSION="${SUBSURFACE_BASE_VERSION}.${BUILDNR}${VERSION_EXTENSION}"
fi
printf '%s' "$VERSION"