summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
authorKrzysztof Wesolowski <krzysztof.wesolowski@volvocars.com>2025-07-23 14:40:43 +0200
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2025-08-05 08:28:37 -0700
commitd9cc0a15265299b6dcfc1d65f192fd14cfb17b02 (patch)
tree449d848155bde877400770981f2bce05c0528ecf /project.py
parent8c3585f367a7d09095a22565a44fa3b47f5b690c (diff)
downloadgit-repo-d9cc0a15265299b6dcfc1d65f192fd14cfb17b02.tar.gz
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 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/493883 Tested-by: Krzysztof Wesolowski <krzysztof.wesolowski@volvocars.com> Commit-Queue: Krzysztof Wesolowski <krzysztof.wesolowski@volvocars.com> Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Kamaljeet Maini <kamaljeet@google.com> Reviewed-by: Xin Li <delphij@google.com>
Diffstat (limited to 'project.py')
-rw-r--r--project.py8
1 files changed, 6 insertions, 2 deletions
diff --git a/project.py b/project.py
index 2badfb02..9bfd4827 100644
--- a/project.py
+++ b/project.py
@@ -2415,7 +2415,9 @@ class Project:
2415 # throws an error. 2415 # throws an error.
2416 revs = [f"{self.revisionExpr}^0"] 2416 revs = [f"{self.revisionExpr}^0"]
2417 upstream_rev = None 2417 upstream_rev = None
2418 if self.upstream: 2418
2419 # Only check upstream when using superproject.
2420 if self.upstream and self.use_superproject:
2419 upstream_rev = self.GetRemote().ToLocal(self.upstream) 2421 upstream_rev = self.GetRemote().ToLocal(self.upstream)
2420 revs.append(upstream_rev) 2422 revs.append(upstream_rev)
2421 2423
@@ -2427,7 +2429,9 @@ class Project:
2427 log_as_error=False, 2429 log_as_error=False,
2428 ) 2430 )
2429 2431
2430 if self.upstream: 2432 # Only verify upstream relationship for superproject scenarios
2433 # without affecting plain usage.
2434 if self.upstream and self.use_superproject:
2431 self.bare_git.merge_base( 2435 self.bare_git.merge_base(
2432 "--is-ancestor", 2436 "--is-ancestor",
2433 self.revisionExpr, 2437 self.revisionExpr,