Skip to contentSkip to conversation

GIT-VERSION-GEN: make use of git describe --dirty

PATCH In review Jonathan Nieder 3 participants 7 messages Jun 15, 2016 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/3 GIT-VERSION-GEN: make use of git describe --dirty

Currently, GIT-VERSION-GEN invokes the plumbing commands "git update-index" and "git diff-index" to determine if the working tree is dirty. It then appends "-dirty" to the version string returned by "git describe".

However, as of Git v1.6.6, "git describe" can be told to do all that with the "--dirty" option, saving us the plumbing.

---
 GIT-VERSION-GEN |    7 ++-----
 1 files changed, 2 insertions(+), 5 deletions(-)
GIT-VERSION-GEN +2 -5
index d441d88..73d5cf9 100755
@@ -12,13 +12,10 @@ if test -f version
 then
 	VN=$(cat version) || VN="$DEF_VER"
 elif test -d .git -o -f .git &&
-	VN=$(git describe --match "v[0-9]*" --abbrev=4 HEAD 2>/dev/null) &&
+	VN=$(git describe --match "v[0-9]*" --abbrev=4 --dirty 2>/dev/null) &&
 	case "$VN" in
 	*$LF*) (exit 1) ;;
-	v[0-9]*)
-		git update-index -q --refresh
-		test -z "$(git diff-index --name-only HEAD --)" ||
-		VN="$VN-dirty" ;;
+	v[0-9]*) : ;;
 	esac
 then
 	VN=$(echo "$VN" | sed -e 's/-/./g');
Signature · 1 line
1.7.3.2
#2 lore raw
Quoted 6 lines · Mathias Lafeldt

Currently, GIT-VERSION-GEN invokes the plumbing commands "git update-index" and "git diff-index" to determine if the working tree is dirty. It then appends "-dirty" to the version string returned by "git describe".

However, as of Git v1.6.6, "git describe" can be told to do all that with the "--dirty" option, saving us the plumbing.

This has a minor downside, which is avoiding the nice version numbers when building Git with git 1.5.6 installed. What is the upside?

#3 lore raw
Quoted 11 lines · Jonathan Nieder
Quoted 6 lines · Mathias Lafeldt

Currently, GIT-VERSION-GEN invokes the plumbing commands "git update-index" and "git diff-index" to determine if the working tree is dirty. It then appends "-dirty" to the version string returned by "git describe".

However, as of Git v1.6.6, "git describe" can be told to do all that with the "--dirty" option, saving us the plumbing.

This has a minor downside, which is avoiding the nice version numbers when building Git with git 1.5.6 installed. What is the upside?

The upside is that the number of executed commands to get the version string is reduced from three to one.

I understand your point, though it would only be a "problem" once when doing the upgrade.

If backwards compatibility is more important here, I'd at least add a comment to GIT-VERSION-GEN. Something like:

GIT-VERSION-GEN +4 -0
index d441d88..5c226f6 100755
@@ -16,6 +16,10 @@ elif test -d .git -o -f .git &&
        case "$VN" in
        *$LF*) (exit 1) ;;
        v[0-9]*)
+               # As of Git v1.6.6, we can use "git describe --dirty" to
+               # determine if the working tree is dirty. However, to still
+               # have nice version numbers when building Git with older
+               # versions of git installed, we keep using plumbing.
                git update-index -q --refresh
                test -z "$(git diff-index --name-only HEAD --)" ||
                VN="$VN-dirty" ;;

-Mathias

#4 lore raw
Quoted 27 lines · Mathias Lafeldt
Quoted 10 lines · Jonathan Nieder
Quoted 6 lines · Mathias Lafeldt

Currently, GIT-VERSION-GEN invokes the plumbing commands "git update-index" and "git diff-index" to determine if the working tree is dirty. It then appends "-dirty" to the version string returned by "git describe".

However, as of Git v1.6.6, "git describe" can be told to do all that with the "--dirty" option, saving us the plumbing.

This has a minor downside, which is avoiding the nice version numbers when building Git with git 1.5.6 installed. What is the upside?

