Eric Blake wrote: > On 01/03/2011 11:37 AM, Jim Meyering wrote: >>> I'll probably end up writing yet a third approach, which collects git >>> rev-list output into a temporary variable in order to correctly detect >>> failures, without refactoring into a helper function. >> >> Thanks for forwarding that here. >> Here's a lightly tested patch to do what you suggest. >> I tried to keep it minimal, since what we're doing here >> is solely to accommodate very old versions of git. > > You beat me to it, but your approach matches my thoughts. > >> @@ -122,8 +122,12 @@ then >> # result is the same as if we were using the newer version >> # of git describe. >> vtag=`echo "$v" | sed 's/-.*//'` >> - numcommits=`git rev-list "$vtag"..HEAD | wc -l` >> + commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \ >> + || { commit_list=failed; >> + echo "$0: WARNING: git rev-list failed" 1>&2; } >> + numcommits=`echo "$commit_list" | wc -l` >> v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; >> + test "$commit_list" = failed && v=UNKNOWN > > I like it.
I tweaked the log and pushed it, along with another commit to convert most TABs to spaces. I left the two in the sample Makefile snippet: >From 98e2bedbc92b816b68ee8092224b1e11f37b6596 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Mon, 3 Jan 2011 19:35:19 +0100 Subject: [PATCH 1/2] git-version-gen: handle failed "git rev-list" * build-aux/git-version-gen: Rather than leaking a "fatal" error from git and proceeding as if it had succeeded but printed no SHA1 checksums, suppress the diagnostic and handle the failure. Reported by Bruce Korb in http://marc.info/?l=git&m=129399145930450&w=2 --- ChangeLog | 6 ++++++ build-aux/git-version-gen | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 749ad91..88ed953 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-01-03 Jim Meyering <meyer...@redhat.com> + git-version-gen: handle failed "git rev-list" + * build-aux/git-version-gen: Rather than leaking a "fatal" error + from git and proceeding as if it had succeeded but printed no SHA1 + checksums, suppress the diagnostic and handle the failure. + Reported by Bruce Korb in http://marc.info/?l=git&m=129399145930450&w=2 + git-version-gen: include command name in one more diagnostic * build-aux/git-version-gen: When the required .tarball-version file was missing or unreadable, you might see the diagnostic from "cat", diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen index c337673..dd893f9 100755 --- a/build-aux/git-version-gen +++ b/build-aux/git-version-gen @@ -1,6 +1,6 @@ #!/bin/sh # Print a version string. -scriptversion=2011-01-03.10; # UTC +scriptversion=2011-01-03.18; # UTC # Copyright (C) 2007-2011 Free Software Foundation, Inc. # @@ -122,8 +122,12 @@ then # result is the same as if we were using the newer version # of git describe. vtag=`echo "$v" | sed 's/-.*//'` - numcommits=`git rev-list "$vtag"..HEAD | wc -l` + commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \ + || { commit_list=failed; + echo "$0: WARNING: git rev-list failed" 1>&2; } + numcommits=`echo "$commit_list" | wc -l` v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; + test "$commit_list" = failed && v=UNKNOWN ;; esac -- 1.7.3.4 >From 307d43494913d332a425e6d384142aed28536e53 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Mon, 3 Jan 2011 20:41:49 +0100 Subject: [PATCH 2/2] git-version-gen: convert leading TABs to spaces * build-aux/git-version-gen: Expand leading TABs. --- ChangeLog | 3 ++ build-aux/git-version-gen | 52 ++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 88ed953..97e911b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-01-03 Jim Meyering <meyer...@redhat.com> + git-version-gen: convert leading TABs to spaces + * build-aux/git-version-gen: Expand leading TABs. + git-version-gen: handle failed "git rev-list" * build-aux/git-version-gen: Rather than leaking a "fatal" error from git and proceeding as if it had succeeded but printed no SHA1 diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen index dd893f9..f116ba1 100755 --- a/build-aux/git-version-gen +++ b/build-aux/git-version-gen @@ -1,6 +1,6 @@ #!/bin/sh # Print a version string. -scriptversion=2011-01-03.18; # UTC +scriptversion=2011-01-03.19; # UTC # Copyright (C) 2007-2011 Free Software Foundation, Inc. # @@ -87,12 +87,12 @@ if test -f $tarball_version_file then v=`cat $tarball_version_file` || v= case $v in - *$nl*) v= ;; # reject multi-line output - [0-9]*) ;; - *) v= ;; + *$nl*) v= ;; # reject multi-line output + [0-9]*) ;; + *) v= ;; esac test -z "$v" \ - && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2 + && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2 fi if test -n "$v" @@ -103,11 +103,11 @@ then # derive a version string. elif test "`git log -1 --pretty=format:x . 2>&1`" = x \ && v=`git describe --abbrev=4 --match='v*' HEAD 2>/dev/null \ - || git describe --abbrev=4 HEAD 2>/dev/null` \ + || git describe --abbrev=4 HEAD 2>/dev/null` \ && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \ && case $v in - v[0-9]*) ;; - *) (exit 1) ;; + v[0-9]*) ;; + *) (exit 1) ;; esac then # Is this a new git that lists number of commits since the last @@ -115,20 +115,20 @@ then # Newer: v6.10-77-g0f8faeb # Older: v6.10-g0f8faeb case $v in - *-*-*) : git describe is okay three part flavor ;; - *-*) - : git describe is older two part flavor - # Recreate the number of commits and rewrite such that the - # result is the same as if we were using the newer version - # of git describe. - vtag=`echo "$v" | sed 's/-.*//'` - commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \ - || { commit_list=failed; - echo "$0: WARNING: git rev-list failed" 1>&2; } - numcommits=`echo "$commit_list" | wc -l` - v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; - test "$commit_list" = failed && v=UNKNOWN - ;; + *-*-*) : git describe is okay three part flavor ;; + *-*) + : git describe is older two part flavor + # Recreate the number of commits and rewrite such that the + # result is the same as if we were using the newer version + # of git describe. + vtag=`echo "$v" | sed 's/-.*//'` + commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \ + || { commit_list=failed; + echo "$0: WARNING: git rev-list failed" 1>&2; } + numcommits=`echo "$commit_list" | wc -l` + v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; + test "$commit_list" = failed && v=UNKNOWN + ;; esac # Change the first '-' to a '.', so version-comparing tools work properly. @@ -147,10 +147,10 @@ dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty= case "$dirty" in '') ;; *) # Append the suffix only if there isn't one already. - case $v in - *-dirty) ;; - *) v="$v-dirty" ;; - esac ;; + case $v in + *-dirty) ;; + *) v="$v-dirty" ;; + esac ;; esac # Omit the trailing newline, so that m4_esyscmd can use the result directly. -- 1.7.3.4