Blame build-aux/git-version-gen

Packit 33f14e
#!/bin/sh
Packit 33f14e
# Print a version string.
Packit 33f14e
scriptversion=2017-01-09.19; # UTC
Packit 33f14e
Packit 33f14e
# Copyright (C) 2007-2017 Free Software Foundation, Inc.
Packit 33f14e
#
Packit 33f14e
# This program is free software: you can redistribute it and/or modify
Packit 33f14e
# it under the terms of the GNU General Public License as published by
Packit 33f14e
# the Free Software Foundation; either version 3 of the License, or
Packit 33f14e
# (at your option) any later version.
Packit 33f14e
#
Packit 33f14e
# This program is distributed in the hope that it will be useful,
Packit 33f14e
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
# GNU General Public License for more details.
Packit 33f14e
#
Packit 33f14e
# You should have received a copy of the GNU General Public License
Packit 33f14e
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 33f14e
Packit 33f14e
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
Packit 33f14e
# It may be run two ways:
Packit 33f14e
# - from a git repository in which the "git describe" command below
Packit 33f14e
#   produces useful output (thus requiring at least one signed tag)
Packit 33f14e
# - from a non-git-repo directory containing a .tarball-version file, which
Packit 33f14e
#   presumes this script is invoked like "./git-version-gen .tarball-version".
Packit 33f14e
Packit 33f14e
# In order to use intra-version strings in your project, you will need two
Packit 33f14e
# separate generated version string files:
Packit 33f14e
#
Packit 33f14e
# .tarball-version - present only in a distribution tarball, and not in
Packit 33f14e
#   a checked-out repository.  Created with contents that were learned at
Packit 33f14e
#   the last time autoconf was run, and used by git-version-gen.  Must not
Packit 33f14e
#   be present in either $(srcdir) or $(builddir) for git-version-gen to
Packit 33f14e
#   give accurate answers during normal development with a checked out tree,
Packit 33f14e
#   but must be present in a tarball when there is no version control system.
Packit 33f14e
#   Therefore, it cannot be used in any dependencies.  GNUmakefile has
Packit 33f14e
#   hooks to force a reconfigure at distribution time to get the value
Packit 33f14e
#   correct, without penalizing normal development with extra reconfigures.
Packit 33f14e
#
Packit 33f14e
# .version - present in a checked-out repository and in a distribution
Packit 33f14e
#   tarball.  Usable in dependencies, particularly for files that don't
Packit 33f14e
#   want to depend on config.h but do want to track version changes.
Packit 33f14e
#   Delete this file prior to any autoconf run where you want to rebuild
Packit 33f14e
#   files to pick up a version string change; and leave it stale to
Packit 33f14e
#   minimize rebuild time after unrelated changes to configure sources.
Packit 33f14e
#
Packit 33f14e
# As with any generated file in a VC'd directory, you should add
Packit 33f14e
# /.version to .gitignore, so that you don't accidentally commit it.
Packit 33f14e
# .tarball-version is never generated in a VC'd directory, so needn't
Packit 33f14e
# be listed there.
Packit 33f14e
#
Packit 33f14e
# Use the following line in your configure.ac, so that $(VERSION) will
Packit 33f14e
# automatically be up-to-date each time configure is run (and note that
Packit 33f14e
# since configure.ac no longer includes a version string, Makefile rules
Packit 33f14e
# should not depend on configure.ac for version updates).
Packit 33f14e
#
Packit 33f14e
# AC_INIT([GNU project],
Packit 33f14e
#         m4_esyscmd([build-aux/git-version-gen .tarball-version]),
Packit 33f14e
#         [bug-project@example])
Packit 33f14e
#
Packit 33f14e
# Then use the following lines in your Makefile.am, so that .version
Packit 33f14e
# will be present for dependencies, and so that .version and
Packit 33f14e
# .tarball-version will exist in distribution tarballs.
Packit 33f14e
#
Packit 33f14e
# EXTRA_DIST = $(top_srcdir)/.version
Packit 33f14e
# BUILT_SOURCES = $(top_srcdir)/.version
Packit 33f14e
# $(top_srcdir)/.version:
Packit 33f14e
#	echo $(VERSION) > $@-t && mv $@-t $@
Packit 33f14e
# dist-hook:
Packit 33f14e
#	echo $(VERSION) > $(distdir)/.tarball-version
Packit 33f14e
Packit 33f14e
Packit 33f14e
me=$0
Packit 33f14e
Packit 33f14e
version="git-version-gen $scriptversion
Packit 33f14e
Packit 33f14e
Copyright 2011 Free Software Foundation, Inc.
Packit 33f14e
There is NO warranty.  You may redistribute this software
Packit 33f14e
under the terms of the GNU General Public License.
Packit 33f14e
For more information about these matters, see the files named COPYING."
Packit 33f14e
Packit 33f14e
usage="\
Packit 33f14e
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
Packit 33f14e
Print a version string.
Packit 33f14e
Packit 33f14e
Options:
Packit 33f14e
Packit 33f14e
   --prefix PREFIX    prefix of git tags (default 'v')
