[bitbake-devel] [RESEND RFC PATCH] gitsm: Control submodule recursion

Andrew Jeffery andrew at aj.id.au
Wed Aug 28 14:38:25 UTC 2019


Hi Mark,

On Wed, 28 Aug 2019, at 23:30, Mark Hatle wrote:
> On 8/26/19 7:03 PM, Andrew Jeffery wrote:
> > 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.
> 
> I was thinking about this patch and I'm not sure it's needed.  There are ways to
> do this without using gitsm.
> 
> If you don't want recursion, then why are you specifying 'gitsm' at all? 

As far as I'm aware the git fetcher doesn't handle submodules at all. If I
have a misunderstanding there and this patch is unnecessary then that's
excellent, because I hate it :D

> The
> 'git' fetcher won't recurse and can be used to pull down a subset of what would
> have been a recursive fetch.  The 'subpath' parameter can even be used to
> combine the items in the same way as the gitsm fetcher if really needed.

Can you expand a bit more on how I'd do this (examples?), or point me in
the right direction with documentation? There don't appear to be any
pointers in the git:// fetcher section of the mega manual.

Just for clarity, the repository structure this patch is trying to cater for
looks like:

      +---->C
      |
      +---->D
      +
A+--->B+--->E
      +
      +---->F
      |
      +---->G

We have a recipe for A, whose repository has a submodule B, and B has
several submodules C, D, E, F, G. Repositories C-G are large and actually
irrelevant for the purpose of what we're doing in A, but the content of B
is required for A to build.

I hate the patch because the scenario seems like such a corner-case,
but here we are with a real-world use-case.

> 
> (A few more comments below, as more of a technical review)
> 
> > Signed-off-by: Andrew Jeffery <andrew at 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)
> 
> Above 'desired' is used, below 'scheme' is used.  You should use the same
> variable for both, and set it before the first 'if'.  To me 'scheme' is a better
> variable.

Yep, will address this if we go forward with the approach.

Thanks for the feedback!

Andrew


More information about the bitbake-devel mailing list