Re: [PATCH] Include extra information in mutt version string for developer builds
* David Champion on Thursday, September 16, 2010 at 22:31:18 -0500
> * On 16 Sep 2010, Christian Ebert wrote:
>>
>> This doesn't apply on case-insensitive filesystems - I'm using
>> the default HFS+ on MacOS X, which is indeed case-insensitive.
>>
>> So, no precise version header in this mail yet ;-)
>
> Good point... wretched filesystem. I use a Mac too (but Solaris for
> mutt) so I should have caught this.
>
> I also addressed Cameron's observations on "exec cat" and improved
> performance around the double awk I was using. Although I think
> performance optimizations for a one-time compilation tool are sort of
> not worth a lot of time, why depend on awk when the shell can handle it
> just fine?
Almost there. version.sh needs to have the executable bit set
here. hg can provide this information if you pass the --git
option to the respective command (hg export --git etc.).
So, this works for me (see "new file mode"):
# HG changeset patch
# User David Champion <dgc@xxxxxxxxxxxx>
# Date 1284693682 18000
# Branch HEAD
# Node ID b407b92cbd1d6f7ae95986e5a19fbbe74671e65c
# Parent 0ca7ed91fe7f7ea14a8adb9d44c0e188d2a6655b
Include extra information in mutt version string for developer builds.
When a build is based on an hg clone, include extra information about
the changeset node, distance from a tagged release, and mq applied patch
count.
For example, after this patch is applied my mutt build identifies itself
(in mutt -v and in <show-version>) as:
Mutt 1.5.21+26,mq+22 (7edc2073390d) (2010-09-15)
I have applied 26 changesets applied since 1.5.21 was tagged, 22 of
which are in my mq patch series. A 1.5.21 release build that is not
mercurial-based would still appear simply as "1.5.21".
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -7,7 +7,7 @@
AC_INIT([mutt.h])
AM_CONFIG_HEADER([config.h])
-mutt_cv_version=`cat $srcdir/VERSION`
+mutt_cv_version=`./version.sh`
AM_INIT_AUTOMAKE(mutt, $mutt_cv_version)
AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/VERSION'])
diff --git a/version.sh b/version.sh
new file mode 100755
--- /dev/null
+++ b/version.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Ensure that we have a repo here and that mercurial is installed. If
+# not, just cat the VERSION file; it contains the latest release number.
+{ [ -d .hg ] && hg >/dev/null 2>&1; } || exec cat VERSION
+
+# This is a mercurial repo and we have the hg command.
+
+# Get essential properties of the current working copy
+set -- $(hg parents --template='{rev} {node|short}\n')
+rev="$1"
+node="$2"
+
+# translate release tags into ##.##.## notation
+cleantag () {
+ case "$1" in
+ mutt-*-rel) echo "$1" | sed -e 's/mutt-//' -e 's/-rel//' | tr -
. ;;
+ *) echo "$1" ;;
+ esac
+}
+
+getdistance_old () {
+ # fudge it
+ set -- $(hg tags | sort -n +1 | egrep 'mutt-.*rel' | tail -1 | cut -d:
-f1)
+ latesttag="$1"
+ latestrev="$2"
+ distance=$(($rev - $latestrev))
+ echo $latesttag $distance
+}
+
+getdistance_new () {
+ hg parents --template='{latesttag} {latesttagdistance}\n'
+}
+
+
+# latesttag appeared in hg 1.4. Test for it.
+[ "$(hg log -r . --template='{latesttag}')" = '' ] &&
+set -- $(getdistance_old) ||
+set -- $(getdistance_new)
+
+tag=$(cleantag "$1")
+dist=$2
+
+if [ $dist -eq 0 ]; then
+ dist=
+else
+ dist="+$dist"
+fi
+
+# if we have mq patches applied, mention it
+qparent=$(hg log -r qparent --template='{rev}\n' 2>/dev/null || echo $rev)
+qdelta=$(expr $rev - $qparent)
+if [ $qdelta -eq 0 ]; then
+ qdist=""
+else
+ qdist=",mq+$qdelta"
+fi
+
+echo "$tag$dist$qdist ($node)"
+exit 0