Blame build-aux/git-version-gen

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