Blame build-aux/git-version-gen

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