git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] rpmbuild doesn't like '-' in version strings
@ 2005-12-30 17:29 John Ellson
  2006-01-06 22:37 ` Junio C Hamano
  0 siblings, 1 reply; 11+ messages in thread
From: John Ellson @ 2005-12-30 17:29 UTC (permalink / raw)
  To: git

Problem:

	ellson@ellson:git> make rpm
	GIT_VERSION = 1.0.6-g58e3
	sed -e 's/@@VERSION@@/1.0.6-g58e3/g' < git.spec.in > git.spec
	./git-tar-tree HEAD git-1.0.6-g58e3 > git-1.0.6-g58e3.tar
	tar rf git-1.0.6-g58e3.tar git-1.0.6-g58e3/git.spec
	gzip -f -9 git-1.0.6-g58e3.tar
	rpmbuild -ta git-1.0.6-g58e3.tar.gz
	error: line 3: Illegal char '-' in version: Version:    1.0.6-g58e3
	make: *** [rpm] Error 1


Suggested fix:  Use '_' instead of '-'

There is probably a cleaner implementation of the fix, but this works for me.

----------------------------------------


diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 845b9dc..e4e0ab1 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -3,7 +3,9 @@
  GVF=GIT-VERSION-FILE

  VN=$(git-describe --abbrev=4 HEAD 2>/dev/null) || VN=v1.0.GIT
-VN=$(expr "$VN" : v'\(.*\)')
+VN1=$(expr "$VN" : '[^-]*-\(.*\)')
+VN=$(expr "$VN" : v'\([^-]*\)')
+test "$VN1" = "" || VN="$VN"_"$VN1"
  if test -r $GVF
  then
         VC=$(sed -e 's/^GIT_VERSION = //' <$GVF)


--------------------------------------------


Signed-off-by: John Ellson <ellson@research.att.com>

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2005-12-30 17:29 [PATCH] rpmbuild doesn't like '-' in version strings John Ellson
@ 2006-01-06 22:37 ` Junio C Hamano
  2006-01-07  0:04   ` Andreas Ericsson
                     ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Junio C Hamano @ 2006-01-06 22:37 UTC (permalink / raw)
  To: John Ellson; +Cc: git, Linus Torvalds

John Ellson <ellson@research.att.com> writes:

> Suggested fix:  Use '_' instead of '-'

I wonder if the right fix is to change the git-describe output
before the current output becomes too widespread.  After all,
somebody might be tempted to use 1.0.6-g58e3 as a tagname ;-).
For example, if we say "1.0.6:58e3" there is no ambiguity, but
probably binary packagers would not like colon either X-<.

More seriously, I do not think git-describe based versioning
scheme meshes well with binary packagers.  There is no guaranee
1.0.6-g58e3 comes before 1.0.6-g4e7a2 (it does not).  To really
fix this problem, I think the rpm target of the main Makefile
needs to be modified to include something monotonicly increasing
(e.g. number of seconds since the base commit encoded in base26,
or something silly like that) between the base version and the
abbreviated object name, but the development being distributed,
my today's version on top of 1.0.6 may be way behind your
yesterday's version, so some centralized coordination (read:
manual version assignment by the maintainer, or automated
assignment but only reserved for the maintainer and unavailable
to mere mortals) might be needed to truly solve this.  In that
sense, maybe leaving the interim version unbuildable for binary
packaging might be considered a feature.

What Linus did with git-describe is good for people who do not
install prebuilt binaries, or know how to override (false)
downgrade refusal by package managers.

I vaguely recall that Debian does not like underscores at random
places, but we know both RPM and Debian can handle multiple
dots, so if you insist using the git-describe based version to
build binary packages, I suspect dot instead of underscore would
be a better choice.  Since I do not understand what that "g"
stands for anyway, how about doing something like this instead?

Note that the part about "describe --stamp" is not really a
serious counterproposal.  If I cut a binary package out of my
master and then one of my topic branches, it is very likely they
will get confused time ordering when they happen to find the
same base revision.  This patch is for discussion only and I
will not even keep it in the proposed updates branch.  I would
however welcome if somebody polishes it up and makes it suitable
for binary packaging purposes ;-).

-- >8 --
[PATCH] sanitize describe output used in GIT_VERSION

It is reported that RPM does not like '-' in version name, which
unfortunately is what the new "git-describe" based interim
versioning scheme gives.

This does three things:

 - GIT-VERSION-GEN avoids '-' characters and replaces them with '.'.

 - git-describe --stamp flag adds number of seconds since the
   base revision until the named revision, between the base
   revision name and the abbreviated object name.

 - GIT-VERSION-GEN uses describe --stamp to make commits
   monotonically increasing to keep binary package managers
   happier, unless you have multiple branches or skewed clocks.

---
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index 0efe82a..ca0e781 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -8,7 +8,7 @@ git-describe - Show the most recent tag 
 
 SYNOPSIS
 --------
-'git-describe' [--all] [--tags] [--abbrev=<n>] <committish>...
+'git-describe' [--all] [--tags] [--abbrev=<n>] [--stamp] <committish>...
 
 DESCRIPTION
 -----------
@@ -35,6 +35,12 @@ OPTIONS
 	Instead of using the default 8 hexadecimal digits as the
 	abbreviated object name, use <n> digits.
 
+--stamp::
+	Add a timestamp string, expressed as number of seconds
+	between the commit times of the base commit and the
+	named commit, encoded in base26 (a-z), between the base
+	version name and abbreviated object name.
+
 
 EXAMPLES
 --------
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 845b9dc..f6ed589 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -2,8 +2,8 @@
 
 GVF=GIT-VERSION-FILE
 
-VN=$(git-describe --abbrev=4 HEAD 2>/dev/null) || VN=v1.0.GIT
-VN=$(expr "$VN" : v'\(.*\)')
+VN=$(git-describe --abbrev=4 --stamp HEAD 2>/dev/null) || VN=v1.0.GIT
+VN=$(echo "$VN" | sed -e 's/^v//' -e 's/-g\([^-]*\)$/-\1/' -e 's/-/./g')
 if test -r $GVF
 then
 	VC=$(sed -e 's/^GIT_VERSION = //' <$GVF)
diff --git a/describe.c b/describe.c
index 84d96b5..0414100 100644
--- a/describe.c
+++ b/describe.c
@@ -13,6 +13,7 @@ static int tags = 0;	/* But allow any ta
 
 #define DEFAULT_ABBREV 8 /* maybe too many */
 static int abbrev = DEFAULT_ABBREV;
+static int stamp = 0; /* show timestamps between base and abbrev */
 
 static int names = 0, allocs = 0;
 static struct commit_name {
@@ -98,6 +99,39 @@ static int compare_names(const void *_a,
 	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
 }
 
+static void describe_it(struct commit *cmit, struct commit_name *name)
+{
+	const char *ab = find_unique_abbrev(cmit->object.sha1, abbrev);
+	if (stamp) {
+		unsigned long t1 = name->commit->date;
+		unsigned long t2 = cmit->date;
+		char tstamp[11]; /* 26^13 < 2^64 < 26^14 */
+		int i;
+
+		/* It had better be the former unless there is something
+		 * really really screwy with your clock.
+		 */
+		if (t1 < t2) {
+			unsigned long t = t2 - t1;
+			for (i = 0; i < sizeof(tstamp) && t; i++) {
+				unsigned long d = t % 26;
+				t /= 26;
+				tstamp[i] = d + 'a';
+			}
+		}
+		else {
+			tstamp[0] = '0';
+			i = 1;
+		}
+		printf("%s-", name->path);
+		while (0 < i)
+			putchar(tstamp[--i]);
+		printf("-g%s\n", ab);
+	}
+	else
+		printf("%s-g%s\n", name->path, ab);
+}
+
 static void describe(struct commit *cmit)
 {
 	struct commit_list *list;
@@ -122,8 +156,7 @@ static void describe(struct commit *cmit
 		struct commit *c = pop_most_recent_commit(&list, SEEN);
 		n = match(c);
 		if (n) {
-			printf("%s-g%s\n", n->path,
-			       find_unique_abbrev(cmit->object.sha1, abbrev));
+			describe_it(cmit, n);
 			return;
 		}
 	}
@@ -146,6 +179,10 @@ int main(int argc, char **argv)
 			tags = 1;
 			continue;
 		}
+		if (!strcmp(arg, "--stamp")) {
+			stamp = 1;
+			continue;
+		}
 		if (!strncmp(arg, "--abbrev=", 9)) {
 			abbrev = strtoul(arg + 9, NULL, 10);
 			if (abbrev < 4 || 40 <= abbrev)

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-06 22:37 ` Junio C Hamano
@ 2006-01-07  0:04   ` Andreas Ericsson
  2006-01-07  0:47     ` Johannes Schindelin
  2006-01-07  1:22   ` Ryan Anderson
  2006-01-14 15:39   ` John Ellson
  2 siblings, 1 reply; 11+ messages in thread
From: Andreas Ericsson @ 2006-01-07  0:04 UTC (permalink / raw)
  To: git

Junio C Hamano wrote:
> John Ellson <ellson@research.att.com> writes:
> 
> 
>>Suggested fix:  Use '_' instead of '-'
> 
> 
> I wonder if the right fix is to change the git-describe output
> before the current output becomes too widespread.


I don't think there's any major risk of the current output being very 
widespread. It's not very useful for scripting.


>  To really
> fix this problem, I think the rpm target of the main Makefile
> needs to be modified to include something monotonicly increasing
> (e.g. number of seconds since the base commit encoded in base26,
> or something silly like that)


Why not keep it super-simple and just print the number of commits since 
whatever tag is found? It only counts commits on the current branch, so 
a merge shows up as a single commit. That should more or less be ok 
though and goes well with the topic branch model.


>  If I cut a binary package out of my
> master and then one of my topic branches, it is very likely they
> will get confused time ordering when they happen to find the
> same base revision.


I suppose this could happen when counting commits as well. People who 
build packages from different branches should be shot on sight though, 
so I wouldn't worry about it.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-07  0:04   ` Andreas Ericsson
@ 2006-01-07  0:47     ` Johannes Schindelin
  0 siblings, 0 replies; 11+ messages in thread
From: Johannes Schindelin @ 2006-01-07  0:47 UTC (permalink / raw)
  To: git

Hi,

we still could go back to \d.\d.\d.GIT, you know?

Using the output of git-describe only helps if you use git from the 
official repository. But when you have a private branch, they are only 
misleading. And if you use git from the official repository, you are more 
likely to take official versions anyway.

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-06 22:37 ` Junio C Hamano
  2006-01-07  0:04   ` Andreas Ericsson
@ 2006-01-07  1:22   ` Ryan Anderson
  2006-01-14 15:39   ` John Ellson
  2 siblings, 0 replies; 11+ messages in thread
From: Ryan Anderson @ 2006-01-07  1:22 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: John Ellson, git, Linus Torvalds

On Fri, Jan 06, 2006 at 02:37:27PM -0800, Junio C Hamano wrote:
>
> Since I do not understand what that "g"
> stands for anyway, how about doing something like this instead?

I'm pretty sure the "g" is my fault, indirectly.  When I submitted the
"AUTO_LOCALVERSION" patch to Linux, I prepended a -g to it, so it would
be possible to tell versions based off of a git tree apart from versions
based off of a CVS tree that used md5 to make a short, semi-unique
indicator.  Presumably, a CVS variant would've done something like
-c012345678, etc.

So, it's just a little mnemonic to hint that the extra version string
came from a git tree, as opposed to some other semi-random source. It's
value is rather dubious, overall, though.

-- 

Ryan Anderson
  sometimes Pug Majere

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-06 22:37 ` Junio C Hamano
  2006-01-07  0:04   ` Andreas Ericsson
  2006-01-07  1:22   ` Ryan Anderson
@ 2006-01-14 15:39   ` John Ellson
  2006-01-14 17:53     ` Linus Torvalds
  2006-01-14 19:17     ` Junio C Hamano
  2 siblings, 2 replies; 11+ messages in thread
From: John Ellson @ 2006-01-14 15:39 UTC (permalink / raw)
  To: git; +Cc: git, Linus Torvalds

Junio C Hamano wrote:
> John Ellson <ellson@research.att.com> writes:
> 
>> Suggested fix:  Use '_' instead of '-'
> 
> I wonder if the right fix is to change the git-describe output
> before the current output becomes too widespread.  After all,
> somebody might be tempted to use 1.0.6-g58e3 as a tagname ;-).
> For example, if we say "1.0.6:58e3" there is no ambiguity, but
> probably binary packagers would not like colon either X-<.
> 
> More seriously, I do not think git-describe based versioning
> scheme meshes well with binary packagers.  There is no guaranee
> 1.0.6-g58e3 comes before 1.0.6-g4e7a2 (it does not).  To really
> fix this problem, I think the rpm target of the main Makefile
> needs to be modified to include something monotonicly increasing
> (e.g. number of seconds since the base commit encoded in base26,
> or something silly like that) between the base version and the
> abbreviated object name, but the development being distributed,
> my today's version on top of 1.0.6 may be way behind your
> yesterday's version, so some centralized coordination (read:
> manual version assignment by the maintainer, or automated
> assignment but only reserved for the maintainer and unavailable
> to mere mortals) might be needed to truly solve this.  In that
> sense, maybe leaving the interim version unbuildable for binary
> packaging might be considered a feature.


What happened to this?   I don't particularly like my fix either, but
some kind of fix is needed for the "make rpm" target to work.  Its still broken 
because of the '-' in the version string.


The need in rpm versioning is to be able to distinguish and monotonically
order, locally built rpms.   There is no particular need to disambiguate against
somebody else's rpms since if you are merging someone else's changes you
would be doing it in git and not by intermixing rpms.

I think that distinguishing between local branches is not likely to be a prolem. 
  Most developers are likely to use only one for rpm construction, or if there 
is a second experimental branch, then it is likely to contain more-recent 
changes anyway.

So a count of minutes since last tag is probably sufficient.

This could have a hash appended if it is essential to make the rpm version 
unique without losing the ordering of the timestamp.

Something like:

	1.1.2_123456_g9e9b


John

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-14 15:39   ` John Ellson
@ 2006-01-14 17:53     ` Linus Torvalds
  2006-01-14 19:17     ` Junio C Hamano
  1 sibling, 0 replies; 11+ messages in thread
From: Linus Torvalds @ 2006-01-14 17:53 UTC (permalink / raw)
  To: John Ellson; +Cc: Junio C Hamano, git



On Sat, 14 Jan 2006, John Ellson wrote:
> 
> What happened to this?   I don't particularly like my fix either, but
> some kind of fix is needed for the "make rpm" target to work.  Its still
> broken because of the '-' in the version string.

Do a "sed" for rpmbuild.

There's absolutely no point in trying to make git-describe use "_" instead 
of "-", since having a "-" in a tag-name is very common ("my-version"), 
and it would be a horrible mistake to munge the tag-names. So even if we 
changed "-g" into "_g" it wouldn't help anything, and just make things 
uglier.

This is an RPM versioning problem, and nothing more. So it should be 
handled by rpmbuild.

		Linus

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-14 15:39   ` John Ellson
  2006-01-14 17:53     ` Linus Torvalds
@ 2006-01-14 19:17     ` Junio C Hamano
  2006-01-14 20:25       ` John Ellson
  1 sibling, 1 reply; 11+ messages in thread
From: Junio C Hamano @ 2006-01-14 19:17 UTC (permalink / raw)
  To: John Ellson; +Cc: git, Linus Torvalds

John Ellson <ellson@research.att.com> writes:

>> ...  In that
>> sense, maybe leaving the interim version unbuildable for binary
>> packaging might be considered a feature.
>
> What happened to this?

I consider leaving the interim version unbuildable for binary packaging
consider a feature.

If you want to build your own version, I think you could locally
tag that head and build, like:

	$ git tag -a "John's GIT 1.1.2+frotz patch" v1.1.2.John0114
	$ make rpmbuild

Of course you can keep a patch with the sed -e 's/-/_/' in
GIT-VERSION-GEN as Linus suggested in your development branch.
I am not yet convinced being able to build a random
unidentifiable binary package is a good thing, and "the number
of minutes/seconds monotonicity" would not work in multiple
branches case (i.e. still leaves the result unordered).

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-14 19:17     ` Junio C Hamano
@ 2006-01-14 20:25       ` John Ellson
  2006-01-14 20:35         ` Junio C Hamano
  2006-01-16  9:15         ` Junio C Hamano
  0 siblings, 2 replies; 11+ messages in thread
From: John Ellson @ 2006-01-14 20:25 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Linus Torvalds

Junio C Hamano wrote:
> John Ellson <ellson@research.att.com> writes:
>   
> I consider leaving the interim version unbuildable for binary packaging
> consider a feature.
>   
Not a very helpful feature IMO.    Who is protected by this?
> If you want to build your own version, I think you could locally
> tag that head and build, like:
>
> 	$ git tag -a "John's GIT 1.1.2+frotz patch" v1.1.2.John0114
> 	$ make rpmbuild
>
> Of course you can keep a patch with the sed -e 's/-/_/' in
> GIT-VERSION-GEN as Linus suggested in your development branch.
>   
Thats basically all I'm looking for.   I agree that is only necessary to 
fix the "make rpm" target.
Further changes are not strictly necessary.   I don't understand why it 
would only be useful to me?

> I am not yet convinced being able to build a random
> unidentifiable binary package is a good thing, and "the number
> of minutes/seconds monotonicity" would not work in multiple
> branches case (i.e. still leaves the result unordered).
>   
Since disparate branches are intrinsically unordered I was suggesting 
that the
hash field would be used to ensure uniqueness only.   The timestamp 
field is only for ordering within a branch.

So if someone builds rpms from two different branches, they might still 
have to force the particular
selection they want with "rpm -Uvh --oldpackage ...", but I think this 
is the best that can be done
in the absence of any intrinsic ordering.

Anyway, this is above and beyond doing something with sed to fix the '-' 
issue.

John
>
>
>   

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-14 20:25       ` John Ellson
@ 2006-01-14 20:35         ` Junio C Hamano
  2006-01-16  9:15         ` Junio C Hamano
  1 sibling, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2006-01-14 20:35 UTC (permalink / raw)
  To: John Ellson; +Cc: git, Linus Torvalds

John Ellson <ellson@research.att.com> writes:

> Anyway, this is above and beyond doing something with sed to
> fix the '-' issue.

What I am saying is that until that issue of ordering is
resolved (and I highly suspect it is unsolvable) I think it is
dangerous and more confusing to let binary packages be built,
and it is better to simply forbid it like in the current
scheme.

BTW, if we _were_ to do a sed, please do s/-/./g instead; the
underscore breaks Debian if I am not mistaken.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] rpmbuild doesn't like '-' in version strings
  2006-01-14 20:25       ` John Ellson
  2006-01-14 20:35         ` Junio C Hamano
@ 2006-01-16  9:15         ` Junio C Hamano
  1 sibling, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2006-01-16  9:15 UTC (permalink / raw)
  To: John Ellson; +Cc: git

John Ellson <ellson@research.att.com> writes:

>> Of course you can keep a patch with the sed -e 's/-/_/' in
>> GIT-VERSION-GEN as Linus suggested in your development branch.
>>
> Thats basically all I'm looking for.   I agree that is only necessary
> to fix the "make rpm" target.
> Further changes are not strictly necessary.   I don't understand why
> it would only be useful to me?

OK, if somebody is RPM savvy enough to do his own binary RPM and
install it, he would know how to override the downgrade guard
the binary package manager would give him, so it probably is not
such a big deal.  A patch to do "sed -e 's/-/./g'" will be
pushed out in the "master" branch shortly.

I hope if we later see complains on the list that some RPM cut
from an interim snapshot would not install, somebody would take
time to answer such complaints, pretty please?

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2006-01-16  9:16 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-30 17:29 [PATCH] rpmbuild doesn't like '-' in version strings John Ellson
2006-01-06 22:37 ` Junio C Hamano
2006-01-07  0:04   ` Andreas Ericsson
2006-01-07  0:47     ` Johannes Schindelin
2006-01-07  1:22   ` Ryan Anderson
2006-01-14 15:39   ` John Ellson
2006-01-14 17:53     ` Linus Torvalds
2006-01-14 19:17     ` Junio C Hamano
2006-01-14 20:25       ` John Ellson
2006-01-14 20:35         ` Junio C Hamano
2006-01-16  9:15         ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).