From 679bac4bf3622412c29e8bca506bc670224d2e31 Mon Sep 17 00:00:00 2001 From: Kevin Degi Date: Mon, 22 Jun 2015 15:31:26 -0600 Subject: [PATCH] project.RemoteFetch: Handle depth cases more robustly The fetch logic for the case where depth is set and revision is a SHA1 has several failure modes that are not handled well by the current logic. 1) 'git fetch ' requires git version >= 1.8.3 2) 'git fetch ' can be prevented by a configuration option on the server. 3) 'git fetch --depth= ' can fail to contain a SHA1 specified by the manifest. Each of these cases cause infinite recursion when _RemoteFetch() tries to call itself with current_branch_only=False because current_branch_only is set to True when depth != None. To try to prevent the infinite recursion, we set self.clone_depth to None before the first retry of _RemoteFetch(). This will allow the Fetch to eventually succeed in the case where clone-depth is specified in the manifest. A user specified depth from the init command will still recurse infinitely. In addition, never try to fetch a SHA1 directly if the git version being used is not at least 1.8.3. Change-Id: I802fc17878c0929cfd63fff611633c1d3b54ecd3 --- project.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/project.py b/project.py index 3f1e3b65..2f70e996 100644 --- a/project.py +++ b/project.py @@ -1897,7 +1897,7 @@ class Project(object): if not self.manifest.IsMirror: branch = self.revisionExpr - if is_sha1 and depth: + if is_sha1 and depth and git_require((1, 8, 3)): # Shallow checkout of a specific commit, fetch from that commit and not # the heads only as the commit might be deeper in the history. spec.append(branch) @@ -1960,8 +1960,15 @@ class Project(object): # got what we wanted, else trigger a second run of all # refs. if not self._CheckForSha1(): - return self._RemoteFetch(name=name, current_branch_only=False, - initial=False, quiet=quiet, alt_dir=alt_dir) + 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 + return self._RemoteFetch(name=name, current_branch_only=current_branch_only, + initial=False, quiet=quiet, alt_dir=alt_dir) return ok