manifest_xml: use Superproject to hold XML content
Always create Superproject when there is a <superproject> tag, and have
it hold the XML content, similar to how other manifest elements are
handled.
This also adds SetQuiet and SetPrintMessages to Superproject
consistent with manifest.SetUseLocalManifests.
Change-Id: I522bf3da542006575799f0640c67f7052704f266
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/334641
Reviewed-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Raman Tenneti <rtenneti@google.com>
Tested-by: LaMont Jones <lamontjones@google.com>
diff --git a/git_superproject.py b/git_superproject.py
index f4dbb27..9f585e5 100644
--- a/git_superproject.py
+++ b/git_superproject.py
@@ -71,42 +71,50 @@
lookup of commit ids for all projects. It contains _project_commit_ids which
is a dictionary with project/commit id entries.
"""
- def __init__(self, manifest, repodir, git_event_log,
- superproject_dir='exp-superproject', quiet=False, print_messages=False):
+ def __init__(self, manifest, name, remote, revision,
+ superproject_dir='exp-superproject'):
"""Initializes superproject.
Args:
manifest: A Manifest object that is to be written to a file.
- repodir: Path to the .repo/ dir for holding all internal checkout state.
- It must be in the top directory of the repo client checkout.
- git_event_log: A git trace2 event log to log events.
- superproject_dir: Relative path under |repodir| to checkout superproject.
- quiet: If True then only print the progress messages.
- print_messages: if True then print error/warning messages.
+ name: The unique name of the superproject
+ remote: The RemoteSpec for the remote.
+ revision: The name of the git branch to track.
+ superproject_dir: Relative path under |manifest.subdir| to checkout
+ superproject.
"""
self._project_commit_ids = None
self._manifest = manifest
- self._git_event_log = git_event_log
- self._quiet = quiet
- self._print_messages = print_messages
- self._branch = manifest.branch
- self._repodir = os.path.abspath(repodir)
+ self.name = name
+ self.remote = remote
+ self.revision = self._branch = revision
+ self._repodir = manifest.repodir
self._superproject_dir = superproject_dir
self._superproject_path = manifest.SubmanifestInfoDir(manifest.path_prefix,
superproject_dir)
self._manifest_path = os.path.join(self._superproject_path,
_SUPERPROJECT_MANIFEST_NAME)
- git_name = ''
- if self._manifest.superproject:
- remote = self._manifest.superproject['remote']
- git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-'
- self._branch = self._manifest.superproject['revision']
- self._remote_url = remote.url
- else:
- self._remote_url = None
+ git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-'
+ self._remote_url = remote.url
self._work_git_name = git_name + _SUPERPROJECT_GIT_NAME
self._work_git = os.path.join(self._superproject_path, self._work_git_name)
+ # The following are command arguemnts, rather then superproject attributes,
+ # and where included here originally. They should eventually become
+ # arguments that are passed down from the public methods, instead of being
+ # treated as attributes.
+ self._git_event_log = None
+ self._quiet = False
+ self._print_messages = False
+
+ def SetQuiet(self, value):
+ """Set the _quiet attribute."""
+ self._quiet = value
+
+ def SetPrintMessages(self, value):
+ """Set the _print_messages attribute."""
+ self._print_messages = value
+
@property
def project_commit_ids(self):
"""Returns a dictionary of projects and their commit ids."""
@@ -215,12 +223,16 @@
f'return code: {retval}, stderr: {p.stderr}')
return data
- def Sync(self):
+ def Sync(self, git_event_log):
"""Gets a local copy of a superproject for the manifest.
+ Args:
+ git_event_log: an EventLog, for git tracing.
+
Returns:
SyncResult
"""
+ self._git_event_log = git_event_log
if not self._manifest.superproject:
self._LogWarning(f'superproject tag is not defined in manifest: '
f'{self._manifest.manifestFile}')
@@ -248,7 +260,7 @@
Returns:
CommitIdsResult
"""
- sync_result = self.Sync()
+ sync_result = self.Sync(self._git_event_log)
if not sync_result.success:
return CommitIdsResult(None, sync_result.fatal)
@@ -313,7 +325,7 @@
# Skip the project if it comes from the local manifest.
return project.manifest.IsFromLocalManifest(project)
- def UpdateProjectsRevisionId(self, projects):
+ def UpdateProjectsRevisionId(self, projects, git_event_log):
"""Update revisionId of every project in projects with the commit id.
Args:
@@ -322,6 +334,7 @@
Returns:
UpdateProjectsResult
"""
+ self._git_event_log = git_event_log
commit_ids_result = self._GetAllProjectsCommitIds()
commit_ids = commit_ids_result.commit_ids
if not commit_ids:
@@ -397,7 +410,7 @@
def PrintMessages(opt, manifest):
"""Returns a boolean if error/warning messages are to be printed."""
- return opt.use_superproject is not None or manifest.superproject
+ return opt.use_superproject is not None or bool(manifest.superproject)
def UseSuperproject(opt, manifest):
@@ -409,7 +422,7 @@
client_value = manifest.manifestProject.use_superproject
if client_value is not None:
return client_value
- else:
- if not manifest.superproject:
- return False
+ elif manifest.superproject:
return _UseSuperprojectFromConfiguration()
+ else:
+ return False