summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
authorDavid Pursehouse <dpursehouse@collab.net>2017-05-27 04:24:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-05-27 04:24:58 +0000
commitfbcbcabe9879c5af5b9267bcdf30ee8939dfe9b1 (patch)
treecad44d0577c667f11e2f23432e79cddc54e7a31d /project.py
parent666debc5180f806cd31fa12b34a072e45f508e1a (diff)
parente4e94d26ae81dbc9eb6e2f345fac7cd8c533cb9a (diff)
downloadgit-repo-fbcbcabe9879c5af5b9267bcdf30ee8939dfe9b1.tar.gz
Merge "init: add --submodules to sync manifest submodules"
Diffstat (limited to 'project.py')
-rw-r--r--project.py49
1 files changed, 41 insertions, 8 deletions
diff --git a/project.py b/project.py
index ae771c42..ed5b0e6c 100644
--- a/project.py
+++ b/project.py
@@ -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
@@ -2006,6 +2027,9 @@ class Project(object):
2006 if prune: 2027 if prune:
2007 cmd.append('--prune') 2028 cmd.append('--prune')
2008 2029
2030 if submodules:
2031 cmd.append('--recurse-submodules=on-demand')
2032
2009 spec = [] 2033 spec = []
2010 if not current_branch_only: 2034 if not current_branch_only:
2011 # Fetch whole repo 2035 # Fetch whole repo
@@ -2226,6 +2250,13 @@ class Project(object):
2226 if GitCommand(self, cmd).Wait() != 0: 2250 if GitCommand(self, cmd).Wait() != 0:
2227 raise GitError('%s reset --hard %s ' % (self.name, rev)) 2251 raise GitError('%s reset --hard %s ' % (self.name, rev))
2228 2252
2253 def _SyncSubmodules(self, quiet=True):
2254 cmd = ['submodule', 'update', '--init', '--recursive']
2255 if quiet:
2256 cmd.append('-q')
2257 if GitCommand(self, cmd).Wait() != 0:
2258 raise GitError('%s submodule update --init --recursive %s ' % self.name)
2259
2229 def _Rebase(self, upstream, onto=None): 2260 def _Rebase(self, upstream, onto=None):
2230 cmd = ['rebase'] 2261 cmd = ['rebase']
2231 if onto is not None: 2262 if onto is not None:
@@ -2466,7 +2497,7 @@ class Project(object):
2466 else: 2497 else:
2467 raise 2498 raise
2468 2499
2469 def _InitWorkTree(self, force_sync=False): 2500 def _InitWorkTree(self, force_sync=False, submodules=False):
2470 dotgit = os.path.join(self.worktree, '.git') 2501 dotgit = os.path.join(self.worktree, '.git')
2471 init_dotgit = not os.path.exists(dotgit) 2502 init_dotgit = not os.path.exists(dotgit)
2472 try: 2503 try:
@@ -2481,7 +2512,7 @@ class Project(object):
2481 if force_sync: 2512 if force_sync:
2482 try: 2513 try:
2483 shutil.rmtree(dotgit) 2514 shutil.rmtree(dotgit)
2484 return self._InitWorkTree(force_sync=False) 2515 return self._InitWorkTree(force_sync=False, submodules=submodules)
2485 except: 2516 except:
2486 raise e 2517 raise e
2487 raise e 2518 raise e
@@ -2495,6 +2526,8 @@ class Project(object):
2495 if GitCommand(self, cmd).Wait() != 0: 2526 if GitCommand(self, cmd).Wait() != 0:
2496 raise GitError("cannot initialize work tree") 2527 raise GitError("cannot initialize work tree")
2497 2528
2529 if submodules:
2530 self._SyncSubmodules(quiet=True)
2498 self._CopyAndLinkFiles() 2531 self._CopyAndLinkFiles()
2499 except Exception: 2532 except Exception:
2500 if init_dotgit: 2533 if init_dotgit: