diff options
Diffstat (limited to 'bitbake')
-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') |