From 6c5944606af3c52626745b5256e9e5f0d5c362a2 Mon Sep 17 00:00:00 2001 From: Aymen Bouaziz Date: Tue, 25 Oct 2016 18:03:51 +0200 Subject: [PATCH] Fix checkout error when depth passed to repo init and revision is a sha1 Currently, if direct fetch of a sha1 is not supported by git server and depth option is used, we fallback on syncing the upstream branch by ignoring depth option. This fallback doesn't work in next 2 cases: (1) upstream attribute is not specified in manifest (2) depth option is passed to repo init command (not with clone-depth attribute in manifest) This commit do the following: - fixes (1) by updating condition used to apply fallback first we retry with depth set to None, then by syncing all branches - fixes (2) by passing depth as argument of _RemoteFetch() method thus, its value is not set again to depth value passed to repo init command when applying fallback Change-Id: Ifd6fffafc49ba229df624b0d7b64c83d47619d17 --- project.py | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/project.py b/project.py index 142258e4..cdb61c21 100644 --- a/project.py +++ b/project.py @@ -1258,13 +1258,18 @@ class Project(object): elif self.manifest.default.sync_c: current_branch_only = True + if self.clone_depth: + depth = self.clone_depth + else: + depth = self.manifest.manifestProject.config.GetString('repo.depth') + 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, prune=prune)): + no_tags=no_tags, prune=prune, depth=depth)): return False if self.worktree: @@ -1880,23 +1885,17 @@ class Project(object): quiet=False, alt_dir=None, no_tags=False, - prune=False): + prune=False, + depth=None): is_sha1 = False tag_name = None - depth = None - # The depth should not be used when fetching to a mirror because # it will result in a shallow repository that cannot be cloned or # fetched from. - if not self.manifest.IsMirror: - if self.clone_depth: - depth = self.clone_depth - else: - depth = self.manifest.manifestProject.config.GetString('repo.depth') - # The repo project should never be synced with partial depth - if self.relpath == '.repo/repo': - depth = None + # The repo project should also never be synced with partial depth. + if self.manifest.IsMirror or self.relpath == '.repo/repo': + depth = None if depth: current_branch_only = True @@ -2057,21 +2056,22 @@ class Project(object): os.remove(packed_refs) self.bare_git.pack_refs('--all', '--prune') - if is_sha1 and current_branch_only and self.upstream: + if is_sha1 and current_branch_only: # We just synced the upstream given branch; verify we # got what we wanted, else trigger a second run of all # refs. if not self._CheckForSha1(): - if not depth: - # Avoid infinite recursion when depth is True (since depth implies - # current_branch_only) - return self._RemoteFetch(name=name, current_branch_only=False, - initial=False, quiet=quiet, alt_dir=alt_dir) - if self.clone_depth: - self.clone_depth = None + if current_branch_only and depth: + # Sync the current branch only with depth set to None return self._RemoteFetch(name=name, current_branch_only=current_branch_only, - initial=False, quiet=quiet, alt_dir=alt_dir) + initial=False, quiet=quiet, alt_dir=alt_dir, + depth=None) + else: + # Avoid infinite recursion: sync all branches with depth set to None + return self._RemoteFetch(name=name, current_branch_only=False, + initial=False, quiet=quiet, alt_dir=alt_dir, + depth=None) return ok