Blame build-aux/git-version-gen

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