Stop passing optparse.Values to git_superproject

Make git_superproject independent of the command line by passing
the specific value instead of requiring the caller to have an
optparse.Values object to pass in.

Flag --use-superproject and --archive as incompatible in subcmds/init.py

Change-Id: Ied7c874b312e151038df903c8af4328f070f387c
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/335135
Tested-by: LaMont Jones <lamontjones@google.com>
Reviewed-by: Raman Tenneti <rtenneti@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
diff --git a/git_superproject.py b/git_superproject.py
index 1293f35..07bc264 100644
--- a/git_superproject.py
+++ b/git_superproject.py
@@ -415,16 +415,26 @@
   return False
 
 
-def PrintMessages(opt, manifest):
-  """Returns a boolean if error/warning messages are to be printed."""
-  return opt.use_superproject is not None or bool(manifest.superproject)
+def PrintMessages(use_superproject, manifest):
+  """Returns a boolean if error/warning messages are to be printed.
+
+  Args:
+    use_superproject: option value from optparse.
+    manifest: manifest to use.
+  """
+  return use_superproject is not None or bool(manifest.superproject)
 
 
-def UseSuperproject(opt, manifest):
-  """Returns a boolean if use-superproject option is enabled."""
+def UseSuperproject(use_superproject, manifest):
+  """Returns a boolean if use-superproject option is enabled.
 
-  if opt.use_superproject is not None:
-    return opt.use_superproject
+  Args:
+    use_superproject: option value from optparse.
+    manifest: manifest to use.
+  """
+
+  if use_superproject is not None:
+    return use_superproject
   else:
     client_value = manifest.manifestProject.use_superproject
     if client_value is not None:
diff --git a/subcmds/init.py b/subcmds/init.py
index 99f30dc..0388f5d 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -260,6 +260,9 @@
       if opt.use_superproject is not None:
         self.OptionParser.error('--mirror and --use-superproject cannot be '
                                 'used together.')
+    if opt.archive and opt.use_superproject is not None:
+      self.OptionParser.error('--archive and --use-superproject cannot be used '
+                              'together.')
 
     if opt.standalone_manifest and (opt.manifest_branch or
                                     opt.manifest_name != 'default.xml'):
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 4d0a5ec..3451ab6 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -286,7 +286,7 @@
       True if a superproject is requested, otherwise the value of the
       current_branch option (True, False or None).
     """
-    return git_superproject.UseSuperproject(opt, self.manifest) or opt.current_branch_only
+    return git_superproject.UseSuperproject(opt.use_superproject, self.manifest) or opt.current_branch_only
 
   def _UpdateProjectsRevisionId(self, opt, args, load_local_manifests, superproject_logging_data):
     """Update revisionId of every project with the SHA from superproject.
@@ -306,7 +306,8 @@
     """
     superproject = self.manifest.superproject
     superproject.SetQuiet(opt.quiet)
-    print_messages = git_superproject.PrintMessages(opt, self.manifest)
+    print_messages = git_superproject.PrintMessages(opt.use_superproject,
+                                                    self.manifest)
     superproject.SetPrintMessages(print_messages)
     if opt.local_only:
       manifest_path = superproject.manifest_path
@@ -993,7 +994,8 @@
       self._UpdateManifestProject(opt, mp, manifest_name)
 
     load_local_manifests = not self.manifest.HasLocalManifests
-    use_superproject = git_superproject.UseSuperproject(opt, self.manifest)
+    use_superproject = git_superproject.UseSuperproject(opt.use_superproject,
+                                                        self.manifest)
     if use_superproject and (self.manifest.IsMirror or self.manifest.IsArchive):
       # Don't use superproject, because we have no working tree.
       use_superproject = False