Blame build-aux/git-version-gen

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