From 06e1e02364a311ef566d1a94786ecade886a0daa Mon Sep 17 00:00:00 2001 From: Krzysztof Wesolowski Date: Wed, 23 Jul 2025 14:40:43 +0200 Subject: [PATCH] Fix shallow clones when upstream attribute is present The _CheckForImmutableRevision method was modified in commit 0e776a58 to include upstream branch validation for superproject scenarios. However, this change inadvertently broke shallow clones when both clone-depth and upstream attributes are specified in regular (non-superproject) manifests. Issue: When upstream is present, _CheckForImmutableRevision performs two additional checks: 1. git rev-list on the upstream reference 2. git merge-base --is-ancestor between revision and upstream In shallow clones, the upstream branch history may not be available locally, causing these checks to fail. This triggers the retry mechanism that removes depth limitations, effectively converting shallow clones to full clones, resulting in excessive disk usage. Fix: Make upstream validation conditional on superproject usage. This preserves the original superproject fix while restoring the method's original behavior for regular scenarios - checking only if the immutable revision (SHA1/tag) exists locally. Note: The SetRevisionId method from the same commit 0e776a58 is left unchanged as it only stores upstream information (no git operations), which is beneficial for preserving branch context for commands like 'repo start' without causing fetch-related issues. The fix ensures that manifests with both clone-depth and upstream work correctly in non-superproject scenarios, maintaining shallow clone efficiency and reducing disk usage. Bug: b/427093249 Change-Id: I00acd4c61b179cd2abf796c2fecb7a2f38016a18 --- project.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/project.py b/project.py index 84a5cdf6e..dfeb4568e 100644 --- a/project.py +++ b/project.py @@ -2415,7 +2415,11 @@ class Project: # throws an error. revs = [f"{self.revisionExpr}^0"] upstream_rev = None - if self.upstream: + + # Only check upstream when using superproject + # Commit 0e776a58 added checking upstream here for superproject + # scenarios, but it broke shallow clones and mirror usage + if self.upstream and self.use_superproject: upstream_rev = self.GetRemote().ToLocal(self.upstream) revs.append(upstream_rev) @@ -2427,7 +2431,9 @@ class Project: log_as_error=False, ) - if self.upstream: + # Only verify upstream relationship for superproject scenarios + # without affecting plain usage. + if self.upstream and self.use_superproject: self.bare_git.merge_base( "--is-ancestor", self.revisionExpr,