diff options
-rw-r--r-- | project.py | 55 | ||||
-rw-r--r-- | subcmds/sync.py | 12 |
2 files changed, 46 insertions, 21 deletions
@@ -36,7 +36,7 @@ except ImportError: | |||
36 | 36 | ||
37 | from color import Coloring | 37 | from color import Coloring |
38 | from git_command import GitCommand | 38 | from git_command import GitCommand |
39 | from git_config import GitConfig, IsId, GetSchemeFromUrl | 39 | from git_config import GitConfig, IsId, GetSchemeFromUrl, ID_RE |
40 | from error import DownloadError | 40 | from error import DownloadError |
41 | from error import GitError, HookError, ImportError, UploadError | 41 | from error import GitError, HookError, ImportError, UploadError |
42 | from error import ManifestInvalidRevisionError | 42 | from error import ManifestInvalidRevisionError |
@@ -900,7 +900,7 @@ class Project(object): | |||
900 | 900 | ||
901 | ## Sync ## | 901 | ## Sync ## |
902 | 902 | ||
903 | def Sync_NetworkHalf(self, quiet=False, is_new=None): | 903 | def Sync_NetworkHalf(self, quiet=False, is_new=None, current_branch_only=False): |
904 | """Perform only the network IO portion of the sync process. | 904 | """Perform only the network IO portion of the sync process. |
905 | Local working directory/branch state is not affected. | 905 | Local working directory/branch state is not affected. |
906 | """ | 906 | """ |
@@ -926,21 +926,10 @@ class Project(object): | |||
926 | if alt_dir is None and self._ApplyCloneBundle(initial=is_new, quiet=quiet): | 926 | if alt_dir is None and self._ApplyCloneBundle(initial=is_new, quiet=quiet): |
927 | is_new = False | 927 | is_new = False |
928 | 928 | ||
929 | if not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir): | 929 | if not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir, |
930 | current_branch_only=current_branch_only): | ||
930 | return False | 931 | return False |
931 | 932 | ||
932 | #Check that the requested ref was found after fetch | ||
933 | # | ||
934 | try: | ||
935 | self.GetRevisionId() | ||
936 | except ManifestInvalidRevisionError: | ||
937 | # if the ref is a tag. We can try fetching | ||
938 | # the tag manually as a last resort | ||
939 | # | ||
940 | rev = self.revisionExpr | ||
941 | if rev.startswith(R_TAGS): | ||
942 | self._RemoteFetch(None, rev[len(R_TAGS):], quiet=quiet) | ||
943 | |||
944 | if self.worktree: | 933 | if self.worktree: |
945 | self._InitMRef() | 934 | self._InitMRef() |
946 | else: | 935 | else: |
@@ -1335,10 +1324,30 @@ class Project(object): | |||
1335 | 1324 | ||
1336 | ## Direct Git Commands ## | 1325 | ## Direct Git Commands ## |
1337 | 1326 | ||
1338 | def _RemoteFetch(self, name=None, tag=None, | 1327 | def _RemoteFetch(self, name=None, |
1328 | current_branch_only=False, | ||
1339 | initial=False, | 1329 | initial=False, |
1340 | quiet=False, | 1330 | quiet=False, |
1341 | alt_dir=None): | 1331 | alt_dir=None): |
1332 | |||
1333 | is_sha1 = False | ||
1334 | tag_name = None | ||
1335 | |||
1336 | if current_branch_only: | ||
1337 | if ID_RE.match(self.revisionExpr) is not None: | ||
1338 | is_sha1 = True | ||
1339 | elif self.revisionExpr.startswith(R_TAGS): | ||
1340 | # this is a tag and its sha1 value should never change | ||
1341 | tag_name = self.revisionExpr[len(R_TAGS):] | ||
1342 | |||
1343 | if is_sha1 or tag_name is not None: | ||
1344 | try: | ||
1345 | self.GetRevisionId() | ||
1346 | return True | ||
1347 | except ManifestInvalidRevisionError: | ||
1348 | # There is no such persistent revision. We have to fetch it. | ||
1349 | pass | ||
1350 | |||
1342 | if not name: | 1351 | if not name: |
1343 | name = self.remote.name | 1352 | name = self.remote.name |
1344 | 1353 | ||
@@ -1401,9 +1410,19 @@ class Project(object): | |||
1401 | if not self.worktree: | 1410 | if not self.worktree: |
1402 | cmd.append('--update-head-ok') | 1411 | cmd.append('--update-head-ok') |
1403 | cmd.append(name) | 1412 | cmd.append(name) |
1404 | if tag is not None: | 1413 | |
1414 | if not current_branch_only or is_sha1: | ||
1415 | # Fetch whole repo | ||
1416 | cmd.append('--tags') | ||
1417 | cmd.append((u'+refs/heads/*:') + remote.ToLocal('refs/heads/*')) | ||
1418 | elif tag_name is not None: | ||
1405 | cmd.append('tag') | 1419 | cmd.append('tag') |
1406 | cmd.append(tag) | 1420 | cmd.append(tag_name) |
1421 | else: | ||
1422 | branch = self.revisionExpr | ||
1423 | if branch.startswith(R_HEADS): | ||
1424 | branch = branch[len(R_HEADS):] | ||
1425 | cmd.append((u'+refs/heads/%s:' % branch) + remote.ToLocal('refs/heads/%s' % branch)) | ||
1407 | 1426 | ||
1408 | ok = False | 1427 | ok = False |
1409 | for i in range(2): | 1428 | for i in range(2): |
diff --git a/subcmds/sync.py b/subcmds/sync.py index a3d06922..c5955a38 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
@@ -131,6 +131,9 @@ later is required to fix a server side protocol bug. | |||
131 | p.add_option('-d','--detach', | 131 | p.add_option('-d','--detach', |
132 | dest='detach_head', action='store_true', | 132 | dest='detach_head', action='store_true', |
133 | help='detach projects back to manifest revision') | 133 | help='detach projects back to manifest revision') |
134 | p.add_option('-c','--current-branch', | ||
135 | dest='current_branch_only', action='store_true', | ||
136 | help='fetch only current branch from server') | ||
134 | p.add_option('-q','--quiet', | 137 | p.add_option('-q','--quiet', |
135 | dest='quiet', action='store_true', | 138 | dest='quiet', action='store_true', |
136 | help='be more quiet') | 139 | help='be more quiet') |
@@ -179,7 +182,8 @@ later is required to fix a server side protocol bug. | |||
179 | # - We always make sure we unlock the lock if we locked it. | 182 | # - We always make sure we unlock the lock if we locked it. |
180 | try: | 183 | try: |
181 | try: | 184 | try: |
182 | success = project.Sync_NetworkHalf(quiet=opt.quiet) | 185 | success = project.Sync_NetworkHalf(quiet=opt.quiet, |
186 | current_branch_only=opt.current_branch_only) | ||
183 | 187 | ||
184 | # Lock around all the rest of the code, since printing, updating a set | 188 | # Lock around all the rest of the code, since printing, updating a set |
185 | # and Progress.update() are not thread safe. | 189 | # and Progress.update() are not thread safe. |
@@ -212,7 +216,8 @@ later is required to fix a server side protocol bug. | |||
212 | if self.jobs == 1: | 216 | if self.jobs == 1: |
213 | for project in projects: | 217 | for project in projects: |
214 | pm.update() | 218 | pm.update() |
215 | if project.Sync_NetworkHalf(quiet=opt.quiet): | 219 | if project.Sync_NetworkHalf(quiet=opt.quiet, |
220 | current_branch_only=opt.current_branch_only): | ||
216 | fetched.add(project.gitdir) | 221 | fetched.add(project.gitdir) |
217 | else: | 222 | else: |
218 | print >>sys.stderr, 'error: Cannot fetch %s' % project.name | 223 | print >>sys.stderr, 'error: Cannot fetch %s' % project.name |
@@ -388,7 +393,8 @@ uncommitted changes are present' % project.relpath | |||
388 | _PostRepoUpgrade(self.manifest) | 393 | _PostRepoUpgrade(self.manifest) |
389 | 394 | ||
390 | if not opt.local_only: | 395 | if not opt.local_only: |
391 | mp.Sync_NetworkHalf(quiet=opt.quiet) | 396 | mp.Sync_NetworkHalf(quiet=opt.quiet, |
397 | current_branch_only=opt.current_branch_only) | ||
392 | 398 | ||
393 | if mp.HasChanges: | 399 | if mp.HasChanges: |
394 | syncbuf = SyncBuffer(mp.config) | 400 | syncbuf = SyncBuffer(mp.config) |