All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] gitsm: Control submodule recursion
@ 2019-08-26  3:25 Andrew Jeffery
  0 siblings, 0 replies; only message in thread
From: Andrew Jeffery @ 2019-08-26  3:25 UTC (permalink / raw)
  To: bitbake-devel; +Cc: bradleyb, ojayanth

There exist some use-cases where repositories related by submodules do
not require submodules be recursively initialised despite needing the
first layer of submodules to be fetched. Enable this usecase in gitsm by
implementing a `recurse=X` SRC_URI parameter. The current implementation
of the recurse parameter defaults to enabling exhaustive recursion to
match the current behaviour of gitsm, with the one alternative being no
recursion. Enough rope is provided to allow specific recursion depths to
be implemented if necessary via the same interface. Values currently
unsupported for the recurse parameter raise a ValueError to ensure
forward compatibility.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
 lib/bb/fetch2/gitsm.py | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)

diff --git a/lib/bb/fetch2/gitsm.py b/lib/bb/fetch2/gitsm.py
index c622771d21aa..5a8426b486e3 100644
--- a/lib/bb/fetch2/gitsm.py
+++ b/lib/bb/fetch2/gitsm.py
@@ -6,7 +6,15 @@ after cloning.
 
 SRC_URI = "gitsm://<see Git fetcher for syntax>"
 
-See the Git fetcher, git://, for usage documentation.
+Supported SRC_URI options are:
+
+- recurse
+    Control recursive nature of submodule initialisation.
+
+    The default value is -1, which will recursively initialise all submodules.
+    Set to 0 to disable recursiion.
+
+See the Git fetcher, git://, for further usage documentation.
 
 NOTE: Switching a SRC_URI from "git://" to "gitsm://" requires a clean of your recipe.
 
@@ -26,6 +34,15 @@ from   bb.fetch2 import logger
 from   bb.fetch2 import Fetch
 from   bb.fetch2 import BBFetchException
 
+def should_recurse(ud):
+    recurse = ud.parm.get("recurse", "-1")
+
+    # Change this condition if we end up supporting specific maximum depths
+    if recurse in ( "-1", "0" ):
+        return recurse == "-1"
+
+    raise ValueError("Recursion control value not supported: %s" % (recurse))
+
 class GitSM(Git):
     def supports(self, ud, d):
         """
@@ -95,25 +112,28 @@ class GitSM(Git):
         for module in submodules:
             # Translate the module url into a SRC_URI
 
+            recurse = should_recurse(ud)
             if "://" in uris[module]:
                 # Properly formated URL already
                 proto = uris[module].split(':', 1)[0]
-                url = uris[module].replace('%s:' % proto, 'gitsm:', 1)
+                desired = "gitsm:" if recurse else "git:"
+                url = uris[module].replace('%s:' % proto, desired, 1)
             else:
+                scheme = "gitsm://" if recurse else "git://"
                 if ":" in uris[module]:
                     # Most likely an SSH style reference
                     proto = "ssh"
                     if ":/" in uris[module]:
                         # Absolute reference, easy to convert..
-                        url = "gitsm://" + uris[module].replace(':/', '/', 1)
+                        url = scheme + uris[module].replace(':/', '/', 1)
                     else:
                         # Relative reference, no way to know if this is right!
                         logger.warning("Submodule included by %s refers to relative ssh reference %s.  References may fail if not absolute." % (ud.url, uris[module]))
-                        url = "gitsm://" + uris[module].replace(':', '/', 1)
+                        url = scheme + uris[module].replace(':', '/', 1)
                 else:
                     # This has to be a file reference
                     proto = "file"
-                    url = "gitsm://" + uris[module]
+                    url = scheme + uris[module]
 
             url += ';protocol=%s' % proto
             url += ";name=%s" % module
@@ -209,7 +229,9 @@ class GitSM(Git):
         ret = self.process_submodules(ud, ud.destdir, unpack_submodules, d)
 
         if not ud.bareclone and ret:
+            recurse = should_recurse(ud)
             # All submodules should already be downloaded and configured in the tree.  This simply sets
             # up the configuration and checks out the files.  The main project config should remain
             # unmodified, and no download from the internet should occur.
-            runfetchcmd("%s submodule update --recursive --no-fetch" % (ud.basecmd), d, quiet=True, workdir=ud.destdir)
+            runfetchcmd("%s submodule update %s --no-fetch" % (ud.basecmd, "--recursive" if recurse else ""),
+                        d, quiet=True, workdir=ud.destdir)
-- 
2.20.1



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-08-26  3:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-26  3:25 [RFC PATCH] gitsm: Control submodule recursion Andrew Jeffery

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.