Packit 33f14e
   --fallback VERSION
Packit 33f14e
                      fallback version to use if \"git --version\" fails
Packit 33f14e
Packit 33f14e
   --help             display this help and exit
Packit 33f14e
   --version          output version information and exit
Packit 33f14e
Packit 33f14e
Running without arguments will suffice in most cases."
Packit 33f14e
Packit 33f14e
prefix=v
Packit 33f14e
fallback=
Packit 33f14e
Packit 33f14e
while test $# -gt 0; do
Packit 33f14e
  case $1 in
Packit 33f14e
    --help) echo "$usage"; exit 0;;
Packit 33f14e
    --version) echo "$version"; exit 0;;
Packit 33f14e
    --prefix) shift; prefix=${1?};;
Packit 33f14e
    --fallback) shift; fallback=${1?};;
Packit 33f14e
    -*)
Packit 33f14e
      echo "$0: Unknown option '$1'." >&2
Packit 33f14e
      echo "$0: Try '--help' for more information." >&2
Packit 33f14e
      exit 1;;
Packit 33f14e
    *)
Packit 33f14e
      if test "x$tarball_version_file" = x; then
Packit 33f14e
        tarball_version_file="$1"
Packit 33f14e
      elif test "x$tag_sed_script" = x; then
Packit 33f14e
        tag_sed_script="$1"
Packit 33f14e
      else
Packit 33f14e
        echo "$0: extra non-option argument '$1'." >&2
Packit 33f14e
        exit 1
Packit 33f14e
      fi;;
Packit 33f14e
  esac
Packit 33f14e
  shift
Packit 33f14e
done
Packit 33f14e
Packit 33f14e
if test "x$tarball_version_file" = x; then
Packit 33f14e
    echo "$usage"
Packit 33f14e
    exit 1
Packit 33f14e
fi
Packit 33f14e
Packit 33f14e
tag_sed_script="${tag_sed_script:-s/x/x/}"
Packit 33f14e
Packit 33f14e
nl='
Packit 33f14e
'
Packit 33f14e
Packit 33f14e
# Avoid meddling by environment variable of the same name.
Packit 33f14e
v=
Packit 33f14e
v_from_git=
Packit 33f14e
Packit 33f14e
# First see if there is a tarball-only version file.
Packit 33f14e
# then try "git describe", then default.
Packit 33f14e
if test -f $tarball_version_file
Packit 33f14e
then
Packit 33f14e
    v=`cat $tarball_version_file` || v=
Packit 33f14e
    case $v in
Packit 33f14e
        *$nl*) v= ;; # reject multi-line output
Packit 33f14e
        [0-9]*) ;;
Packit 33f14e
        *) v= ;;
Packit 33f14e
    esac
Packit 33f14e
    test "x$v" = x \
Packit 33f14e
        && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
