aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bonnans <laurent.bonnans@here.com>2018-10-01 16:52:14 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-10-04 14:33:53 +0100
commit377ed943357b6d47d41d84edbf971741f44affa9 (patch)
tree46db6326e3ef6209c907c0ee0cc1b5345476f2f9
parent3dbc84e9c572f43209b79f3656d7dc35a6d982ba (diff)
downloadbitbake-377ed943357b6d47d41d84edbf971741f44affa9.tar.gz
fetch2/gitsm: checkout submodules recursively
The new fetcher did not run 'git submodule update' recursively. Signed-off-by: Laurent Bonnans <laurent.bonnans@here.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/fetch2/gitsm.py68
1 files changed, 38 insertions, 30 deletions
diff --git a/lib/bb/fetch2/gitsm.py b/lib/bb/fetch2/gitsm.py
index fd5089c07..4d3805a11 100644
--- a/lib/bb/fetch2/gitsm.py
+++ b/lib/bb/fetch2/gitsm.py
@@ -44,6 +44,22 @@ class GitSM(Git):
"""
return ud.type in ['gitsm']
+ @staticmethod
+ def parse_gitmodules(gitmodules):
+ modules = {}
+ module = ""
+ for line in gitmodules.splitlines():
+ if line.startswith('[submodule'):
+ module = line.split('"')[1]
+ modules[module] = {}
+ elif module and line.strip().startswith('path'):
+ path = line.split('=')[1].strip()
+ modules[module]['path'] = path
+ elif module and line.strip().startswith('url'):
+ url = line.split('=')[1].strip()
+ modules[module]['url'] = url
+ return modules
+
def update_submodules(self, ud, d):
submodules = []
paths = {}
@@ -57,17 +73,10 @@ class GitSM(Git):
# No submodules to update
continue
- module = ""
- for line in gitmodules.splitlines():
- if line.startswith('[submodule'):
- module = line.split('"')[1]
- submodules.append(module)
- elif module and line.strip().startswith('path'):
- path = line.split('=')[1].strip()
- paths[module] = path
- elif module and line.strip().startswith('url'):
- url = line.split('=')[1].strip()
- uris[module] = url
+ for m, md in self.parse_gitmodules(gitmodules).items():
+ submodules.append(m)
+ paths[m] = md['path']
+ uris[m] = md['url']
for module in submodules:
module_hash = runfetchcmd("%s ls-tree -z -d %s %s" % (ud.basecmd, ud.revisions[name], paths[module]), d, quiet=True, workdir=ud.clonedir)
@@ -173,10 +182,7 @@ class GitSM(Git):
# No submodules to update
continue
- for line in gitmodules.splitlines():
- if line.startswith('[submodule'):
- module = line.split('"')[1]
- submodules.append(module)
+ submodules = list(self.parse_gitmodules(gitmodules).keys())
self.copy_submodules(submodules, ud, dest, d)
@@ -200,23 +206,25 @@ class GitSM(Git):
# No submodules to update
continue
- module = ""
- for line in gitmodules.splitlines():
- if line.startswith('[submodule'):
- module = line.split('"')[1]
- submodules.append(module)
- elif module and line.strip().startswith('path'):
- path = line.split('=')[1].strip()
- paths[module] = path
- elif module and line.strip().startswith('url'):
- url = line.split('=')[1].strip()
- uris[module] = url
+ for m, md in self.parse_gitmodules(gitmodules).items():
+ submodules.append(m)
+ paths[m] = md['path']
+ uris[m] = md['url']
self.copy_submodules(submodules, ud, ud.destdir, d)
- for module in submodules:
- srcpath = os.path.join(ud.clonedir, 'modules', module)
- modpath = os.path.join(repo_conf, 'modules', module)
+ submodules_queue = [(module, os.path.join(repo_conf, 'modules', module)) for module in submodules]
+ while len(submodules_queue) != 0:
+ module, modpath = submodules_queue.pop()
+
+ # add submodule children recursively
+ try:
+ gitmodules = runfetchcmd("%s show HEAD:.gitmodules" % (ud.basecmd), d, quiet=True, workdir=modpath)
+ for m, md in self.parse_gitmodules(gitmodules).items():
+ submodules_queue.append([m, os.path.join(modpath, 'modules', m)])
+ except:
+ # no children
+ pass
# Determine (from the submodule) the correct url to reference
try:
@@ -235,4 +243,4 @@ class GitSM(Git):
if submodules:
# Run submodule update, this sets up the directories -- without touching the config
- runfetchcmd("%s submodule update --no-fetch" % (ud.basecmd), d, quiet=True, workdir=ud.destdir)
+ runfetchcmd("%s submodule update --recursive --no-fetch" % (ud.basecmd), d, quiet=True, workdir=ud.destdir)