Patchwork classes/gitpkgv.bbclass: add GITPKGVTAG that uses 'git describe'

login
register
mail settings
Submitter Otavio Salvador
Date Dec. 16, 2010, 4:07 p.m.
Message ID <1292515657-15330-1-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/76/
State Accepted
Headers show

Comments

Otavio Salvador - Dec. 16, 2010, 4:07 p.m.
Using ${GITPKGVTAG} allows for automatic versioning based on the
repository tags. For those that doesn't want to use it, ${GITPKGV} is
still available.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 classes/gitpkgv.bbclass |   59 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 46 insertions(+), 13 deletions(-)
Martin Jansa - Dec. 16, 2010, 9:52 p.m.
On Thu, Dec 16, 2010 at 02:07:37PM -0200, Otavio Salvador wrote:
> Using ${GITPKGVTAG} allows for automatic versioning based on the
> repository tags. For those that doesn't want to use it, ${GITPKGV} is
> still available.

Thanks for merging it to one bbclass. IMHO looks much better now.
Consider providing examples and warning as suggested bellow.

> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>  classes/gitpkgv.bbclass |   59 ++++++++++++++++++++++++++++++++++++----------
>  1 files changed, 46 insertions(+), 13 deletions(-)
> 
> diff --git a/classes/gitpkgv.bbclass b/classes/gitpkgv.bbclass
> index bc1dc32..ebedcb7 100644
> --- a/classes/gitpkgv.bbclass
> +++ b/classes/gitpkgv.bbclass
> @@ -1,23 +1,46 @@
> -# gitpkgv.bbclass provides a GITPKGV variable which is a sortable version
> -# with the format NN+GITHASH, to be used in PKGV, where
> +# gitpkgv.bbclass provides a GITPKGV and GITPKGVTAG variables to be
> +# used in PKGV, as described bellow:
>  #
> -# NN equals the total number of revs up to SRCREV
> -# GITHASH is SRCREV's (full) hash
> +# - GITPKGV which is a sortable version with the format NN+GITHASH, to
> +#   be used in PKGV, where
>  #
> -# gitpkgv.bbclass assumes the git repository has been cloned, and contains
> -# SRCREV. So ${GITPKGV} should never be used in PV, only in PKGV.
> -# It can handle SRCREV = ${AUTOREV}, as well as SRCREV = "<some fixed git hash>"
> +#   NN equals the total number of revs up to SRCREV
> +#   GITHASH is SRCREV's (full) hash
> +#
> +# - GITPKGVTAG which is the output of 'git describe' allowing for
> +#   automatic versioning
> +#
> +# gitpkgv.bbclass assumes the git repository has been cloned, and
> +# contains SRCREV. So ${GITPKGV} and ${GITPKGVTAG} should never be
> +# used in PV, only in PKGV.  It can handle SRCREV = ${AUTOREV}, as
> +# well as SRCREV = "<some fixed git hash>"
>  #
>  # use example:
>  #
>  # inherit gitpkgv
>  #
> -# PV = "1.0+git${SRCPV}"
> -# PKGV = "1.0+git${GITPKGV}"
> +# PV = "1.0+gitr${SRCPV}"
> +# PKGV = "1.0+gitr${GITPKGV}"

# PV = "1.0+gitr${SRCPV}"      # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
# PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like 1.0+gitr31337+4c1c21d7dbbf93b0df336994524313dfe0d4963b

> +#
> +# or

As we were discussing with otavio on #oe, I think there should be
warning, that GITPKGVTAG is really sortable only if the upstream repo
keeps consistent AND sortable tag names.

For example tags in OE repo will fail, because only tested_2010-* tags
are sortable but this sequence:

tested_2010-11-04
release-2010.12-branchpoint
tested_2010-11-12

is not. And only way to fix it when it's shiped with non-standard tag to
targets is to bump PE :/.

Even better solution would be to set something like GITTAGFORMAT in
recipe, to expected consistent tag scheme and if returned git describe
prefix is different then warn builder about it or even fail or ignore
that tag.

Proposed "warning":

# or if upstream repository is always using consistent and sortable tag
# name scheme you can get sortable version including tag name with
# GITPKGVTAG, but be aware that ie tag sequence "v1.0, v1.2, xtest, v2.0"
# will force you to increment PE to get upgradeable path to v2.0 revisions

> +#
> +# inherit gitpkgv
> +#
> +# PV = "1.0+gitr${SRCPV}"
> +# PKGV = "${GITPKGVTAG}"

# PV = "1.0+gitr${SRCPV}" # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
# PKGV = "${GITPKGVTAG}"  # expands to something like 1.0-31337+g4c1c21d 
#                           if there is tag v1.0 before this revision or
#                           ver1.0-31337+g4c1c21d if there is tag ver1.0


>  
> -GITPKGV = "${@get_git_pkgv(d)}"
>  
> -def get_git_pkgv(d):
> +GITPKGV = "${@get_git_pkgv(d, False)}"
> +GITPKGVTAG = "${@get_git_pkgv(d, True)}"
> +
> +def git_drop_tag_prefix(version):
> +    import re
> +    if re.match("v\d", version):
> +        return version[1:]
> +    else:
> +        return version
> +
> +def get_git_pkgv(d, use_tags):
>  	import os
>  	import bb
>  
> @@ -33,9 +56,19 @@ def get_git_pkgv(d):
>  
>  			cwd = os.getcwd()
>  			os.chdir(repodir)
> -			output = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True)
> +
> +			commits = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
> +
> +			if use_tags:
> +				try:
> +					ver = git_drop_tag_prefix(bb.fetch.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip())
> +				except Exception:
> +					ver = "0.0-%s-g%s" % commits, rev[:7]
> +			else:
> +				ver = "%s+%s" % commits, rev[:7]
> +
>  			os.chdir(cwd)
>  
> -			return "%s+%s" % (output.split()[0], rev)
> +			return ver
>  
>  	return "0+0"
> -- 
> 1.7.3
> 
> 
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel
Otavio Salvador - Dec. 17, 2010, 11 a.m.
On Thu, Dec 16, 2010 at 19:52, Martin Jansa <martin.jansa@gmail.com> wrote:
> On Thu, Dec 16, 2010 at 02:07:37PM -0200, Otavio Salvador wrote:
>> Using ${GITPKGVTAG} allows for automatic versioning based on the
>> repository tags. For those that doesn't want to use it, ${GITPKGV} is
>> still available.
>
> Thanks for merging it to one bbclass. IMHO looks much better now.
> Consider providing examples and warning as suggested bellow.

You're welcome. Thanks for keep commenting on it and helping with good advices.

...
> # PV = "1.0+gitr${SRCPV}"      # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
> # PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like 1.0+gitr31337+4c1c21d7dbbf93b0df336994524313dfe0d4963b

added.

...
> As we were discussing with otavio on #oe, I think there should be
> warning, that GITPKGVTAG is really sortable only if the upstream repo
> keeps consistent AND sortable tag names.
>
> For example tags in OE repo will fail, because only tested_2010-* tags
> are sortable but this sequence:
>
> tested_2010-11-04
> release-2010.12-branchpoint
> tested_2010-11-12
>
> is not. And only way to fix it when it's shiped with non-standard tag to
> targets is to bump PE :/.

Yes. I fully agree that it is something the user of the class need to
be aware of.

> Even better solution would be to set something like GITTAGFORMAT in
> recipe, to expected consistent tag scheme and if returned git describe
> prefix is different then warn builder about it or even fail or ignore
> that tag.

I like the idea but I prefer to have this merged soon so I can started
using it (for example in freerdp package) and at company.

> Proposed "warning":
>
> # or if upstream repository is always using consistent and sortable tag
> # name scheme you can get sortable version including tag name with
> # GITPKGVTAG, but be aware that ie tag sequence "v1.0, v1.2, xtest, v2.0"
> # will force you to increment PE to get upgradeable path to v2.0 revisions

I added it as a warning on the comment.

The final header is:

