[gnome-continuous-yocto/gnomeostree-3.28-rocko: 6066/8267] bitbake: fetch/git: support per-branch/per-url depths for shallow



commit bf87c5cd194b5a24c388d6445b413b5f673bc1de
Author: Christopher Larson <kergoth gmail com>
Date:   Sat May 13 02:46:29 2017 +0500

    bitbake: fetch/git: support per-branch/per-url depths for shallow
    
    Allow the user to explicitly adjust the depth for named urls/branches. The
    un-suffixed BB_GIT_SHALLOW_DEPTH is used as the default.
    
    Example usage:
    
        BB_GIT_SHALLOW_DEPTH = "1"
        BB_GIT_SHALLOW_DEPTH_doc = "0"
        BB_GIT_SHALLOW_DEPTH_meta = "0"
    
    (Bitbake rev: 9dfc517e5bcc6dd203a0ad685cc884676d2984c4)
    
    Signed-off-by: Christopher Larson <chris_larson mentor com>
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/bb/fetch2/git.py  |   61 +++++++++++++++++++++++++++--------------
 bitbake/lib/bb/tests/fetch.py |   35 ++++++++++++++++++++++-
 2 files changed, 73 insertions(+), 23 deletions(-)
---
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
index 0412f9f..250109b 100644
--- a/bitbake/lib/bb/fetch2/git.py
+++ b/bitbake/lib/bb/fetch2/git.py
@@ -70,6 +70,7 @@ Supported SRC_URI options are:
 # with this program; if not, write to the Free Software Foundation, Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
+import collections
 import errno
 import os
 import re
@@ -178,12 +179,43 @@ class Git(FetchMethod):
         if ud.bareclone:
             ud.cloneflags += " --mirror"
 
+        ud.shallow = d.getVar("BB_GIT_SHALLOW") == "1"
+
+        depth_default = d.getVar("BB_GIT_SHALLOW_DEPTH")
+        if depth_default is not None:
+            try:
+                depth_default = int(depth_default or 0)
+            except ValueError:
+                raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % depth_default)
+            else:
+                if depth_default < 0:
+                    raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % depth_default)
+        else:
+            depth_default = 1
+        ud.shallow_depths = collections.defaultdict(lambda: depth_default)
+
         ud.branches = {}
         for pos, name in enumerate(ud.names):
             branch = branches[pos]
             ud.branches[name] = branch
             ud.unresolvedrev[name] = branch
 
+            shallow_depth = d.getVar("BB_GIT_SHALLOW_DEPTH_%s" % name)
+            if shallow_depth is not None:
+                try:
+                    shallow_depth = int(shallow_depth or 0)
+                except ValueError:
+                    raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH_%s: %s" % (name, 
shallow_depth))
+                else:
+                    if shallow_depth < 0:
+                        raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH_%s: %s" % (name, 
shallow_depth))
+                    ud.shallow_depths[name] = shallow_depth
+
+        if (ud.shallow and
+                all(ud.shallow_depths[n] == 0 for n in ud.names)):
+            # Shallow disabled for this URL
+            ud.shallow = False
+
         if ud.usehead:
             ud.unresolvedrev['default'] = 'HEAD'
 
@@ -222,23 +254,6 @@ class Git(FetchMethod):
         mirrortarball = 'git2_%s.tar.gz' % gitsrcname
         ud.fullmirror = os.path.join(dl_dir, mirrortarball)
         ud.mirrortarballs = [mirrortarball]
-
-        ud.shallow = d.getVar("BB_GIT_SHALLOW") == "1"
-        if ud.shallow:
-            ud.shallow_depth = d.getVar("BB_GIT_SHALLOW_DEPTH")
-            if ud.shallow_depth is not None:
-                try:
-                    ud.shallow_depth = int(ud.shallow_depth or 0)
-                except ValueError:
-                    raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % 
ud.shallow_depth)
-                else:
-                    if not ud.shallow_depth:
-                        ud.shallow = False
-                    elif ud.shallow_depth < 0:
-                        raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % 
ud.shallow_depth)
-            else:
-                ud.shallow_depth = 1
-
         if ud.shallow:
             tarballname = gitsrcname
             if ud.bareclone:
@@ -246,10 +261,12 @@ class Git(FetchMethod):
 
             for name, revision in sorted(ud.revisions.items()):
                 tarballname = "%s_%s" % (tarballname, ud.revisions[name][:7])
-                if not ud.nobranch:
-                    tarballname = "%s-%s" % (tarballname, ud.branches[name])
+                depth = ud.shallow_depths[name]
+                if depth:
+                    tarballname = "%s-%s" % (tarballname, depth)
 
-            tarballname = "%s-%s" % (tarballname, ud.shallow_depth)
+            if not ud.nobranch:
+                tarballname = "%s_%s" % (tarballname, "_".join(sorted(ud.branches.values())).replace('/', 
'.'))
 
             fetcher = self.__class__.__name__.lower()
             ud.shallowtarball = '%sshallow_%s.tar.gz' % (fetcher, tarballname)
@@ -370,7 +387,9 @@ class Git(FetchMethod):
         to_parse, shallow_branches = [], []
         for name in ud.names:
             revision = ud.revisions[name]
-            to_parse.append('%s~%d^{}' % (revision, ud.shallow_depth - 1))
+            depth = ud.shallow_depths[name]
+            if depth:
+                to_parse.append('%s~%d^{}' % (revision, depth - 1))
 
             # For nobranch, we need a ref, otherwise the commits will be
             # removed, and for non-nobranch, we truncate the branch to our
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py
index 019f22a..0b0116b 100644
--- a/bitbake/lib/bb/tests/fetch.py
+++ b/bitbake/lib/bb/tests/fetch.py
@@ -1122,6 +1122,27 @@ class GitShallowTest(FetcherTest):
         self.fetch_shallow(disabled=True)
         self.assertRevCount(2)
 
+    def test_shallow_depth_default_override(self):
+        self.add_empty_file('a')
+        self.add_empty_file('b')
+        self.assertRevCount(2, cwd=self.srcdir)
+
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
+        self.fetch_shallow()
+        self.assertRevCount(1)
+
+    def test_shallow_depth_default_override_disable(self):
+        self.add_empty_file('a')
+        self.add_empty_file('b')
+        self.add_empty_file('c')
+        self.assertRevCount(3, cwd=self.srcdir)
+
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
+        self.fetch_shallow()
+        self.assertRevCount(2)
+
     def test_current_shallow_out_of_date_clone(self):
         # Create initial git repo
         self.add_empty_file('a')
@@ -1206,13 +1227,15 @@ class GitShallowTest(FetcherTest):
         uri = self.d.getVar('SRC_URI', True).split()[0]
         uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
 
-        self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
         self.d.setVar('SRCREV_master', '${AUTOREV}')
         self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
 
         self.fetch_shallow(uri)
 
-        self.assertRevCount(3, ['--all'])
+        self.assertRevCount(4, ['--all'])
         self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
 
     def test_shallow_clone_preferred_over_shallow(self):
@@ -1262,6 +1285,14 @@ class GitShallowTest(FetcherTest):
         with self.assertRaises(bb.fetch2.FetchError):
             self.fetch()
 
+    def test_shallow_invalid_depth_default(self):
+        self.add_empty_file('a')
+        self.add_empty_file('b')
+
+        self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
+        with self.assertRaises(bb.fetch2.FetchError):
+            self.fetch()
+
     if os.environ.get("BB_SKIP_NETTESTS") == "yes":
         print("Unset BB_SKIP_NETTESTS to run network tests")
     else:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]