Hi Jim, On Fri 06 Jul 2012 16:32, Jim Meyering <j...@meyering.net> writes:
> It'd be nice to say "why" this change is useful. > At worst, just refer to the URL for this mailing list thread. OK. > Protecting against envvars by those names is a good idea. > That's a fix that merits mention in the ChangeLog, if not > a separate commit. > However, please don't use "unset" and rather just set them to > the empty string as is done just below -- oh, and also initialize > tarball_version_file: OK. >> # 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=`git describe --abbrev=4 --match="$match" HEAD 2>/dev/null` \ > > Why remove the second git invocation here? > I can see why you'd do that when --match has been specified, > but what about all of us who use the default (no --match option). > Do you really want to add the "feature" that git-version-gen now > fails when there is no "v*" tag, whereas before that worked fine? Fixed to only match strictly when --match is passed. I couldn't figure out a way to do it without the gymnastics. Andy
>From 1994935abc52afb85eb71232075ce06a9c83bf1b 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. (massage_git_version): Contort the tests to 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 released more recently than the 3 version. --- build-aux/git-version-gen | 65 +++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen index 0fa9063..c7ed287 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.15; # 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,7 @@ 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() { # 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 @@ -184,6 +177,38 @@ then # Remove the "g" in git describe's output string, to save a byte. v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`; v_from_git=1 +} + +if test -n "$v" +then + : # use $v +# Otherwise, if the user specified --match, look for a matching tag. +elif test -n "$match" +then + if test "`git log -1 --pretty=format:x . 2>&1`" = x \ + && v=`git describe --abbrev=4 --match="$match" HEAD 2>/dev/null` \ + && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \ + && case $v in + $prefix[0-9]*) ;; + *) (exit 1) ;; + esac + then + massage_git_version + else + v=UNKNOWN + fi +# Otherwise, look for a tag starting with --prefix, or the first tag we +# find, sed it, and see if it looks like a version. +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 + massage_git_version else v=UNKNOWN fi -- 1.7.10
-- http://wingolog.org/