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

Mark Hatle mark.hatle at windriver.com
Wed Aug 28 15:32:08 UTC 2019


On 8/28/19 9:38 AM, Andrew Jeffery wrote:
> 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

Yes, that is the point.  Since it doesn't handle submodules, there it won't
recurse and you are fine.

For example:

SRC_URI =
"gitsm://github.com/bus1/dbus-broker;protocol=git;rev=fc874afa0992d0c75ec25acb43d344679f0ee7d2"

This will result in the following submodules:

> Submodule 'edgelet/hsm-sys/azure-iot-hsm-c/deps/azure-c-shared-utility' (https://github.com/Azure/azure-c-shared-utility.git) registered for path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared'
> Submodule 'edgelet/hsm-sys/azure-iot-hsm-c/deps/azure-utpm-c' (https://github.com/Azure/azure-utpm-c.git) registered for path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm'
> Submodule 'testtools/ctest' (https://github.com/Azure/azure-ctest.git) registered for path 'testtools/ctest'
> Submodule 'testtools/testrunner' (https://github.com/Azure/azure-c-testrunnerswitcher.git) registered for path 'testtools/testrunner'
> Submodule 'testtools/umock-c' (https://github.com/Azure/umock-c.git) registered for path 'testtools/umock-c'
> Submodule 'deps/azure-ctest' (https://github.com/Azure/azure-ctest.git) registered for path 'deps/ctest'
> Submodule 'deps/testrunner' (https://github.com/Azure/azure-c-testrunnerswitcher.git) registered for path 'deps/testrunner'
> Submodule 'deps/c-utility' (https://github.com/Azure/azure-c-shared-utility.git) registered for path 'deps/c-utility'
> Submodule 'testtools/ctest' (https://github.com/Azure/azure-ctest.git) registered for path 'testtools/ctest'
> Submodule 'testtools/testrunner' (https://github.com/Azure/azure-c-testrunnerswitcher.git) registered for path 'testtools/testrunner'
> Submodule 'testtools/umock-c' (https://github.com/Azure/umock-c.git) registered for path 'testtools/umock-c'
> Submodule 'deps/azure-ctest' (https://github.com/Azure/azure-ctest.git) registered for path 'deps/ctest'
> Submodule 'deps/testrunner' (https://github.com/Azure/azure-c-testrunnerswitcher.git) registered for path 'deps/testrunner'

With the following commits:

> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared': checked out '4deb950a4154e9baa39c87d75dd323dd58e239b7'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/ctest': checked out 'b1d09aff8212f1fb62ca9d6014cb3509d8b5559a'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/testrunner': checked out '721daafd8c34616f77a7697210470c0227dca20b'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c': checked out 'c2c0f18d785ba85fef213302266f520c64201bb1'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/ctest': checked out 'b1d09aff8212f1fb62ca9d6014cb3509d8b5559a'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/testrunner': checked out '721daafd8c34616f77a7697210470c0227dca20b'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm': checked out 'a82e758bfcea806167e19d9dd94c2e1cc223aaee'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility': checked out '4deb950a4154e9baa39c87d75dd323dd58e239b7'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/ctest': checked out 'b1d09aff8212f1fb62ca9d6014cb3509d8b5559a'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/testrunner': checked out '721daafd8c34616f77a7697210470c0227dca20b'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c': checked out 'c2c0f18d785ba85fef213302266f520c64201bb1'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/ctest': checked out 'b1d09aff8212f1fb62ca9d6014cb3509d8b5559a'
> Submodule path 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/testrunner': checked out '721daafd8c34616f77a7697210470c0227dca20b'

If we clone this WITHOUT gitsm, it would be done as, and only want a subset, we
could do:

> 
> SRC_URI = "git://github.com/bus1/dbus-broker;protocol=git;rev=fc874afa0992d0c75ec25acb43d344679f0ee7d2 \
>            git://github.com/Azure/azure-c-shared-utility.git;protocol=git;subpath=edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared;rev=4deb950a4154e9baa39c87d75dd323dd58e239b7 \
>            "


>> 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