diff --git a/project.py b/project.py index 6217aec8..6112c404 100644 --- a/project.py +++ b/project.py @@ -529,7 +529,8 @@ class Project(object): upstream=None, parent=None, is_derived=False, - dest_branch=None): + dest_branch=None, + optimized_fetch=False): """Init a Project object. Args: @@ -551,6 +552,8 @@ class Project(object): is_derived: False if the project was explicitly defined in the manifest; True if the project is a discovered submodule. dest_branch: The branch to which to push changes for review by default. + optimized_fetch: If True, when a project is set to a sha1 revision, only + fetch from the remote if the sha1 is not present locally. """ self.manifest = manifest self.name = name @@ -579,6 +582,7 @@ class Project(object): self.upstream = upstream self.parent = parent self.is_derived = is_derived + self.optimized_fetch = optimized_fetch self.subprojects = [] self.snapshots = {} @@ -1060,7 +1064,8 @@ class Project(object): current_branch_only=False, clone_bundle=True, no_tags=False, - archive=False): + archive=False, + optimized_fetch=False): """Perform only the network IO portion of the sync process. Local working directory/branch state is not affected. """ @@ -1129,8 +1134,9 @@ class Project(object): elif self.manifest.default.sync_c: current_branch_only = True - has_sha1 = ID_RE.match(self.revisionExpr) and self._CheckForSha1() - if (not has_sha1 #Need to fetch since we don't already have this revision + need_to_fetch = not (optimized_fetch and \ + (ID_RE.match(self.revisionExpr) and self._CheckForSha1())) + if (need_to_fetch and not self._RemoteFetch(initial=is_new, quiet=quiet, alt_dir=alt_dir, current_branch_only=current_branch_only, no_tags=no_tags)): diff --git a/subcmds/sync.py b/subcmds/sync.py index 2bdab3a6..b4546c15 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -131,6 +131,10 @@ of a project from server. The -c/--current-branch option can be used to only fetch objects that are on the branch specified by a project's revision. +The --optimized-fetch option can be used to only fetch projects that +are fixed to a sha1 revision if the sha1 revision does not already +exist locally. + SSH Connections --------------- @@ -206,6 +210,9 @@ later is required to fix a server side protocol bug. p.add_option('--no-tags', dest='no_tags', action='store_true', help="don't fetch tags") + p.add_option('--optimized-fetch', + dest='optimized_fetch', action='store_true', + help='only fetch projects fixed to sha1 if revision does not exist locally') if show_smart: p.add_option('-s', '--smart-sync', dest='smart_sync', action='store_true', @@ -275,7 +282,8 @@ later is required to fix a server side protocol bug. quiet=opt.quiet, current_branch_only=opt.current_branch_only, clone_bundle=not opt.no_clone_bundle, - no_tags=opt.no_tags, archive=self.manifest.IsArchive) + no_tags=opt.no_tags, archive=self.manifest.IsArchive, + optimized_fetch=opt.optimized_fetch) self._fetch_times.Set(project, time.time() - start) # Lock around all the rest of the code, since printing, updating a set @@ -615,7 +623,8 @@ later is required to fix a server side protocol bug. if not opt.local_only: mp.Sync_NetworkHalf(quiet=opt.quiet, current_branch_only=opt.current_branch_only, - no_tags=opt.no_tags) + no_tags=opt.no_tags, + optimized_fetch=opt.optimized_fetch) if mp.HasChanges: syncbuf = SyncBuffer(mp.config)