git-gui / GIT-VERSION-GENon commit test-reach: test reduce_heads (0c89f71)
   1#!/bin/sh
   2
   3GVF=GIT-VERSION-FILE
   4DEF_VER=0.21.GITGUI
   5
   6LF='
   7'
   8
   9tree_search ()
  10{
  11        head=$1
  12        tree=$2
  13        for p in $(git rev-list --parents --max-count=1 $head 2>/dev/null)
  14        do
  15                test $tree = $(git rev-parse $p^{tree} 2>/dev/null) &&
  16                vn=$(git describe --abbrev=4 $p 2>/dev/null) &&
  17                case "$vn" in
  18                gitgui-[0-9]*) echo $vn; break;;
  19                esac
  20        done
  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
  37if test -f version &&
  38   VN=$(cat version)
  39then
  40        : happy
  41elif prefix="$(git rev-parse --show-prefix 2>/dev/null)"
  42   test -n "$prefix" &&
  43   head=$(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)
  46   case "$VN" in
  47   gitgui-[0-9]*) : happy ;;
  48   *) (exit 1) ;;
  49   esac
  50then
  51        VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g');
  52elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&
  53   case "$VN" in
  54   gitgui-[0-9]*) : happy ;;
  55   *) (exit 1) ;;
  56   esac
  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
  71if test -r $GVF
  72then
  73        VC=$(sed -e 's/^GITGUI_VERSION = //' <$GVF)
  74else
  75        VC=unset
  76fi
  77test "$VN" = "$VC" || {
  78        echo >&2 "GITGUI_VERSION = $VN"
  79        echo "GITGUI_VERSION = $VN" >$GVF
  80}