diff --git a/findversion.sh b/findversion.sh new file mode 100755 --- /dev/null +++ b/findversion.sh @@ -0,0 +1,106 @@ +#!/bin/sh + +# Arguments given? Show help text. +if [ "$#" != "0" ]; then + cat <\t\t +REV + a string describing what version of the code the current checkout is + based on. The exact format of this string depends on the version + control system in use, but it tries to identify the revision used as + close as possible (using the svn revision number or hg/git hash). + This also includes an indication of whether the checkout was + modified and which branch was checked out. This value is not + guaranteed to be sortable, but is mainly meant for identifying the + revision and user display. + + If no revision identifier could be found, this is left empty. +REV_NR + the revision number of the svn revision this checkout is based on. + This can be used to determine which functionality is present in this + checkout. For trunk svn checkouts and hg/git branches based upon it, + this number should be accurate. For svn branch checkouts, this + number is mostly meaningless, at least when comparing with the + REV_NR from other branches or trunk. + + This number should be sortable. Within a given branch or trunk, a + higher number means a newer version. However, when using git or hg, + this number will not increase on new commits. + + If no revision number could be found, this is left empty. +MODIFIED + Whether (the src directory of) this checkout is modified or not. A + value of 0 means not modified, a value of 2 means it was modified. + Modification is determined in relation to the commit identified by + REV, so not in relation to the svn revision identified by REV_NR. + + A value of 1 means that the modified status is unknown, because this + is not an svn/git/hg checkout for example. + +By setting the AWK environment variable, a caller can determine which +version of "awk" is used. If nothing is set, this script defaults to +"awk". +EOF +exit 1; +fi + +# Allow awk to be provided by the caller. +if [ -z "$AWK" ]; then + AWK=awk +fi + +# Find out some dirs +cd `dirname "$0"` +ROOT_DIR=`pwd` +SRC_DIR=src + +# Determine if we are using a modified version +# Assume the dir is not modified +MODIFIED="0" +if [ -d "$ROOT_DIR/.svn" ]; then + # We are an svn checkout + if svnversion "$SRC_DIR" | grep 'M' > /dev/null; then + MODIFIED="2" + fi + # Find the revision like: rXXXXM-branch + BRANCH=`LC_ALL=C svn info "$SRC_DIR" | "$AWK" '/^URL:.*branches/ { split($2, a, "/"); for(i in a) if (a[i]=="branches") { print a[i+1]; break } }'` + REV_NR=`LC_ALL=C svn info "$SRC_DIR" | "$AWK" '/^Last Changed Rev:/ { print $4 }'` + REV="r$REV_NR" +elif [ -d "$ROOT_DIR/.git" ]; then + # We are a git checkout + if git diff-index HEAD "$SRC_DIR" | read dummy; then + MODIFIED="2" + fi + HASH=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null | cut -c1-8` + REV="g$HASH" + BRANCH=`git branch|grep '[*]' | sed 's/\* //;s/^master$//'` + REV_NR=`LC_ALL=C git log --pretty=format:%s "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s/.*(svn r\([0-9]*\)).*/\1/"` +elif [ -d "$ROOT_DIR/.hg" ]; then + # We are a hg checkout + if hg status "$SRC_DIR" | grep -v '^?' | read dummy; then + MODIFIED="2" + fi + HASH=`LC_ALL=C hg tip 2>/dev/null | head -n 1 | cut -d: -f3 | cut -c1-8` + REV="h$HASH" + BRANCH=`hg branch | sed 's/^default$//'` + REV_NR=`LC_ALL=C hg log -k "svn" -l 1 --template "{desc}\n" "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s/.*(svn r\([0-9]*\)).*/\1/"` +else + # We don't know + MODIFIED="1" + BRANCH="" + REV="" + REV_NR="" +fi + +if [ "$MODIFIED" -eq "2" ]; then + REV="${REV}M" +fi + +if [ -n "$BRANCH" ]; then + REV="${REV}-$BRANCH" +fi + +echo -e "$REV\t$REV_NR\t$MODIFIED"