findversion.sh
changeset 10085 de2d010b7db9
child 10088 a87f25ff2b42
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/findversion.sh	Sun Sep 07 13:24:49 2008 +0000
@@ -0,0 +1,106 @@
+#!/bin/sh
+
+# Arguments given? Show help text.
+if [ "$#" != "0" ]; then
+	cat <<EOF
+Usage: ./findversion.sh
+Finds the current revision and if the code is modified.
+
+Output: <REV>\t<REV_NR>\t<MODIFIED>
+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"