26370f73c0
Some distributions are using Git for part of their package management system, but unpack Git's own source code for delivery from the .tar.gz. This means that when we walk up the directory tree with git-describe to locate a Git repository, the repository we find is for the distribution and *not* for git-gui. Consequently any tag we might find there is bogus and does not apply to us. In this case the version file should always exist and be readable, as the packager is working from the released .tar.gz sources. So we should always favor the version file over anything git-describe guess for us. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
83 lines
1.8 KiB
Bash
Executable File
83 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
GVF=GIT-VERSION-FILE
|
|
DEF_VER=0.6.GITGUI
|
|
|
|
LF='
|
|
'
|
|
|
|
tree_search ()
|
|
{
|
|
head=$1
|
|
tree=$2
|
|
for p in $(git rev-list --parents --max-count=1 $head 2>/dev/null)
|
|
do
|
|
test $tree = $(git rev-parse $p^{tree} 2>/dev/null) &&
|
|
vn=$(git describe --abbrev=4 $p 2>/dev/null) &&
|
|
case "$vn" in
|
|
gitgui-[0-9]*) echo $vn; break;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Always use the tarball version file if found, just
|
|
# in case we are somehow contained in a larger git
|
|
# repository that doesn't actually track our state.
|
|
# (At least one package manager is doing this.)
|
|
#
|
|
# We may be a subproject, so try looking for the merge
|
|
# commit that supplied this directory content if we are
|
|
# not at the toplevel. We probably will always be the
|
|
# second parent in the commit, but we shouldn't rely on
|
|
# that fact.
|
|
#
|
|
# If we are at the toplevel or the merge assumption fails
|
|
# try looking for a gitgui-* tag.
|
|
|
|
if test -f version &&
|
|
VN=$(cat version)
|
|
then
|
|
: happy
|
|
elif prefix="$(git rev-parse --show-prefix 2>/dev/null)"
|
|
test -n "$prefix" &&
|
|
head=$(git rev-list --max-count=1 HEAD -- . 2>/dev/null) &&
|
|
tree=$(git rev-parse --verify "HEAD:$prefix" 2>/dev/null) &&
|
|
VN=$(tree_search $head $tree)
|
|
case "$VN" in
|
|
gitgui-[0-9]*) : happy ;;
|
|
*) (exit 1) ;;
|
|
esac
|
|
then
|
|
VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g');
|
|
elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
|
|
case "$VN" in
|
|
gitgui-[0-9]*) : happy ;;
|
|
*) (exit 1) ;;
|
|
esac
|
|
then
|
|
VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g');
|
|
else
|
|
VN="$DEF_VER"
|
|
fi
|
|
|
|
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/^GITGUI_VERSION = //' <$GVF)
|
|
else
|
|
VC=unset
|
|
fi
|
|
test "$VN" = "$VC" || {
|
|
echo >&2 "GITGUI_VERSION = $VN"
|
|
echo "GITGUI_VERSION = $VN" >$GVF
|
|
}
|
|
|
|
|