Blame build-aux/git-version-gen

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