# gitpkgv.bbclass provides a GITPKGV and GITPKGVTAG variables to be
# used in PKGV, as described bellow:
#
# - GITPKGV which is a sortable version with the format NN+GITHASH, to
#   be used in PKGV, where
#
#   NN equals the total number of revs up to SRCREV
#   GITHASH is SRCREV's (full) hash
#
# - GITPKGVTAG which is the output of 'git describe' allowing for
#   automatic versioning
#
# gitpkgv.bbclass assumes the git repository has been cloned, and
# contains SRCREV. So ${GITPKGV} and ${GITPKGVTAG} should never be
# used in PV, only in PKGV.  It can handle SRCREV = ${AUTOREV}, as
# well as SRCREV = "<some fixed git hash>".
#
# WARNING: if upstream repository is always using consistent and
# sortable tag name scheme you can get sortable version including tag
# name with ${GITPKGVTAG}, but be aware that ie tag sequence "v1.0,
# v1.2, xtest, v2.0" will force you to increment PE to get upgradeable
# path to v2.0 revisions
#
# use example:
#
# inherit gitpkgv
#
# PV = "1.0+gitr${SRCPV}"      # expands to something like
1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
# PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like
1.0+gitr31337+4c1c21d7d
#
# or
#
# inherit gitpkgv
#
# PV = "1.0+gitr${SRCPV}" # expands to something like
1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
# PKGV = "${GITPKGVTAG}"  # expands to something like 1.0-31337+g4c1c21d
#                           if there is tag v1.0 before this revision or
#                           ver1.0-31337+g4c1c21d if there is tag ver1.0

Does it seems good enough for pushing it?
Martin Jansa - Dec. 17, 2010, 11:29 a.m.
On Fri, Dec 17, 2010 at 09:00:41AM -0200, Otavio Salvador wrote:
> On Thu, Dec 16, 2010 at 19:52, Martin Jansa <martin.jansa@gmail.com> wrote:
> > On Thu, Dec 16, 2010 at 02:07:37PM -0200, Otavio Salvador wrote:
> >> Using ${GITPKGVTAG} allows for automatic versioning based on the
> >> repository tags. For those that doesn't want to use it, ${GITPKGV} is
> >> still available.
> >
> > Thanks for merging it to one bbclass. IMHO looks much better now.
> > Consider providing examples and warning as suggested bellow.
> 
> You're welcome. Thanks for keep commenting on it and helping with good advices.
> 
> ...
> > # PV = "1.0+gitr${SRCPV}"      # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
> > # PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like 1.0+gitr31337+4c1c21d7dbbf93b0df336994524313dfe0d4963b
> 
> added.
> 
> ...
> > As we were discussing with otavio on #oe, I think there should be
> > warning, that GITPKGVTAG is really sortable only if the upstream repo
> > keeps consistent AND sortable tag names.
> >
> > For example tags in OE repo will fail, because only tested_2010-* tags
> > are sortable but this sequence:
> >
> > tested_2010-11-04
> > release-2010.12-branchpoint
> > tested_2010-11-12
> >
> > is not. And only way to fix it when it's shiped with non-standard tag to
> > targets is to bump PE :/.
> 
> Yes. I fully agree that it is something the user of the class need to
> be aware of.
> 
> > Even better solution would be to set something like GITTAGFORMAT in
> > recipe, to expected consistent tag scheme and if returned git describe
> > prefix is different then warn builder about it or even fail or ignore
> > that tag.
> 
> I like the idea but I prefer to have this merged soon so I can started
> using it (for example in freerdp package) and at company.
> 
> > Proposed "warning":
> >
> > # or if upstream repository is always using consistent and sortable tag
> > # name scheme you can get sortable version including tag name with
> > # GITPKGVTAG, but be aware that ie tag sequence "v1.0, v1.2, xtest, v2.0"
> > # will force you to increment PE to get upgradeable path to v2.0 revisions
> 
> I added it as a warning on the comment.
> 
> The final header is:
> 
> # gitpkgv.bbclass provides a GITPKGV and GITPKGVTAG variables to be
> # used in PKGV, as described bellow:
> #
> # - GITPKGV which is a sortable version with the format NN+GITHASH, to
> #   be used in PKGV, where
> #
> #   NN equals the total number of revs up to SRCREV
> #   GITHASH is SRCREV's (full) hash
> #
> # - GITPKGVTAG which is the output of 'git describe' allowing for
> #   automatic versioning
> #
> # gitpkgv.bbclass assumes the git repository has been cloned, and
> # contains SRCREV. So ${GITPKGV} and ${GITPKGVTAG} should never be
> # used in PV, only in PKGV.  It can handle SRCREV = ${AUTOREV}, as
> # well as SRCREV = "<some fixed git hash>".
> #
> # WARNING: if upstream repository is always using consistent and
> # sortable tag name scheme you can get sortable version including tag
> # name with ${GITPKGVTAG}, but be aware that ie tag sequence "v1.0,
> # v1.2, xtest, v2.0" will force you to increment PE to get upgradeable
> # path to v2.0 revisions
> #
> # use example:
> #
> # inherit gitpkgv
> #
> # PV = "1.0+gitr${SRCPV}"      # expands to something like
> 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
> # PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like
> 1.0+gitr31337+4c1c21d7d
> #
> # or
> #
> # inherit gitpkgv
> #
> # PV = "1.0+gitr${SRCPV}" # expands to something like
> 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
> # PKGV = "${GITPKGVTAG}"  # expands to something like 1.0-31337+g4c1c21d
> #                           if there is tag v1.0 before this revision or
> #                           ver1.0-31337+g4c1c21d if there is tag ver1.0
> 
> Does it seems good enough for pushing it?

