manifest_xml: Add Load and Unload methods

- do not call the internal method from subcmds/sync.py.
- use the correct default groups for submanifests.
- only sync the superproject when we are told to.

Change-Id: I81e4025058f1ee564732b9e17aecc522f6b5f626
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/334639
Reviewed-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Raman Tenneti <rtenneti@google.com>
Tested-by: LaMont Jones <lamontjones@google.com>
diff --git a/manifest_xml.py b/manifest_xml.py
index 02f09db..8718dc5 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -376,7 +376,7 @@
     if os.path.exists(mp.gitdir) and mp.use_worktree:
       mp.use_git_worktrees = True
 
-    self._Unload()
+    self.Unload()
 
   def Override(self, name, load_local_manifests=True):
     """Use a different manifest, just for the current instantiation.
@@ -399,7 +399,7 @@
     try:
       self._load_local_manifests = load_local_manifests
       self.manifestFile = path
-      self._Unload()
+      self.Unload()
       self._Load()
     finally:
       self.manifestFile = old
@@ -970,7 +970,13 @@
       groups = self.GetDefaultGroupsStr()
     return groups
 
-  def _Unload(self):
+  def Unload(self):
+    """Unload the manifest.
+
+    If the manifest files have been changed since Load() was called, this will
+    cause the new/updated manifest to be used.
+
+    """
     self._loaded = False
     self._projects = {}
     self._paths = {}
@@ -984,6 +990,11 @@
     self.branch = None
     self._manifest_server = None
 
+  def Load(self):
+    """Read the manifest into memory."""
+    # Do not expose internal arguments.
+    self._Load()
+
   def _Load(self, initial_client=None, submanifest_depth=0):
     if submanifest_depth > MAX_SUBMANIFEST_DEPTH:
       raise ManifestParseError('maximum submanifest depth %d exceeded.' %
@@ -1030,7 +1041,7 @@
       except ManifestParseError as e:
         # There was a problem parsing, unload ourselves in case they catch
         # this error and try again later, we will show the correct error
-        self._Unload()
+        self.Unload()
         raise e
 
       if self.IsMirror:
diff --git a/project.py b/project.py
index a60a858..b8d834a 100644
--- a/project.py
+++ b/project.py
@@ -3491,6 +3491,8 @@
     """
     assert _kwargs_only == (), 'Sync only accepts keyword arguments.'
 
+    groups = groups or 'default'
+    platform = platform or 'auto'
     git_event_log = git_event_log or EventLog()
     if outer_manifest and self.manifest.is_submanifest:
       # In a multi-manifest checkout, use the outer manifest unless we are told
@@ -3783,19 +3785,18 @@
         )
 
     # Lastly, clone the superproject(s).
-    if outer_manifest and not self.manifest.is_submanifest:
-      for m in self.manifest.all_manifests:
-        sync_result = Superproject(
-            m, m.repodir, git_event_log, quiet=not verbose).Sync()
-        if not sync_result.success:
-          print(f'warning: git update of superproject for {m.path_prefix} failed, '
-                'repo sync will not '
-                'use superproject to fetch source; while this error is not fatal, '
-                'and you can continue to run repo sync, please run repo init with '
-                'the --no-use-superproject option to stop seeing this warning',
-                file=sys.stderr)
-          if sync_result.fatal and use_superproject is not None:
-            return False
+    if self.manifest.manifestProject.use_superproject:
+      sync_result = Superproject(
+          self.manifest, self.manifest.repodir, git_event_log, quiet=not verbose).Sync()
+      if not sync_result.success:
+        print('warning: git update of superproject for '
+              f'{self.manifest.path_prefix} failed, repo sync will not use '
+              'superproject to fetch source; while this error is not fatal, '
+              'and you can continue to run repo sync, please run repo init '
+              'with the --no-use-superproject option to stop seeing this '
+              'warning', file=sys.stderr)
+        if sync_result.fatal and use_superproject is not None:
+          return False
 
     return True
 
diff --git a/subcmds/sync.py b/subcmds/sync.py
index c165515..baee6b2 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -694,10 +694,10 @@
       load_local_manifests: Whether to load local manifests.
     """
     if manifest_name:
-      # Override calls _Unload already
+      # Override calls Unload already
       self.manifest.Override(manifest_name, load_local_manifests=load_local_manifests)
     else:
-      self.manifest._Unload()
+      self.manifest.Unload()
 
   def UpdateProjectList(self, opt):
     new_project_paths = []