Patchwork [2/2] classes/gitpkgv.bbclass: import from Meta-OE

login
register
mail settings
Submitter Otavio Salvador
Date Jan. 31, 2012, 2:10 a.m.
Message ID <d2dc84fee222915fee201ac867c00fda16b80284.1327975625.git.otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/20371/
State New
Headers show

Comments

Otavio Salvador - Jan. 31, 2012, 2:10 a.m.
It 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>".

The code has been imported from Meta-OE at revision
a76fff17ea8420686ef81b35f80efac1bef21649.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 meta/classes/gitpkgv.bbclass |   95 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 95 insertions(+), 0 deletions(-)
 create mode 100644 meta/classes/gitpkgv.bbclass
Richard Purdie - Feb. 1, 2012, 1:19 p.m.
On Tue, 2012-01-31 at 02:10 +0000, Otavio Salvador wrote:
> It 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>".
> 
> The code has been imported from Meta-OE at revision
> a76fff17ea8420686ef81b35f80efac1bef21649.
> 
> Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> ---
>  meta/classes/gitpkgv.bbclass |   95 ++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 95 insertions(+), 0 deletions(-)
>  create mode 100644 meta/classes/gitpkgv.bbclass

As discussed on IRC, I think some of the code here should really be
integrated into the bitbake git fetcher to ensure we have a
clean/consistent API for fetcher functionality. The interface I'm
thinking about would be similar to SRCPV:

SRCPV = "${@bb.fetch2.get_srcrev(d)}"

with a new fetcher call being added such as get_simplified_srcrev(d).
Switching between the simplified revision and the description could be
governed by a variable setting similar to some of the existing variables
that control fetcher behaviour.

There has been substantial work done to improve the fetcher APIs and
clean up the various corner cases and this would seem a logical
continuation of that, in keeping with the objectives of OE-Core.

Cheers,

Richard


> diff --git a/meta/classes/gitpkgv.bbclass b/meta/classes/gitpkgv.bbclass
> new file mode 100644
> index 0000000..238b0d2
> --- /dev/null
> +++ b/meta/classes/gitpkgv.bbclass
> @@ -0,0 +1,95 @@
> +# 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
> +
> +GITPKGV = "${@get_git_pkgv(d, False)}"
> +GITPKGVTAG = "${@get_git_pkgv(d, True)}"
> +
> +def gitpkgv_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
> +
> +    src_uri = bb.data.getVar('SRC_URI', d, 1).split()
> +    fetcher = bb.fetch2.Fetch(src_uri, d)
> +    ud = fetcher.ud
> +
> +    #
> +    # If SRCREV_FORMAT is set respect it for tags
> +    #
> +    format = bb.data.getVar('SRCREV_FORMAT', d, True)
> +    if not format:
> +        format = 'default'
> +
> +    found = False
> +    for url in ud.values():
> +        if url.type == 'git':
> +            for name, rev in url.revisions.items():
> +                if not os.path.exists(url.localpath):
> +                    return None
> +
> +                found = True
> +
> +                cwd = os.getcwd()
> +                os.chdir(url.localpath)
> +
> +                commits = bb.fetch2.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
> +
> +                if use_tags:
> +                    try:
> +                        output = bb.fetch2.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip()
> +                        ver = gitpkgv_drop_tag_prefix(output)
> +                    except Exception:
> +                        ver = "0.0-%s-g%s" % (commits, rev[:7])
> +                else:
> +                    ver = "%s+%s" % (commits, rev[:7])
> +
> +                os.chdir(cwd)
> +
> +                format = format.replace(name, ver)
> +
> +    if found:
> +        return format
> +
> +    return '0+0'
Otavio Salvador - Feb. 1, 2012, 6 p.m.
On Wed, Feb 1, 2012 at 11:19, Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> As discussed on IRC, I think some of the code here should really be
> integrated into the bitbake git fetcher to ensure we have a
> clean/consistent API for fetcher functionality. The interface I'm
> thinking about would be similar to SRCPV:
>
> SRCPV = "${@bb.fetch2.get_srcrev(d)}"
>
> with a new fetcher call being added such as get_simplified_srcrev(d).
> Switching between the simplified revision and the description could be
> governed by a variable setting similar to some of the existing variables
> that control fetcher behaviour.
>

I fully agree that having some of the code here ought to be in bitbake git
fetcher but I'd like to work on this after this code has been merge onto
OE-Core mostly because this will blocker on newer bitbake version
requirement and some layers are using it but now depending on meta-oe just
because of this class.


> There has been substantial work done to improve the fetcher APIs and
> clean up the various corner cases and this would seem a logical
> continuation of that, in keeping with the objectives of OE-Core.


Can this be merged and afterwareds I refactor it moving part of this code
onto bitbake? I am not used to bitbake code and I don't have enough time to
learn it in following week or so.

Patch

diff --git a/meta/classes/gitpkgv.bbclass b/meta/classes/gitpkgv.bbclass
new file mode 100644
index 0000000..238b0d2
--- /dev/null
+++ b/meta/classes/gitpkgv.bbclass
@@ -0,0 +1,95 @@ 
+# 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
+
+GITPKGV = "${@get_git_pkgv(d, False)}"
+GITPKGVTAG = "${@get_git_pkgv(d, True)}"
+
+def gitpkgv_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
+
+    src_uri = bb.data.getVar('SRC_URI', d, 1).split()
+    fetcher = bb.fetch2.Fetch(src_uri, d)
+    ud = fetcher.ud
+
+    #
+    # If SRCREV_FORMAT is set respect it for tags
+    #
+    format = bb.data.getVar('SRCREV_FORMAT', d, True)
+    if not format:
+        format = 'default'
+
+    found = False
+    for url in ud.values():
+        if url.type == 'git':
+            for name, rev in url.revisions.items():
+                if not os.path.exists(url.localpath):
+                    return None
+
+                found = True
+
+                cwd = os.getcwd()
+                os.chdir(url.localpath)
+
+                commits = bb.fetch2.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
+
+                if use_tags:
+                    try:
+                        output = bb.fetch2.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip()
+                        ver = gitpkgv_drop_tag_prefix(output)
+                    except Exception:
+                        ver = "0.0-%s-g%s" % (commits, rev[:7])
+                else:
+                    ver = "%s+%s" % (commits, rev[:7])
+
+                os.chdir(cwd)
+
+                format = format.replace(name, ver)
+
+    if found:
+        return format
+
+    return '0+0'