diff options
Diffstat (limited to 'project.py')
| -rw-r--r-- | project.py | 59 |
1 files changed, 47 insertions, 12 deletions
| @@ -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 |
| @@ -1963,15 +1984,17 @@ class Project(object): | |||
| 1963 | ids.add(ref_id) | 1984 | ids.add(ref_id) |
| 1964 | tmp.add(r) | 1985 | tmp.add(r) |
| 1965 | 1986 | ||
| 1966 | tmp_packed = '' | 1987 | tmp_packed_lines = [] |
| 1967 | old_packed = '' | 1988 | old_packed_lines = [] |
| 1968 | 1989 | ||
| 1969 | for r in sorted(all_refs): | 1990 | for r in sorted(all_refs): |
| 1970 | line = '%s %s\n' % (all_refs[r], r) | 1991 | line = '%s %s\n' % (all_refs[r], r) |
| 1971 | tmp_packed += line | 1992 | tmp_packed_lines.append(line) |
| 1972 | if r not in tmp: | 1993 | if r not in tmp: |
| 1973 | old_packed += line | 1994 | old_packed_lines.append(line) |
| 1974 | 1995 | ||
| 1996 | tmp_packed = ''.join(tmp_packed_lines) | ||
| 1997 | old_packed = ''.join(old_packed_lines) | ||
| 1975 | _lwrite(packed_refs, tmp_packed) | 1998 | _lwrite(packed_refs, tmp_packed) |
| 1976 | else: | 1999 | else: |
| 1977 | alt_dir = None | 2000 | alt_dir = None |
| @@ -2004,6 +2027,9 @@ class Project(object): | |||
| 2004 | if prune: | 2027 | if prune: |
| 2005 | cmd.append('--prune') | 2028 | cmd.append('--prune') |
| 2006 | 2029 | ||
| 2030 | if submodules: | ||
| 2031 | cmd.append('--recurse-submodules=on-demand') | ||
| 2032 | |||
| 2007 | spec = [] | 2033 | spec = [] |
| 2008 | if not current_branch_only: | 2034 | if not current_branch_only: |
| 2009 | # Fetch whole repo | 2035 | # Fetch whole repo |
| @@ -2224,6 +2250,13 @@ class Project(object): | |||
| 2224 | if GitCommand(self, cmd).Wait() != 0: | 2250 | if GitCommand(self, cmd).Wait() != 0: |
| 2225 | raise GitError('%s reset --hard %s ' % (self.name, rev)) | 2251 | raise GitError('%s reset --hard %s ' % (self.name, rev)) |
| 2226 | 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 | |||
| 2227 | def _Rebase(self, upstream, onto=None): | 2260 | def _Rebase(self, upstream, onto=None): |
| 2228 | cmd = ['rebase'] | 2261 | cmd = ['rebase'] |
| 2229 | if onto is not None: | 2262 | if onto is not None: |
| @@ -2464,7 +2497,7 @@ class Project(object): | |||
| 2464 | else: | 2497 | else: |
| 2465 | raise | 2498 | raise |
| 2466 | 2499 | ||
| 2467 | def _InitWorkTree(self, force_sync=False): | 2500 | def _InitWorkTree(self, force_sync=False, submodules=False): |
| 2468 | dotgit = os.path.join(self.worktree, '.git') | 2501 | dotgit = os.path.join(self.worktree, '.git') |
| 2469 | init_dotgit = not os.path.exists(dotgit) | 2502 | init_dotgit = not os.path.exists(dotgit) |
| 2470 | try: | 2503 | try: |
| @@ -2479,7 +2512,7 @@ class Project(object): | |||
| 2479 | if force_sync: | 2512 | if force_sync: |
| 2480 | try: | 2513 | try: |
| 2481 | shutil.rmtree(dotgit) | 2514 | shutil.rmtree(dotgit) |
| 2482 | return self._InitWorkTree(force_sync=False) | 2515 | return self._InitWorkTree(force_sync=False, submodules=submodules) |
| 2483 | except: | 2516 | except: |
| 2484 | raise e | 2517 | raise e |
| 2485 | raise e | 2518 | raise e |
| @@ -2493,6 +2526,8 @@ class Project(object): | |||
| 2493 | if GitCommand(self, cmd).Wait() != 0: | 2526 | if GitCommand(self, cmd).Wait() != 0: |
| 2494 | raise GitError("cannot initialize work tree") | 2527 | raise GitError("cannot initialize work tree") |
| 2495 | 2528 | ||
| 2529 | if submodules: | ||
| 2530 | self._SyncSubmodules(quiet=True) | ||
| 2496 | self._CopyAndLinkFiles() | 2531 | self._CopyAndLinkFiles() |
| 2497 | except Exception: | 2532 | except Exception: |
| 2498 | if init_dotgit: | 2533 | if init_dotgit: |
