summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/fetch2/gitsm.py
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@windriver.com>2019-01-15 16:31:31 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-01-16 15:35:07 +0000
commit566d31960cf1e86b7e1e6dc0272600d24b335134 (patch)
tree1d0183e13419e8a4a515129d334c7da70aad60d0 /bitbake/lib/bb/fetch2/gitsm.py
parente5455662a9762fc2cb8859134d855413d84fd265 (diff)
downloadpoky-566d31960cf1e86b7e1e6dc0272600d24b335134.tar.gz
bitbake: gitsm.py: Fix when a submodule is defined, but not initialized
It is possible for a submodule to be defined in the .gitmodules file, but never initialized in the repository itself. This shows itself when searching for the defined module hash you will get back a empty value. Similarly we need to identify and skip defined but not initialized submodules during the unpack stages as well. Thanks to raphael.lisicki@siemens.com for their help is figuring out how to resolve this issue. Additionally a problem was found where, while unlikely, it may be possible for the wrong revision to have been searched using ls-tree. This has been resolved in the update_submodules function by keeping the correct revision along with the submodule path. (Bitbake rev: 49e1ff920143dcd4e7f73933d7ab8a84b8ffa1a3) Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/fetch2/gitsm.py')
-rw-r--r--bitbake/lib/bb/fetch2/gitsm.py32
1 files changed, 28 insertions, 4 deletions
diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py
index 35729dbc0f..b7959ff5d1 100644
--- a/bitbake/lib/bb/fetch2/gitsm.py
+++ b/bitbake/lib/bb/fetch2/gitsm.py
@@ -64,6 +64,7 @@ class GitSM(Git):
64 def update_submodules(self, ud, d): 64 def update_submodules(self, ud, d):
65 submodules = [] 65 submodules = []
66 paths = {} 66 paths = {}
67 revision = {}
67 uris = {} 68 uris = {}
68 local_paths = {} 69 local_paths = {}
69 70
@@ -77,6 +78,7 @@ class GitSM(Git):
77 for m, md in self.parse_gitmodules(gitmodules).items(): 78 for m, md in self.parse_gitmodules(gitmodules).items():
78 submodules.append(m) 79 submodules.append(m)
79 paths[m] = md['path'] 80 paths[m] = md['path']
81 revision[m] = ud.revisions[name]
80 uris[m] = md['url'] 82 uris[m] = md['url']
81 if uris[m].startswith('..'): 83 if uris[m].startswith('..'):
82 newud = copy.copy(ud) 84 newud = copy.copy(ud)
@@ -84,7 +86,17 @@ class GitSM(Git):
84 uris[m] = Git._get_repo_url(self, newud) 86 uris[m] = Git._get_repo_url(self, newud)
85 87
86 for module in submodules: 88 for module in submodules:
87 module_hash = runfetchcmd("%s ls-tree -z -d %s %s" % (ud.basecmd, ud.revisions[name], paths[module]), d, quiet=True, workdir=ud.clonedir) 89 try:
90 module_hash = runfetchcmd("%s ls-tree -z -d %s %s" % (ud.basecmd, revision[module], paths[module]), d, quiet=True, workdir=ud.clonedir)
91 except:
92 # If the command fails, we don't have a valid file to check. If it doesn't
93 # fail -- it still might be a failure, see next check...
94 module_hash = ""
95
96 if not module_hash:
97 logger.debug(1, "submodule %s is defined, but is not initialized in the repository. Skipping", module)
98 continue
99
88 module_hash = module_hash.split()[2] 100 module_hash = module_hash.split()[2]
89 101
90 # Build new SRC_URI 102 # Build new SRC_URI
@@ -143,7 +155,7 @@ class GitSM(Git):
143 if not ud.shallow or ud.localpath != ud.fullshallow: 155 if not ud.shallow or ud.localpath != ud.fullshallow:
144 self.update_submodules(ud, d) 156 self.update_submodules(ud, d)
145 157
146 def copy_submodules(self, submodules, ud, destdir, d): 158 def copy_submodules(self, submodules, ud, name, destdir, d):
147 if ud.bareclone: 159 if ud.bareclone:
148 repo_conf = destdir 160 repo_conf = destdir
149 else: 161 else:
@@ -156,6 +168,18 @@ class GitSM(Git):
156 srcpath = os.path.join(ud.clonedir, 'modules', md['path']) 168 srcpath = os.path.join(ud.clonedir, 'modules', md['path'])
157 modpath = os.path.join(repo_conf, 'modules', md['path']) 169 modpath = os.path.join(repo_conf, 'modules', md['path'])
158 170
171 # Check if the module is initialized
172 try:
173 module_hash = runfetchcmd("%s ls-tree -z -d %s %s" % (ud.basecmd, ud.revisions[name], md['path']), d, quiet=True, workdir=ud.clonedir)
174 except:
175 # If the command fails, we don't have a valid file to check. If it doesn't
176 # fail -- it still might be a failure, see next check...
177 module_hash = ""
178
179 if not module_hash:
180 logger.debug(1, "submodule %s is defined, but is not initialized in the repository. Skipping", module)
181 continue
182
159 if os.path.exists(srcpath): 183 if os.path.exists(srcpath):
160 if os.path.exists(os.path.join(srcpath, '.git')): 184 if os.path.exists(os.path.join(srcpath, '.git')):
161 srcpath = os.path.join(srcpath, '.git') 185 srcpath = os.path.join(srcpath, '.git')
@@ -188,7 +212,7 @@ class GitSM(Git):
188 continue 212 continue
189 213
190 submodules = self.parse_gitmodules(gitmodules) 214 submodules = self.parse_gitmodules(gitmodules)
191 self.copy_submodules(submodules, ud, dest, d) 215 self.copy_submodules(submodules, ud, name, dest, d)
192 216
193 def unpack(self, ud, destdir, d): 217 def unpack(self, ud, destdir, d):
194 Git.unpack(self, ud, destdir, d) 218 Git.unpack(self, ud, destdir, d)
@@ -211,7 +235,7 @@ class GitSM(Git):
211 continue 235 continue
212 236
213 submodules = self.parse_gitmodules(gitmodules) 237 submodules = self.parse_gitmodules(gitmodules)
214 self.copy_submodules(submodules, ud, ud.destdir, d) 238 self.copy_submodules(submodules, ud, name, ud.destdir, d)
215 239
216 submodules_queue = [(module, os.path.join(repo_conf, 'modules', md['path'])) for module, md in submodules.items()] 240 submodules_queue = [(module, os.path.join(repo_conf, 'modules', md['path'])) for module, md in submodules.items()]
217 while len(submodules_queue) != 0: 241 while len(submodules_queue) != 0: