This is useful when people, for whatever reason, incorrectly report their version: "please test the release candidate for version 1.0 // I found bug B // That's strange because I thought bug B only got introduced yesterday in the dev code // oh yes, well I checked out the dev code and tested that, not actually version 1.0"; or "I have a new bug C // Are you building from a pristine source checkout? // Yes // Why does your log file contain a warning message that the source was modified? // oh, well I hacked at component Q // yes, that's why you're seeing bug C."
Different version control systems have different version representations. SVN has a sequential revision number; git has directory tree hashes; darcs doesn't seem to have any explicit version representation.
So here is code I've used at different times for svn, git and darcs:
For darcs, here's code I found in darcs issue tracker 1142:
echo "$(darcs show tags | head -1) (+ $(darcs changes --count --from-tag .) patches)"which gives the most recent tag in the repository and how many additional patches have been added:
v1.1 (+ 39 patches)
For svn, we used something like this in Swift
R=$(svn info | grep '^Revision' | sed "s/Revision: /$1-r/") M=$(svn status | grep --invert-match '^\?' > /dev/null && echo "($1 modified locally)") echo $R $Mwhich we use to form version strings like this:
swift-r1833 (swift modified locally)
Using git-svn, so that I was interested in the SVN version information rather than git version information, swap out R and M above for these:
R=$(git svn info | grep '^Revision' | sed "s/Revision: /$1-r/") if git status -a >/dev/null ; then M="($1 modified locally)" fi
Both of the above two return the version of the last change in a particular checkout. When there are many modules, its sometimes desirable to give version information for those modules independently. The
svnversioncommand that gives that:
svnversion -c somecomponentthat will produce different output forms that vary depending on the state of the checkout but at simplest gives something like:
To get similar per-directory handling for git, you can do something like this anywhere except in the root of a repository:
SUBDIRPREFIX=$(git rev-parse --show-prefix | sed 's%/$%%') cd ./$(git rev-parse --show-cdup) git ls-tree HEAD $SUBDIRPREFIX | (read a b c d ; echo $c)which will emit a tree hash.
So there are a bunch of different techniques for different version control systems. It would be nice if they were all a bit more consistent - really cool would be a single command that knew all version control systems and could output in a consistent format.