diff options
| -rw-r--r-- | bitbake/lib/bb/fetch2/gitsm.py | 66 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/fetch.py | 10 |
2 files changed, 13 insertions, 63 deletions
diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py index c172ab1660..83571f834b 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py +++ b/bitbake/lib/bb/fetch2/gitsm.py | |||
| @@ -150,68 +150,7 @@ class GitSM(Git): | |||
| 150 | 150 | ||
| 151 | def download(self, ud, d): | 151 | def download(self, ud, d): |
| 152 | Git.download(self, ud, d) | 152 | Git.download(self, ud, d) |
| 153 | 153 | self.update_submodules(ud, d) | |
| 154 | if not ud.shallow or ud.localpath != ud.fullshallow: | ||
| 155 | self.update_submodules(ud, d) | ||
| 156 | |||
| 157 | def copy_submodules(self, submodules, ud, name, destdir, d): | ||
| 158 | if ud.bareclone: | ||
| 159 | repo_conf = destdir | ||
| 160 | else: | ||
| 161 | repo_conf = os.path.join(destdir, '.git') | ||
| 162 | |||
| 163 | if submodules and not os.path.exists(os.path.join(repo_conf, 'modules')): | ||
| 164 | os.mkdir(os.path.join(repo_conf, 'modules')) | ||
| 165 | |||
| 166 | for module, md in submodules.items(): | ||
| 167 | srcpath = os.path.join(ud.clonedir, 'modules', md['path']) | ||
| 168 | modpath = os.path.join(repo_conf, 'modules', md['path']) | ||
| 169 | |||
| 170 | # Check if the module is initialized | ||
| 171 | try: | ||
| 172 | module_hash = runfetchcmd("%s ls-tree -z -d %s %s" % (ud.basecmd, ud.revisions[name], md['path']), d, quiet=True, workdir=ud.clonedir) | ||
| 173 | except: | ||
| 174 | # If the command fails, we don't have a valid file to check. If it doesn't | ||
| 175 | # fail -- it still might be a failure, see next check... | ||
| 176 | module_hash = "" | ||
| 177 | |||
| 178 | if not module_hash: | ||
| 179 | logger.debug(1, "submodule %s is defined, but is not initialized in the repository. Skipping", module) | ||
| 180 | continue | ||
| 181 | |||
| 182 | if os.path.exists(srcpath): | ||
| 183 | if os.path.exists(os.path.join(srcpath, '.git')): | ||
| 184 | srcpath = os.path.join(srcpath, '.git') | ||
| 185 | |||
| 186 | target = modpath | ||
| 187 | if os.path.exists(modpath): | ||
| 188 | target = os.path.dirname(modpath) | ||
| 189 | |||
| 190 | os.makedirs(os.path.dirname(target), exist_ok=True) | ||
| 191 | runfetchcmd("cp -fpLR %s %s" % (srcpath, target), d) | ||
| 192 | elif os.path.exists(modpath): | ||
| 193 | # Module already exists, likely unpacked from a shallow mirror clone | ||
| 194 | pass | ||
| 195 | else: | ||
| 196 | # This is fatal, as we do NOT want git-submodule to hit the network | ||
| 197 | raise bb.fetch2.FetchError('Submodule %s does not exist in %s or %s.' % (module, srcpath, modpath)) | ||
| 198 | |||
| 199 | def clone_shallow_local(self, ud, dest, d): | ||
| 200 | super(GitSM, self).clone_shallow_local(ud, dest, d) | ||
| 201 | |||
| 202 | # Copy over the submodules' fetched histories too. | ||
| 203 | repo_conf = os.path.join(dest, '.git') | ||
| 204 | |||
| 205 | submodules = [] | ||
| 206 | for name in ud.names: | ||
| 207 | try: | ||
| 208 | gitmodules = runfetchcmd("%s show %s:.gitmodules" % (ud.basecmd, ud.revision), d, quiet=True, workdir=dest) | ||
| 209 | except: | ||
| 210 | # No submodules to update | ||
| 211 | continue | ||
| 212 | |||
| 213 | submodules = self.parse_gitmodules(gitmodules) | ||
| 214 | self.copy_submodules(submodules, ud, name, dest, d) | ||
| 215 | 154 | ||
| 216 | def unpack_submodules(self, repo_conf, ud, d): | 155 | def unpack_submodules(self, repo_conf, ud, d): |
| 217 | submodules = [] | 156 | submodules = [] |
| @@ -294,6 +233,9 @@ class GitSM(Git): | |||
| 294 | # Correct the submodule references to the local download version... | 233 | # Correct the submodule references to the local download version... |
| 295 | runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) | 234 | runfetchcmd("%(basecmd)s config submodule.%(module)s.url %(url)s" % {'basecmd': ud.basecmd, 'module': module, 'url' : local_paths[module]}, d, workdir=ud.destdir) |
| 296 | 235 | ||
| 236 | if ud.shallow: | ||
| 237 | runfetchcmd("%(basecmd)s config submodule.%(module)s.shallow true" % {'basecmd': ud.basecmd, 'module': module}, d, workdir=ud.destdir) | ||
| 238 | |||
| 297 | # Ensure the submodule repository is NOT set to bare, since we're checking it out... | 239 | # Ensure the submodule repository is NOT set to bare, since we're checking it out... |
| 298 | runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=os.path.join(repo_conf, 'modules', paths[module])) | 240 | runfetchcmd("%s config core.bare false" % (ud.basecmd), d, quiet=True, workdir=os.path.join(repo_conf, 'modules', paths[module])) |
| 299 | 241 | ||
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py index 311c70137e..5fb5d04cb0 100644 --- a/bitbake/lib/bb/tests/fetch.py +++ b/bitbake/lib/bb/tests/fetch.py | |||
| @@ -1316,6 +1316,7 @@ class GitShallowTest(FetcherTest): | |||
| 1316 | # fetch and unpack, from the shallow tarball | 1316 | # fetch and unpack, from the shallow tarball |
| 1317 | bb.utils.remove(self.gitdir, recurse=True) | 1317 | bb.utils.remove(self.gitdir, recurse=True) |
| 1318 | bb.utils.remove(ud.clonedir, recurse=True) | 1318 | bb.utils.remove(ud.clonedir, recurse=True) |
| 1319 | bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True) | ||
| 1319 | 1320 | ||
| 1320 | # confirm that the unpacked repo is used when no git clone or git | 1321 | # confirm that the unpacked repo is used when no git clone or git |
| 1321 | # mirror tarball is available | 1322 | # mirror tarball is available |
| @@ -1470,6 +1471,7 @@ class GitShallowTest(FetcherTest): | |||
| 1470 | self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir) | 1471 | self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir) |
| 1471 | self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir) | 1472 | self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir) |
| 1472 | self.add_empty_file('asub', cwd=smdir) | 1473 | self.add_empty_file('asub', cwd=smdir) |
| 1474 | self.add_empty_file('bsub', cwd=smdir) | ||
| 1473 | 1475 | ||
| 1474 | self.git('submodule init', cwd=self.srcdir) | 1476 | self.git('submodule init', cwd=self.srcdir) |
| 1475 | self.git('submodule add file://%s' % smdir, cwd=self.srcdir) | 1477 | self.git('submodule add file://%s' % smdir, cwd=self.srcdir) |
| @@ -1479,10 +1481,16 @@ class GitShallowTest(FetcherTest): | |||
| 1479 | uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir | 1481 | uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir |
| 1480 | fetcher, ud = self.fetch_shallow(uri) | 1482 | fetcher, ud = self.fetch_shallow(uri) |
| 1481 | 1483 | ||
| 1484 | # Verify the main repository is shallow | ||
| 1482 | self.assertRevCount(1) | 1485 | self.assertRevCount(1) |
| 1483 | assert './.git/modules/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0] | 1486 | |
| 1487 | # Verify the gitsubmodule directory is present | ||
| 1484 | assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule')) | 1488 | assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule')) |
| 1485 | 1489 | ||
| 1490 | # Verify the submodule is also shallow | ||
| 1491 | self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule')) | ||
| 1492 | |||
| 1493 | |||
| 1486 | if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')): | 1494 | if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')): |
| 1487 | def test_shallow_annex(self): | 1495 | def test_shallow_annex(self): |
| 1488 | self.add_empty_file('a') | 1496 | self.add_empty_file('a') |
