diff options
| author | Mark Hatle <mark.hatle@windriver.com> | 2019-01-15 16:31:31 -0500 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-01-16 15:35:07 +0000 |
| commit | 566d31960cf1e86b7e1e6dc0272600d24b335134 (patch) | |
| tree | 1d0183e13419e8a4a515129d334c7da70aad60d0 | |
| parent | e5455662a9762fc2cb8859134d855413d84fd265 (diff) | |
| download | poky-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>
| -rw-r--r-- | bitbake/lib/bb/fetch2/gitsm.py | 32 |
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: |
