Subject: Re: [RFC/PATCH 4/3] Simplify naming (versioning) of non-release tig tarball and rpm file

From: Jakub Narebski <[email-masked]>
Date: Sun, 3 Jun 2007 23:12:59 +0200

On Sun, 3 Jun 2007, Jonas Fonseca wrote:
> Jakub Narebski <[email-masked]> wrote Sat, Jun 02, 2007:

>> 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.
 
>> 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