1#!/bin/sh 2 3GVF=GIT-VERSION-FILE 4DEF_VER=0.7.GITGUI 5 6LF=' 7' 8 9tree_search () 10{ 11head=$1 12 tree=$2 13for p in$(git rev-list --parents --max-count=1 $head 2>/dev/null) 14do 15test$tree=$(git rev-parse $p^{tree} 2>/dev/null)&& 16 vn=$(git describe --abbrev=4 $p 2>/dev/null)&& 17case"$vn"in 18 gitgui-[0-9]*)echo$vn;break;; 19esac 20done 21} 22 23# Always use the tarball version file if found, just 24# in case we are somehow contained in a larger git 25# repository that doesn't actually track our state. 26# (At least one package manager is doing this.) 27# 28# We may be a subproject, so try looking for the merge 29# commit that supplied this directory content if we are 30# not at the toplevel. We probably will always be the 31# second parent in the commit, but we shouldn't rely on 32# that fact. 33# 34# If we are at the toplevel or the merge assumption fails 35# try looking for a gitgui-* tag. 36 37iftest -f version && 38 VN=$(cat version) 39then 40: happy 41elif prefix="$(git rev-parse --show-prefix 2>/dev/null)" 42test -n"$prefix"&& 43head=$(git rev-list --max-count=1 HEAD -- . 2>/dev/null)&& 44 tree=$(git rev-parse --verify "HEAD:$prefix" 2>/dev/null)&& 45 VN=$(tree_search $head $tree) 46case"$VN"in 47 gitgui-[0-9]*) : happy ;; 48*) (exit1) ;; 49esac 50then 51 VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g'); 52elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null)&& 53case"$VN"in 54 gitgui-[0-9]*) : happy ;; 55*) (exit1) ;; 56esac 57then 58 VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g'); 59else 60 VN="$DEF_VER" 61fi 62 63dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null)|| dirty= 64case"$dirty"in 65'') 66;; 67*) 68 VN="$VN-dirty";; 69esac 70 71iftest -r$GVF 72then 73 VC=$(sed -e 's/^GITGUI_VERSION = //' <$GVF) 74else 75 VC=unset 76fi 77test"$VN"="$VC"|| { 78echo>&2"GITGUI_VERSION =$VN" 79echo"GITGUI_VERSION =$VN">$GVF 80} 81 82