On Fri 06 Jul 2012 17:45, Jim Meyering <j...@meyering.net> writes: > How about writing a function -- with description similar to the comments > you've added below -- and doing something like the following? > Then we should be able to avoid that duplication. > > elif test "`git log -1 --pretty=format:x . 2>&1`" = x \ > - && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \ > - || git describe --abbrev=4 HEAD 2>/dev/null` \ > + && v=`git_desc "$prefix" "$match"` \ > ...
Good suggestion. Attached.
>From f93e662664c1eac104e1144bea94d9386ffc8ab5 Mon Sep 17 00:00:00 2001 From: Andy Wingo <wi...@pobox.com> Date: Fri, 6 Jul 2012 17:27:37 +0200 Subject: [PATCH] git-version-gen: add --match argument. * build-aux/git-version-gen (Options): Add --match argument. (match): (tag_sed_script): (tarball_version_file): Protect against ambient values of these variables. (git_describe, massage_git_version): New helper functions. Require a match in the --match case, and otherwise have our previous behavior. Using --match can prevent a merge from e.g. a version 2 branch to a 3 branch from causing the 3 branch to show a 2 version, if the 2 version tagged more recently than the 3 version. --- build-aux/git-version-gen | 73 ++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen index 0fa9063..ca98f4a 100755 --- a/build-aux/git-version-gen +++ b/build-aux/git-version-gen @@ -1,6 +1,6 @@ #!/bin/sh # Print a version string. -scriptversion=2012-03-18.17; # UTC +scriptversion=2012-07-06.17; # UTC # Copyright (C) 2007-2012 Free Software Foundation, Inc. # @@ -85,20 +85,27 @@ Print a version string. Options: - --prefix prefix of git tags (default 'v') + --prefix prefix of git tags to strip from version (default 'v') + --match pattern for git tags to match - --help display this help and exit - --version output version information and exit + --help display this help and exit + --version output version information and exit -Running without arguments will suffice in most cases." +Running without arguments will suffice in most cases. If no --match +argument is given, try to match tags that begin with the --prefix, +falling back to the first tag that git-describe finds." prefix=v +match= +tag_sed_script= +tarball_version_file= while test $# -gt 0; do case $1 in --help) echo "$usage"; exit 0;; --version) echo "$version"; exit 0;; --prefix) shift; prefix="$1";; + --match) shift; match="$1";; -*) echo "$0: Unknown option '$1'." >&2 echo "$0: Try '--help' for more information." >&2 @@ -144,21 +151,8 @@ then && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2 fi -if test -n "$v" -then - : # use $v -# Otherwise, if there is at least one git commit involving the working -# directory, and "git describe" output looks sensible, use that to -# derive a version string. -elif test "`git log -1 --pretty=format:x . 2>&1`" = x \ - && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \ - || git describe --abbrev=4 HEAD 2>/dev/null` \ - && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \ - && case $v in - $prefix[0-9]*) ;; - *) (exit 1) ;; - esac -then +function massage_git_version() { + local v=$1 # Is this a new git that lists number of commits since the last # tag or the previous older version that did not? # Newer: v6.10-77-g0f8faeb @@ -182,7 +176,44 @@ then # Change the first '-' to a '.', so version-comparing tools work properly. # Remove the "g" in git describe's output string, to save a byte. - v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`; + echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/' +} + +function git_describe() { + local prefix=$1 + local match=$2 + local v + + # Make sure this working directory has commits. + test "`git log -1 --pretty=format:x . 2>&1`" = x || exit 1 + + # If the user specified --match, look for a matching tag. + # Otherwise, look for a tag starting with --prefix, or the first tag + # we find. + if test -n "$match" + then + v=`git describe --abbrev=4 --match="$match" HEAD 2>/dev/null` || exit 1 + else + v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \ + || git describe --abbrev=4 HEAD 2>/dev/null` || exit 1 + fi + + v=`printf '%s\n' "$v" | sed "$tag_sed_script"` || exit 1 + case $v in + $prefix[0-9]*) + massage_git_version "$v" + ;; + *) + exit 1 + ;; + esac +} + +if test -n "$v" +then + : # use $v +elif v=`git_describe "$prefix" "$match"` +then v_from_git=1 else v=UNKNOWN -- 1.7.10
-- http://wingolog.org/