The upside is that the number of executed commands to get the version string is reduced from three to one.

I understand your point, though it would only be a "problem" once when doing the upgrade.

If backwards compatibility is more important here, I'd at least add a comment to GIT-VERSION-GEN. Something like:

GIT-VERSION-GEN +0 -0
index d441d88..5c226f6 100755

GIT-VERSION-GEN elif test -d .git -o -f .git && · line 25

Quoted 10 lines
GIT-VERSION-GEN +4 -0
@@ -16,6 +16,10 @@ elif test -d .git -o -f .git &&
        case "$VN" in
        *$LF*) (exit 1) ;;
        v[0-9]*)
+               # As of Git v1.6.6, we can use "git describe --dirty" to
+               # determine if the working tree is dirty. However, to still
+               # have nice version numbers when building Git with older
+               # versions of git installed, we keep using plumbing.
                git update-index -q --refresh
                test -z "$(git diff-index --name-only HEAD --)" ||
                VN="$VN-dirty" ;;

Any feedback would be welcome.

-Mathias

#5 lore raw
Quoted 12 lines · Mathias Lafeldt
Quoted 10 lines · Mathias Lafeldt
GIT-VERSION-GEN +2 -0
index d441d88..5c226f6 100755
@@ -16,6 +16,10 @@ elif test -d .git -o -f .git &&
        case "$VN" in
        *$LF*) (exit 1) ;;
        v[0-9]*)
+               # As of Git v1.6.6, we can use "git describe --dirty" to
+               # determine if the working tree is dirty. However, to still
Quoted 8 lines

GIT-VERSION-GEN elif test -d .git -o -f .git && · line 25

Quoted 6 lines
GIT-VERSION-GEN +2 -0
+               # have nice version numbers when building Git with older
+               # versions of git installed, we keep using plumbing.
                git update-index -q --refresh
                test -z "$(git diff-index --name-only HEAD --)" ||
                VN="$VN-dirty" ;;

Any feedback would be welcome.

I like it, also because people who use GIT-VERSION-GEN from git repository as inspiration would get to know more modern technique.

Signature · 3 lines
Jakub Narebski
Poland
ShadeHawk on #git
#6 lore raw

PATCH 2/3 GIT-VERSION-GEN: tweak processing of version file

In reply to a message not in the archive

- check for version file with "test -r"
- read version file using shell builtin "read" rather than "cat"

---
 GIT-VERSION-GEN |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
GIT-VERSION-GEN +2 -2
index 73d5cf9..427d5d6 100755
@@ -8,9 +8,9 @@ LF='
 
 # First see if there is a version file (included in release tarballs),
 # then try git-describe, then default.
-if test -f version
+if test -r version
 then
-	VN=$(cat version) || VN="$DEF_VER"
+	read VN 2>/dev/null < version || VN="$DEF_VER"
 elif test -d .git -o -f .git &&
 	VN=$(git describe --match "v[0-9]*" --abbrev=4 --dirty 2>/dev/null) &&
 	case "$VN" in
Signature · 1 line
1.7.3.2
#7 lore raw

PATCH 3/3 GIT-VERSION-GEN: style nitpicks

In reply to a message not in the archive

- remove superfluous semicolon
- simplify version comparison
- remove empty lines at end of file

---
 GIT-VERSION-GEN |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)
GIT-VERSION-GEN +5 -5
index 427d5d6..60bef5a 100755
@@ -18,7 +18,7 @@ elif test -d .git -o -f .git &&
 	v[0-9]*) : ;;
 	esac
 then
-	VN=$(echo "$VN" | sed -e 's/-/./g');
+	VN=$(echo "$VN" | sed -e 's/-/./g')
 else
 	VN="$DEF_VER"
 fi
@@ -31,9 +31,9 @@ then
 else
 	VC=unset
 fi
-test "$VN" = "$VC" || {
+
+if test "$VN" != "$VC"
+then
 	echo >&2 "GIT_VERSION = $VN"
 	echo "GIT_VERSION = $VN" >$GVF
-}
-
-
+fi
Signature · 1 line
1.7.3.2