diff options
| -rw-r--r-- | manifest_xml.py | 4 | ||||
| -rw-r--r-- | project.py | 49 | ||||
| -rwxr-xr-x | repo | 3 | ||||
| -rw-r--r-- | subcmds/init.py | 10 | ||||
| -rw-r--r-- | subcmds/sync.py | 5 |
5 files changed, 59 insertions, 12 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index 0859e1fb..73e34964 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -393,6 +393,10 @@ class XmlManifest(object): | |||
| 393 | def IsArchive(self): | 393 | def IsArchive(self): |
| 394 | return self.manifestProject.config.GetBoolean('repo.archive') | 394 | return self.manifestProject.config.GetBoolean('repo.archive') |
| 395 | 395 | ||
| 396 | @property | ||
| 397 | def HasSubmodules(self): | ||
| 398 | return self.manifestProject.config.GetBoolean('repo.submodules') | ||
| 399 | |||
| 396 | def _Unload(self): | 400 | def _Unload(self): |
| 397 | self._loaded = False | 401 | self._loaded = False |
| 398 | self._projects = {} | 402 | self._projects = {} |
| @@ -1198,7 +1198,8 @@ class Project(object): | |||
| 1198 | no_tags=False, | 1198 | no_tags=False, |
| 1199 | archive=False, | 1199 | archive=False, |
| 1200 | optimized_fetch=False, | 1200 | optimized_fetch=False, |
| 1201 | prune=False): | 1201 | prune=False, |
| 1202 | submodules=False): | ||
| 1202 | """Perform only the network IO portion of the sync process. | 1203 | """Perform only the network IO portion of the sync process. |
| 1203 | Local working directory/branch state is not affected. | 1204 | Local working directory/branch state is not affected. |
| 1204 | """ | 1205 | """ |
| @@ -1275,7 +1276,8 @@ class Project(object): | |||
| 1275 | if (need_to_fetch and | 1276 | if (need_to_fetch and |
| 1276 | not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir, | 1277 | not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir, |
| 1277 | current_branch_only=current_branch_only, | 1278 | current_branch_only=current_branch_only, |
| 1278 | no_tags=no_tags, prune=prune, depth=depth)): | 1279 | no_tags=no_tags, prune=prune, depth=depth, |
| 1280 | submodules=submodules)): | ||
| 1279 | return False | 1281 | return False |
| 1280 | 1282 | ||
| 1281 | if self.worktree: | 1283 | if self.worktree: |
| @@ -1331,11 +1333,11 @@ class Project(object): | |||
| 1331 | raise ManifestInvalidRevisionError('revision %s in %s not found' % | 1333 | raise ManifestInvalidRevisionError('revision %s in %s not found' % |
| 1332 | (self.revisionExpr, self.name)) | 1334 | (self.revisionExpr, self.name)) |
| 1333 | 1335 | ||
| 1334 | def Sync_LocalHalf(self, syncbuf, force_sync=False): | 1336 | def Sync_LocalHalf(self, syncbuf, force_sync=False, submodules=False): |
| 1335 | """Perform only the local IO portion of the sync process. | 1337 | """Perform only the local IO portion of the sync process. |
| 1336 | Network access is not required. | 1338 | Network access is not required. |
| 1337 | """ | 1339 | """ |
| 1338 | self._InitWorkTree(force_sync=force_sync) | 1340 | self._InitWorkTree(force_sync=force_sync, submodules=submodules) |
| 1339 | all_refs = self.bare_ref.all | 1341 | all_refs = self.bare_ref.all |
| 1340 | self.CleanPublishedCache(all_refs) | 1342 | self.CleanPublishedCache(all_refs) |
| 1341 | revid = self.GetRevisionId(all_refs) | 1343 | revid = self.GetRevisionId(all_refs) |
| @@ -1344,6 +1346,9 @@ class Project(object): | |||
| 1344 | self._FastForward(revid) | 1346 | self._FastForward(revid) |
| 1345 | self._CopyAndLinkFiles() | 1347 | self._CopyAndLinkFiles() |
| 1346 | 1348 | ||
| 1349 | def _dosubmodules(): | ||
| 1350 | self._SyncSubmodules(quiet=True) | ||
| 1351 | |||
| 1347 | head = self.work_git.GetHead() | 1352 | head = self.work_git.GetHead() |
| 1348 | if head.startswith(R_HEADS): | 1353 | if head.startswith(R_HEADS): |
| 1349 | branch = head[len(R_HEADS):] | 1354 | branch = head[len(R_HEADS):] |
| @@ -1377,6 +1382,8 @@ class Project(object): | |||
| 1377 | 1382 | ||
| 1378 | try: | 1383 | try: |
| 1379 | self._Checkout(revid, quiet=True) | 1384 | self._Checkout(revid, quiet=True) |
| 1385 | if submodules: | ||
| 1386 | self._SyncSubmodules(quiet=True) | ||
| 1380 | except GitError as e: | 1387 | except GitError as e: |
| 1381 | syncbuf.fail(self, e) | 1388 | syncbuf.fail(self, e) |
| 1382 | return | 1389 | return |
| @@ -1401,6 +1408,8 @@ class Project(object): | |||
| 1401 | branch.name) | 1408 | branch.name) |
| 1402 | try: | 1409 | try: |
| 1403 | self._Checkout(revid, quiet=True) | 1410 | self._Checkout(revid, quiet=True) |
| 1411 | if submodules: | ||
| 1412 | self._SyncSubmodules(quiet=True) | ||
| 1404 | except GitError as e: | 1413 | except GitError as e: |
| 1405 | syncbuf.fail(self, e) | 1414 | syncbuf.fail(self, e) |
| 1406 | return | 1415 | return |
| @@ -1426,6 +1435,8 @@ class Project(object): | |||
| 1426 | # strict subset. We can fast-forward safely. | 1435 | # strict subset. We can fast-forward safely. |
| 1427 | # | 1436 | # |
| 1428 | syncbuf.later1(self, _doff) | 1437 | syncbuf.later1(self, _doff) |
| 1438 | if submodules: | ||
| 1439 | syncbuf.later1(self, _dosubmodules) | ||
| 1429 | return | 1440 | return |
| 1430 | 1441 | ||
| 1431 | # Examine the local commits not in the remote. Find the | 1442 | # Examine the local commits not in the remote. Find the |
| @@ -1477,19 +1488,28 @@ class Project(object): | |||
| 1477 | branch.Save() | 1488 | branch.Save() |
| 1478 | 1489 | ||
| 1479 | if cnt_mine > 0 and self.rebase: | 1490 | if cnt_mine > 0 and self.rebase: |
| 1491 | def _docopyandlink(): | ||
| 1492 | self._CopyAndLinkFiles() | ||
| 1493 | |||
| 1480 | def _dorebase(): | 1494 | def _dorebase(): |
| 1481 | self._Rebase(upstream='%s^1' % last_mine, onto=revid) | 1495 | self._Rebase(upstream='%s^1' % last_mine, onto=revid) |
| 1482 | self._CopyAndLinkFiles() | ||
| 1483 | syncbuf.later2(self, _dorebase) | 1496 | syncbuf.later2(self, _dorebase) |
| 1497 | if submodules: | ||
| 1498 | syncbuf.later2(self, _dosubmodules) | ||
| 1499 | syncbuf.later2(self, _docopyandlink) | ||
| 1484 | elif local_changes: | 1500 | elif local_changes: |
| 1485 | try: | 1501 | try: |
| 1486 | self._ResetHard(revid) | 1502 | self._ResetHard(revid) |
| 1503 | if submodules: | ||
| 1504 | self._SyncSubmodules(quiet=True) | ||
| 1487 | self._CopyAndLinkFiles() | 1505 | self._CopyAndLinkFiles() |
| 1488 | except GitError as e: | 1506 | except GitError as e: |
| 1489 | syncbuf.fail(self, e) | 1507 | syncbuf.fail(self, e) |
| 1490 | return | 1508 | return |
| 1491 | else: | 1509 | else: |
| 1492 | syncbuf.later1(self, _doff) | 1510 | syncbuf.later1(self, _doff) |
| 1511 | if submodules: | ||
| 1512 | syncbuf.later1(self, _dosubmodules) | ||
| 1493 | 1513 | ||
| 1494 | def AddCopyFile(self, src, dest, absdest): | 1514 | def AddCopyFile(self, src, dest, absdest): |
| 1495 | # dest should already be an absolute path, but src is project relative | 1515 | # dest should already be an absolute path, but src is project relative |
| @@ -1892,7 +1912,8 @@ class Project(object): | |||
| 1892 | alt_dir=None, | 1912 | alt_dir=None, |
| 1893 | no_tags=False, | 1913 | no_tags=False, |
| 1894 | prune=False, | 1914 | prune=False, |
| 1895 | depth=None): | 1915 | depth=None, |
| 1916 | submodules=False): | ||
| 1896 | 1917 | ||
| 1897 | is_sha1 = False | 1918 | is_sha1 = False |
| 1898 | tag_name = None | 1919 | tag_name = None |
| @@ -2004,6 +2025,9 @@ class Project(object): | |||
| 2004 | if prune: | 2025 | if prune: |
| 2005 | cmd.append('--prune') | 2026 | cmd.append('--prune') |
| 2006 | 2027 | ||
| 2028 | if submodules: | ||
| 2029 | cmd.append('--recurse-submodules=on-demand') | ||
| 2030 | |||
| 2007 | spec = [] | 2031 | spec = [] |
| 2008 | if not current_branch_only: | 2032 | if not current_branch_only: |
| 2009 | # Fetch whole repo | 2033 | # Fetch whole repo |
| @@ -2224,6 +2248,13 @@ class Project(object): | |||
| 2224 | if GitCommand(self, cmd).Wait() != 0: | 2248 | if GitCommand(self, cmd).Wait() != 0: |
| 2225 | raise GitError('%s reset --hard %s ' % (self.name, rev)) | 2249 | raise GitError('%s reset --hard %s ' % (self.name, rev)) |
| 2226 | 2250 | ||
| 2251 | def _SyncSubmodules(self, quiet=True): | ||
| 2252 | cmd = ['submodule', 'update', '--init', '--recursive'] | ||
| 2253 | if quiet: | ||
| 2254 | cmd.append('-q') | ||
| 2255 | if GitCommand(self, cmd).Wait() != 0: | ||
| 2256 | raise GitError('%s submodule update --init --recursive %s ' % self.name) | ||
| 2257 | |||
| 2227 | def _Rebase(self, upstream, onto=None): | 2258 | def _Rebase(self, upstream, onto=None): |
| 2228 | cmd = ['rebase'] | 2259 | cmd = ['rebase'] |
| 2229 | if onto is not None: | 2260 | if onto is not None: |
| @@ -2464,7 +2495,7 @@ class Project(object): | |||
| 2464 | else: | 2495 | else: |
| 2465 | raise | 2496 | raise |
| 2466 | 2497 | ||
| 2467 | def _InitWorkTree(self, force_sync=False): | 2498 | def _InitWorkTree(self, force_sync=False, submodules=False): |
| 2468 | dotgit = os.path.join(self.worktree, '.git') | 2499 | dotgit = os.path.join(self.worktree, '.git') |
| 2469 | init_dotgit = not os.path.exists(dotgit) | 2500 | init_dotgit = not os.path.exists(dotgit) |
| 2470 | try: | 2501 | try: |
| @@ -2479,7 +2510,7 @@ class Project(object): | |||
| 2479 | if force_sync: | 2510 | if force_sync: |
| 2480 | try: | 2511 | try: |
| 2481 | shutil.rmtree(dotgit) | 2512 | shutil.rmtree(dotgit) |
| 2482 | return self._InitWorkTree(force_sync=False) | 2513 | return self._InitWorkTree(force_sync=False, submodules=submodules) |
| 2483 | except: | 2514 | except: |
| 2484 | raise e | 2515 | raise e |
| 2485 | raise e | 2516 | raise e |
| @@ -2493,6 +2524,8 @@ class Project(object): | |||
| 2493 | if GitCommand(self, cmd).Wait() != 0: | 2524 | if GitCommand(self, cmd).Wait() != 0: |
| 2494 | raise GitError("cannot initialize work tree") | 2525 | raise GitError("cannot initialize work tree") |
| 2495 | 2526 | ||
| 2527 | if submodules: | ||
| 2528 | self._SyncSubmodules(quiet=True) | ||
| 2496 | self._CopyAndLinkFiles() | 2529 | self._CopyAndLinkFiles() |
| 2497 | except Exception: | 2530 | except Exception: |
| 2498 | if init_dotgit: | 2531 | if init_dotgit: |
| @@ -192,6 +192,9 @@ group.add_option('--archive', | |||
| 192 | dest='archive', action='store_true', | 192 | dest='archive', action='store_true', |
| 193 | help='checkout an archive instead of a git repository for ' | 193 | help='checkout an archive instead of a git repository for ' |
| 194 | 'each project. See git archive.') | 194 | 'each project. See git archive.') |
| 195 | group.add_option('--submodules', | ||
| 196 | dest='submodules', action='store_true', | ||
| 197 | help='sync any submodules associated with the manifest repo') | ||
| 195 | group.add_option('-g', '--groups', | 198 | group.add_option('-g', '--groups', |
| 196 | dest='groups', default='default', | 199 | dest='groups', default='default', |
| 197 | help='restrict manifest projects to ones with specified ' | 200 | help='restrict manifest projects to ones with specified ' |
diff --git a/subcmds/init.py b/subcmds/init.py index bb7187d7..b260ec0f 100644 --- a/subcmds/init.py +++ b/subcmds/init.py | |||
| @@ -111,6 +111,9 @@ to update the working directory files. | |||
| 111 | dest='archive', action='store_true', | 111 | dest='archive', action='store_true', |
| 112 | help='checkout an archive instead of a git repository for ' | 112 | help='checkout an archive instead of a git repository for ' |
| 113 | 'each project. See git archive.') | 113 | 'each project. See git archive.') |
| 114 | g.add_option('--submodules', | ||
| 115 | dest='submodules', action='store_true', | ||
| 116 | help='sync any submodules associated with the manifest repo') | ||
| 114 | g.add_option('-g', '--groups', | 117 | g.add_option('-g', '--groups', |
| 115 | dest='groups', default='default', | 118 | dest='groups', default='default', |
| 116 | help='restrict manifest projects to ones with specified ' | 119 | help='restrict manifest projects to ones with specified ' |
| @@ -236,10 +239,13 @@ to update the working directory files. | |||
| 236 | 'in another location.', file=sys.stderr) | 239 | 'in another location.', file=sys.stderr) |
| 237 | sys.exit(1) | 240 | sys.exit(1) |
| 238 | 241 | ||
| 242 | if opt.submodules: | ||
| 243 | m.config.SetString('repo.submodules', 'true') | ||
| 244 | |||
| 239 | if not m.Sync_NetworkHalf(is_new=is_new, quiet=opt.quiet, | 245 | if not m.Sync_NetworkHalf(is_new=is_new, quiet=opt.quiet, |
| 240 | clone_bundle=not opt.no_clone_bundle, | 246 | clone_bundle=not opt.no_clone_bundle, |
| 241 | current_branch_only=opt.current_branch_only, | 247 | current_branch_only=opt.current_branch_only, |
| 242 | no_tags=opt.no_tags): | 248 | no_tags=opt.no_tags, submodules=opt.submodules): |
| 243 | r = m.GetRemote(m.remote.name) | 249 | r = m.GetRemote(m.remote.name) |
| 244 | print('fatal: cannot obtain manifest %s' % r.url, file=sys.stderr) | 250 | print('fatal: cannot obtain manifest %s' % r.url, file=sys.stderr) |
| 245 | 251 | ||
| @@ -253,7 +259,7 @@ to update the working directory files. | |||
| 253 | m.MetaBranchSwitch() | 259 | m.MetaBranchSwitch() |
| 254 | 260 | ||
| 255 | syncbuf = SyncBuffer(m.config) | 261 | syncbuf = SyncBuffer(m.config) |
| 256 | m.Sync_LocalHalf(syncbuf) | 262 | m.Sync_LocalHalf(syncbuf, submodules=opt.submodules) |
| 257 | syncbuf.Finish() | 263 | syncbuf.Finish() |
| 258 | 264 | ||
| 259 | if is_new or m.CurrentBranch is None: | 265 | if is_new or m.CurrentBranch is None: |
diff --git a/subcmds/sync.py b/subcmds/sync.py index 8e8529ee..82056f33 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
| @@ -723,11 +723,12 @@ later is required to fix a server side protocol bug. | |||
| 723 | mp.Sync_NetworkHalf(quiet=opt.quiet, | 723 | mp.Sync_NetworkHalf(quiet=opt.quiet, |
| 724 | current_branch_only=opt.current_branch_only, | 724 | current_branch_only=opt.current_branch_only, |
| 725 | no_tags=opt.no_tags, | 725 | no_tags=opt.no_tags, |
| 726 | optimized_fetch=opt.optimized_fetch) | 726 | optimized_fetch=opt.optimized_fetch, |
| 727 | submodules=self.manifest.HasSubmodules) | ||
| 727 | 728 | ||
| 728 | if mp.HasChanges: | 729 | if mp.HasChanges: |
| 729 | syncbuf = SyncBuffer(mp.config) | 730 | syncbuf = SyncBuffer(mp.config) |
| 730 | mp.Sync_LocalHalf(syncbuf) | 731 | mp.Sync_LocalHalf(syncbuf, submodules=self.manifest.HasSubmodules) |
| 731 | if not syncbuf.Finish(): | 732 | if not syncbuf.Finish(): |
| 732 | sys.exit(1) | 733 | sys.exit(1) |
| 733 | self._ReloadManifest(manifest_name) | 734 | self._ReloadManifest(manifest_name) |