Yes

Acked-by: Martin Jansa <Martin.Jansa@gmail.com>

Patch

diff --git a/classes/gitpkgv.bbclass b/classes/gitpkgv.bbclass
index bc1dc32..ebedcb7 100644
--- a/classes/gitpkgv.bbclass
+++ b/classes/gitpkgv.bbclass
@@ -1,23 +1,46 @@ 
-# gitpkgv.bbclass provides a GITPKGV variable which is a sortable version
-# with the format NN+GITHASH, to be used in PKGV, where
+# gitpkgv.bbclass provides a GITPKGV and GITPKGVTAG variables to be
+# used in PKGV, as described bellow:
 #
-# NN equals the total number of revs up to SRCREV
-# GITHASH is SRCREV's (full) hash
+# - GITPKGV which is a sortable version with the format NN+GITHASH, to
+#   be used in PKGV, where
 #
-# gitpkgv.bbclass assumes the git repository has been cloned, and contains
-# SRCREV. So ${GITPKGV} should never be used in PV, only in PKGV.
-# It can handle SRCREV = ${AUTOREV}, as well as SRCREV = "<some fixed git hash>"
+#   NN equals the total number of revs up to SRCREV
+#   GITHASH is SRCREV's (full) hash
+#
+# - GITPKGVTAG which is the output of 'git describe' allowing for
+#   automatic versioning
+#
+# gitpkgv.bbclass assumes the git repository has been cloned, and
+# contains SRCREV. So ${GITPKGV} and ${GITPKGVTAG} should never be
+# used in PV, only in PKGV.  It can handle SRCREV = ${AUTOREV}, as
+# well as SRCREV = "<some fixed git hash>"
 #
 # use example:
 #
 # inherit gitpkgv
 #
-# PV = "1.0+git${SRCPV}"
-# PKGV = "1.0+git${GITPKGV}"
+# PV = "1.0+gitr${SRCPV}"
+# PKGV = "1.0+gitr${GITPKGV}"
+#
+# or
+#
+# inherit gitpkgv
+#
+# PV = "1.0+gitr${SRCPV}"
+# PKGV = "${GITPKGVTAG}"
 
-GITPKGV = "${@get_git_pkgv(d)}"
 
-def get_git_pkgv(d):
+GITPKGV = "${@get_git_pkgv(d, False)}"
+GITPKGVTAG = "${@get_git_pkgv(d, True)}"
+
+def git_drop_tag_prefix(version):
+    import re
+    if re.match("v\d", version):
+        return version[1:]
+    else:
+        return version
+
+def get_git_pkgv(d, use_tags):
 	import os
 	import bb
 
@@ -33,9 +56,19 @@  def get_git_pkgv(d):
 
 			cwd = os.getcwd()
 			os.chdir(repodir)
-			output = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True)
+
+			commits = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
+
+			if use_tags:
+				try:
+					ver = git_drop_tag_prefix(bb.fetch.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip())
+				except Exception:
+					ver = "0.0-%s-g%s" % commits, rev[:7]
+			else:
+				ver = "%s+%s" % commits, rev[:7]
+
 			os.chdir(cwd)
 
-			return "%s+%s" % (output.split()[0], rev)
+			return ver
 
 	return "0+0"