git-gui: Ensure version number is always current.
authorShawn O. Pearce <spearce@spearce.org>
Sun, 21 Jan 2007 01:31:09 +0000 (20:31 -0500)
committerShawn O. Pearce <spearce@spearce.org>
Sun, 21 Jan 2007 07:54:19 +0000 (02:54 -0500)
I'm stealing the exact logic used by core Git within its own Makefile to
setup the version number within scripts and executables.  This way we
can be sure that the version number is always updated after a commit,
and that the version number also reflects when it is coming from a dirty
working directory (and is thus pretty worthless).

I've cleaned up some of the version display code in the about dialog too.
There were simply too many blank lines in the bottom section where we
showed the version data.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
.gitignore
GIT-VERSION-GEN [new file with mode: 0755]
Makefile
git-gui.sh

index 5bda901..c714d38 100644 (file)
@@ -1,2 +1,3 @@
+GIT-VERSION-FILE
 git-citool
 git-gui
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
new file mode 100755 (executable)
index 0000000..79f1c52
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh
+
+GVF=GIT-VERSION-FILE
+DEF_VER=v0.5.GIT
+
+LF='
+'
+
+# First try git-describe, then see if there is a version file
+# (included in release tarballs), then default
+if VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
+   case "$VN" in
+   *$LF*) (exit 1) ;;
+   v[0-9]*) : happy ;;
+   esac
+then
+       VN=$(echo "$VN" | sed -e 's/-/./g');
+elif test -f version
+then
+       VN=$(cat version) || VN="$DEF_VER"
+else
+       VN="$DEF_VER"
+fi
+
+VN=$(expr "$VN" : v*'\(.*\)')
+
+dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null) || dirty=
+case "$dirty" in
+'')
+       ;;
+*)
+       VN="$VN-dirty" ;;
+esac
+
+if test -r $GVF
+then
+       VC=$(sed -e 's/^GIT_VERSION = //' <$GVF)
+else
+       VC=unset
+fi
+test "$VN" = "$VC" || {
+       echo >&2 "GIT_VERSION = $VN"
+       echo "GIT_VERSION = $VN" >$GVF
+}
+
+
index 606bec6..8fade69 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,12 @@
 all::
 
+GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
+       @$(SHELL_PATH) ./GIT-VERSION-GEN
+-include GIT-VERSION-FILE
+
 SCRIPT_SH = git-gui.sh
 GITGUI_BUILT_INS = git-citool
 ALL_PROGRAMS = $(GITGUI_BUILT_INS) $(patsubst %.sh,%,$(SCRIPT_SH))
-GITGUI_VERSION := $(shell git describe)
 
 ifndef SHELL_PATH
        SHELL_PATH = /bin/sh
@@ -20,7 +23,7 @@ SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
 $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
        rm -f $@ $@+
        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
-               -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
+               -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
                $@.sh >$@+
        chmod +x $@+
        mv $@+ $@
@@ -28,6 +31,9 @@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 $(GITGUI_BUILT_INS): git-gui
        rm -f $@ && ln git-gui $@
 
+# These can record GIT_VERSION
+$(patsubst %.sh,%,$(SCRIPT_SH)): GIT-VERSION-FILE
+
 all:: $(ALL_PROGRAMS)
 
 install: all
@@ -36,4 +42,7 @@ install: all
        $(foreach p,$(GITGUI_BUILT_INS), rm -f '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' && ln '$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' ;)
 
 clean::
-       rm -f $(ALL_PROGRAMS)
+       rm -f $(ALL_PROGRAMS) GIT-VERSION-FILE
+
+.PHONY: all install clean
+.PHONY: .FORCE-GIT-VERSION-FILE
index cb2b459..e136e32 100755 (executable)
@@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA}
 
-set appvers {@@GITGUI_VERSION@@}
+set appvers {@@GIT_VERSION@@}
 set appname [lindex [file split $argv0] end]
 set gitdir {}
 
@@ -2543,8 +2543,9 @@ $copyright" \
        pack $w.desc -side top -fill x -padx 5 -pady 5
 
        set v {}
-       append v "$appname version $appvers\n\n"
-       append v "[exec git --version]\n\n"
+       append v "$appname version $appvers\n"
+       append v "[exec git version]\n"
+       append v "\n"
        if {$tcl_patchLevel eq $tk_patchLevel} {
                append v "Tcl/Tk version $tcl_patchLevel"
        } else {