command: Respect smart sync override declaratively by default

Introduce a `RESPECT_SMART_SYNC_OVERRIDE` class attribute to the base
`Command` class, defaulting to `True`. This allows subcommands to
automatically respect the smart sync override manifest if it exists.

The override is applied in `CommonValidateOptions` before any
subcommand-specific validation or execution occurs. The `sync` and
`init` commands explicitly opt out.

This ensures all workspace-aware subcommands consistently align with the
active smart sync override manifest. It also fixes a bug in
multi-manifest setups where running a command from a submanifest would
not apply the override to the outer manifest, causing inconsistency when
resolving projects across all manifests.

Bug: 279204331
Change-Id: I9426e90a13a77ce6bd94b4a82efda4d485cbe116
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/585081
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
This commit is contained in:
Gavin Mak
2026-05-19 02:07:33 +00:00
committed by gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 54fa31cd84
commit 4bec297eb6
8 changed files with 13 additions and 7 deletions
+10
View File
@@ -66,6 +66,10 @@ class Command:
# command to show short-vs-full summaries.
COMMON = False
# Whether this command should respect the smart sync override manifest if
# it exists.
RESPECT_SMART_SYNC_OVERRIDE = True
# Whether this command supports running in parallel. If greater than 0,
# it is the number of parallel jobs to default to.
PARALLEL_JOBS = None
@@ -247,6 +251,12 @@ class Command:
# from the user's perspective.
opt.outer_manifest = True
if self.RESPECT_SMART_SYNC_OVERRIDE:
if self.manifest:
self.TryOverrideManifestWithSmartSync(self.manifest)
if self.outer_manifest and self.outer_manifest != self.manifest:
self.TryOverrideManifestWithSmartSync(self.outer_manifest)
def ValidateOptions(self, opt, args):
"""Validate the user options & arguments before executing.
-1
View File
@@ -94,7 +94,6 @@ It is equivalent to "git branch -D <branchname>".
def Execute(self, opt, args):
nb = args[0].split()
self.TryOverrideManifestWithSmartSync()
err = collections.defaultdict(list)
success = collections.defaultdict(list)
aggregate_errors = []
-2
View File
@@ -243,8 +243,6 @@ without iterating through the remaining projects.
mirror = self.manifest.IsMirror
self.TryOverrideManifestWithSmartSync()
if opt.regex:
projects = self.FindProjects(args, all_manifests=all_trees)
elif opt.inverse_regex:
-2
View File
@@ -147,8 +147,6 @@ class Info(PagedCommand):
if not opt.this_manifest_only:
self.manifest = self.manifest.outer_client
self.TryOverrideManifestWithSmartSync()
output_format = OutputFormat[opt.format.upper()]
if output_format == OutputFormat.JSON:
self._ExecuteJson(opt, args)
+1
View File
@@ -33,6 +33,7 @@ _REPO_ALLOW_SHALLOW = os.environ.get("REPO_ALLOW_SHALLOW")
class Init(InteractiveCommand, MirrorSafeCommand):
COMMON = True
RESPECT_SMART_SYNC_OVERRIDE = False
MULTI_MANIFEST_SUPPORT = True
helpSummary = "Initialize a repo client checkout in the current directory"
helpUsage = """
-1
View File
@@ -104,7 +104,6 @@ revision specified in the manifest.
def Execute(self, opt, args):
nb = args[0]
self.TryOverrideManifestWithSmartSync()
err_projects = []
err = []
projects = []
+1
View File
@@ -312,6 +312,7 @@ class TeeStringIO(io.StringIO):
class Sync(Command, MirrorSafeCommand):
COMMON = True
RESPECT_SMART_SYNC_OVERRIDE = False
MULTI_MANIFEST_SUPPORT = True
helpSummary = "Update working tree to the latest revision"
helpUsage = """
+1 -1
View File
@@ -24,7 +24,7 @@ class GcCommand(unittest.TestCase):
"""Tests for gc command."""
def setUp(self):
self.cmd = gc.Gc()
self.cmd = gc.Gc(manifest=mock.MagicMock())
self.opt, self.args = self.cmd.OptionParser.parse_args([])
self.opt.this_manifest_only = False
self.opt.repack = False