Packit 33f14e
fi
Packit 33f14e
Packit 33f14e
if test "x$v" != x
Packit 33f14e
then
Packit 33f14e
    : # use $v
Packit 33f14e
# Otherwise, if there is at least one git commit involving the working
Packit 33f14e
# directory, and "git describe" output looks sensible, use that to
Packit 33f14e
# derive a version string.
Packit 33f14e
elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
Packit 33f14e
    && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
Packit 33f14e
          || git describe --abbrev=4 HEAD 2>/dev/null` \
Packit 33f14e
    && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
Packit 33f14e
    && case $v in
Packit 33f14e
         $prefix[0-9]*) ;;
Packit 33f14e
         *) (exit 1) ;;
Packit 33f14e
       esac
Packit 33f14e
then
Packit 33f14e
    # Is this a new git that lists number of commits since the last
Packit 33f14e
    # tag or the previous older version that did not?
Packit 33f14e
    #   Newer: v6.10-77-g0f8faeb
Packit 33f14e
    #   Older: v6.10-g0f8faeb
Packit 33f14e
    case $v in
Packit 33f14e
        *-*-*) : git describe is okay three part flavor ;;
Packit 33f14e
        *-*)
Packit 33f14e
            : git describe is older two part flavor
Packit 33f14e
            # Recreate the number of commits and rewrite such that the
Packit 33f14e
            # result is the same as if we were using the newer version
Packit 33f14e
            # of git describe.
Packit 33f14e
            vtag=`echo "$v" | sed 's/-.*//'`
Packit 33f14e
            commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
Packit 33f14e
                || { commit_list=failed;
Packit 33f14e
                     echo "$0: WARNING: git rev-list failed" 1>&2; }
Packit 33f14e
            numcommits=`echo "$commit_list" | wc -l`
Packit 33f14e
            v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
Packit 33f14e
            test "$commit_list" = failed && v=UNKNOWN
Packit 33f14e
            ;;
Packit 33f14e
    esac
Packit 33f14e
Packit 33f14e
    # Change the first '-' to a '.', so version-comparing tools work properly.
Packit 33f14e
    # Remove the "g" in git describe's output string, to save a byte.
Packit 33f14e
    v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
Packit 33f14e
    v_from_git=1
Packit 33f14e
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
Packit 33f14e
    v=UNKNOWN
Packit 33f14e
else
Packit 33f14e
    v=$fallback
Packit 33f14e
fi
Packit 33f14e
Packit 33f14e
v=`echo "$v" |sed "s/^$prefix//"`
Packit 33f14e
Packit 33f14e
# Test whether to append the "-dirty" suffix only if the version
Packit 33f14e
# string we're using came from git.  I.e., skip the test if it's "UNKNOWN"
Packit 33f14e
# or if it came from .tarball-version.
Packit 33f14e
if test "x$v_from_git" != x; then
Packit 33f14e
  # Don't declare a version "dirty" merely because a timestamp has changed.
Packit 33f14e
  git update-index --refresh > /dev/null 2>&1
Packit 33f14e
Packit 33f14e
  dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
Packit 33f14e
  case "$dirty" in
Packit 33f14e
      '') ;;
Packit 33f14e
      *) # Append the suffix only if there isn't one already.
Packit 33f14e
          case $v in
Packit 33f14e
            *-dirty) ;;
Packit 33f14e
            *) v="$v-dirty" ;;
Packit 33f14e
          esac ;;
Packit 33f14e
  esac
Packit 33f14e
fi
Packit 33f14e
Packit 33f14e
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
Packit 33f14e
printf %s "$v"
Packit 33f14e
Packit 33f14e
# Local variables:
Packit 33f14e
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit 33f14e
# time-stamp-start: "scriptversion="
Packit 33f14e
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit 33f14e
# time-stamp-time-zone: "UTC0"
Packit 33f14e
# time-stamp-end: "; # UTC"
Packit 33f14e
# End: