Re: [RFC/PATCH 4/3] Simplify naming (versioning) of non-release tig tarball and rpm file
- From
Jakub Narebski <jnareb@gmail.com>
- Date
- Jun 3, 2007, 21:12 UTC
- Message-ID
- <200706032312.59756.jnareb@gmail.com>
- In-Reply-To
- <20070603091126.GA1419@diku.dk>
On Sun, 3 Jun 2007, Jonas Fonseca wrote:
> Jakub Narebski <jnareb@gmail.com> wrote Sat, Jun 02, 2007:
Show 12 quoted lines
>> This is proposal to simplify naming of non-release tarballs and rpm file, >> both for tig and also for git itself. Instead of using whole git-describe >> output as version number in tarball/rpm name (BTW. it would be nice to >> have command line switch to git-describe which would return old output, >> without number of commits since given tag) use tag part as version number, >> and number of commits since (plus optional marking dirty) as release >> number. >> >> What do you think about this? > > I like the simpler and less confusing names. How about the simpler > version below?
This version would work for tig now, but is not very generic. See also comments below.
> BTW, I also added `make dist DIST_VERSION=X.Y` to make it easy to force > a version. I used it when building the documentation in the release > branch.
Nice idea.
Show 37 quoted lines
>> diff --git a/Makefile b/Makefile >> index b49d7f8..1e67586 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -17,7 +17,13 @@ ifdef DIST_VERSION >> VERSION = $(DIST_VERSION) >> endif >> >> -RPM_VERSION = $(subst -,.,$(VERSION)) >> +# $(GITDESC) looks like either x.y, or like x.y-z-g<sha1> >> +SPLIT_VERSION := $(shell echo $(GITDESC) | \ >> + sed -e 's/^\(.*\)-\([0-9]\+\)-\(g[0-9a-f]\+\)$$/\1 \2 \3/g') >> +RPM_VERSION = $(subst -,.,$(word 1,$(SPLIT_VERSION))) >> +RPM_RELEASE = $(strip \ >> + $(subst -,.,$(if $(word 2,$(SPLIT_VERSION)),\ >> + $(word 2,$(SPLIT_VERSION)),0)$(WTDIRTY))) >> >> LDLIBS = -lcurses >> CFLAGS = -Wall -O2 '-DVERSION="$(VERSION)"' > > diff --git a/Makefile b/Makefile > index 91cb097..622a916 100644 > --- a/Makefile > +++ b/Makefile > @@ -17,7 +17,11 @@ ifdef DIST_VERSION > VERSION = $(DIST_VERSION) > endif > > -RPM_VERSION = $(subst -,.,$(VERSION)) > +# Split the version "TAG-OFFSET-gSHA1-DIRTY" into "TAG OFFSET" > +# and append 0 as a fallback offset for "exact" tagged versions. > +RPM_VERLIST = $(filter-out g% dirty,$(subst -, ,$(VERSION))) 0 > +RPM_VERSION = $(word 1,$(RPM_VERLIST)) > +RPM_RELEASE = $(word 2,$(RPM_VERLIST))$(if $(WTDIRTY),.dirty) > > LDLIBS = -lcurses > CFLAGS = -Wall -O2
I'd like to note that I wanted to make _generic_ version of generating RPM_VERSION and RPM_RELEASE from the output of git-describe (also with marking that working directory was in dirty state). Your simpler version works for tags used in tig repository, but for example not necessarily so for git repository.
I assume that "version tags" are of the form
[<prefix>]<version>
where optional <prefix> is "v" for git and linux repositories, "tig-" for tig repository, "gitgui-" for git-gui repository. <version> starts with a number, and usually consists of numbers separated by dots, but it can contain also alphanumeric suffix, for example "-rc1", "-pre7", "b" (c.f. v0.99.9b tag in git repository), etc. I assume that <version> is the part that starts with the number.
This means that git-describe output is either of the form
[<prefix>]<version>
(if there is exact match), or of the form
[<prefix>]<version>-<number of additional commits>-g<abbreviated sha-1>
For exact match (release tarball) I'd like to have
RPM_VERSION = $(subst -,.,<version>) RPM_RELEASE = 0
and for non-exact match to have
RPM_VERSION = $(subst -,.,<version>) RPM_RELEASE = <number of additional commits>.g<abbreviated sha-1>
The "g<abbreviated sha-1>", which was missing from my (and yours) proposal is needed because we can have multiple branches, and the part before "-g<abbreviated sha-1>" could be the same for different commits (on different branches, e.g. 'master' and 'next').
For "make dist" run from a dirty tree we want to have ".dirty" suffix added to RPM_RELEASE.
Example: if git-describe returns v1.4.3-rc2-21-g0a7a9a1 in a dirty tree (with uncommitted changes) I'd like to have 1.4.3.rc2 as version number and 21.g0a7a9a1.dirty as release number, so tarball would be named git-1.4.3.rc2-21.g0a7a9a1.dirty.tar.gz
Now to the implementation. I wanted to do the above using only Makefile functions, if not for two complications. First I didn't know how to get second-to-last word, or how to remove last word from variable; trick with filter-out could work there. Second in generic version is quite hard to distinguish using only make functions between exact and non-exact match for arbitrary versioning (tagging versions) scheme.
P.S. Perhaps instead of RPM_VERSION we should (re)use DIST_VERSION, and instead of RPM_RELEASE use DIST_RELEASE?
-- Jakub Narebski Poland