[bitbake-devel,v1,RESEND,1/1] bitbake: fetch2/git: add SRC_URI option versiontag

Submitted by Pascal Huerst on Dec. 10, 2019, 8:28 a.m. | Patch ID: 167872

Details

Message ID 20191210082800.20779-2-pascal.huerst@gmail.com
State New
Headers show

Commit Message

Pascal Huerst Dec. 10, 2019, 8:28 a.m.
From: Pascal Huerst <pascal.huerst@gmail.com>

Use latest_versionstring() to find the latest tagged release for use with
AUTOREV. This can be useful, if you want to build the latest tagged release
instead of a branch. UPSTREAM_CHECK_GITTAGREGEX can be used to specify a
version format.

Signed-off-by: Pascal Huerst <pascal.huerst@gmail.com>
---
 bitbake/lib/bb/fetch2/git.py  | 24 ++++++++++++++++++++----
 bitbake/lib/bb/tests/fetch.py | 18 ++++++++++++++++++
 2 files changed, 38 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
index fa41b078f1..3091619475 100644
--- a/bitbake/lib/bb/fetch2/git.py
+++ b/bitbake/lib/bb/fetch2/git.py
@@ -47,6 +47,11 @@  Supported SRC_URI options are:
    referring to commit which is valid in tag instead of branch.
    The default is "0", set nobranch=1 if needed.
 
+- versiontag
+   Use latest_versionstring() to find the latest tagged release for use with
+   AUTOREV. Implies nobranch. Check UPSTREAM_CHECK_GITTAGREGEX on how to specify
+   your version format.
+
 - usehead
    For local git:// urls to use the current branch HEAD as the revision for use with
    AUTOREV. Implies nobranch.
@@ -150,6 +155,8 @@  class Git(FetchMethod):
 
         ud.nobranch = ud.parm.get("nobranch","0") == "1"
 
+        ud.versiontag = ud.parm.get("versiontag","0") == "1"
+
         # usehead implies nobranch
         ud.usehead = ud.parm.get("usehead","0") == "1"
         if ud.usehead:
@@ -161,9 +168,20 @@  class Git(FetchMethod):
         ud.bareclone = ud.parm.get("bareclone","0") == "1"
         if ud.bareclone:
             ud.nocheckout = 1
-  
+
+        # versiontag implies nobranch
+        if ud.versiontag:
+            ud.nobranch = 1
+
+        ud.basecmd = d.getVar("FETCHCMD_git") or "git -c core.fsyncobjectfiles=0"
+
         ud.unresolvedrev = {}
         branches = ud.parm.get("branch", "master").split(',')
+
+        if ud.versiontag:
+            upversion, revision = self.latest_versionstring(ud, d)
+            d.setVar("SRCREV", revision)
+
         if len(branches) != len(ud.names):
             raise bb.fetch2.ParameterError("The number of name and branch parameters is not balanced", ud.url)
 
@@ -221,8 +239,6 @@  class Git(FetchMethod):
         if ud.usehead:
             ud.unresolvedrev['default'] = 'HEAD'
 
-        ud.basecmd = d.getVar("FETCHCMD_git") or "git -c core.fsyncobjectfiles=0"
-
         write_tarballs = d.getVar("BB_GENERATE_MIRROR_TARBALLS") or "0"
         ud.write_tarballs = write_tarballs != "0" or ud.rebaseable
         ud.write_shallow_tarballs = (d.getVar("BB_GENERATE_SHALLOW_TARBALLS") or write_tarballs) != "0"
@@ -674,7 +690,7 @@  class Git(FetchMethod):
             if tag == None:
                 continue
 
-            tag = tag.group('pver')
+            tag = tag.group(0)
             tag = tag.replace("_", ".")
 
             if verstring and bb.utils.vercmp(("0", tag, ""), ("0", verstring, "")) < 0:
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py
index 83fad3ff0d..175f0abd61 100644
--- a/bitbake/lib/bb/tests/fetch.py
+++ b/bitbake/lib/bb/tests/fetch.py
@@ -996,6 +996,24 @@  class FetcherNetworkTest(FetcherTest):
         self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/ctest/README.md')), msg='Missing submodule checkout')
         self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/testrunner/readme.md')), msg='Missing submodule checkout')
 
+    @skipIfNoNetwork()
+    def test_git_versiontag(self):
+        """ If versiontag is set in SRC_URI, it should fetch the latest release tag, using UPSTREAM_CHECK_GITTAGREGEX. If unset, standard format vX.X.X is used"""
+
+        url = "git://git.yoctoproject.org/git/poky;protocol=https;versiontag=1"
+
+        self.d.setVar('SRCREV', '${AUTOREV}')
+        self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
+        self.d.setVar('UPSTREAM_CHECK_GITTAGREGEX', "([a-z]+)-([0-9]+).([0-9]+).([0-9]+)")
+
+        fetcher = bb.fetch.Fetch([url], self.d)
+        fetcher.download()
+
+        os.chdir(os.path.dirname(self.unpackdir))
+        fetcher.unpack(self.unpackdir)
+
+        repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
+
 class SVNTest(FetcherTest):
     def skipIfNoSvn():
         import shutil