Fix sub manifest handling
Also fixes some typos
Change-Id: Id2ba5834ba3a74ed3f29c36d2c0030737dc63e35
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/334579
Tested-by: LaMont Jones <lamontjones@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
diff --git a/manifest_xml.py b/manifest_xml.py
index 022cad2..02f09db 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -243,12 +243,13 @@
manifestFile = parent.SubmanifestInfoDir(
os.path.join(parent.path_prefix, self.relpath),
os.path.join('manifests', manifestName or 'default.xml'))
+ linkFile = parent.SubmanifestInfoDir(
+ os.path.join(parent.path_prefix, self.relpath), MANIFEST_FILE_NAME)
rc = self.repo_client = RepoClient(
- parent.repodir, manifestFile, parent_groups=','.join(groups) or '',
+ parent.repodir, linkFile, parent_groups=','.join(groups) or '',
submanifest_path=self.relpath, outer_client=outer_client)
- self.present = os.path.exists(os.path.join(self.repo_client.subdir,
- MANIFEST_FILE_NAME))
+ self.present = os.path.exists(manifestFile)
def __eq__(self, other):
if not isinstance(other, _XmlSubmanifest):
@@ -1051,7 +1052,7 @@
tree.present = present
elif not os.path.exists(self.subdir):
tree.present = False
- if tree.present:
+ if present and tree.present:
tree.repo_client._Load(initial_client=initial_client,
submanifest_depth=submanifest_depth + 1)
diff --git a/project.py b/project.py
index 6d8784e..a60a858 100644
--- a/project.py
+++ b/project.py
@@ -32,10 +32,11 @@
from git_command import GitCommand, git_require
from git_config import GitConfig, IsId, GetSchemeFromUrl, GetUrlCookieFile, \
ID_RE
+from git_trace2_event_log import EventLog
from error import GitError, UploadError, DownloadError
from error import ManifestInvalidRevisionError, ManifestInvalidPathError
from error import NoManifestException, ManifestParseError
-import git_superproject
+from git_superproject import Superproject
import platform_utils
import progress
from repo_trace import IsTrace, Trace
@@ -3361,7 +3362,7 @@
@property
def standalone_manifest_url(self):
"""The URL of the standalone manifest, or None."""
- return self.config.getString('manifest.standalone')
+ return self.config.GetString('manifest.standalone')
@property
def manifest_groups(self):
@@ -3444,8 +3445,8 @@
partial_clone=None, depth=None, clone_filter='blob:none',
partial_clone_exclude=None, clone_bundle=None, git_lfs=None,
use_superproject=None, verbose=False, current_branch_only=False,
- platform='', tags='', manifest_name='default.xml',
- this_manifest_only=False, outer_manifest=True):
+ git_event_log=None, platform='', manifest_name='default.xml',
+ tags='', this_manifest_only=False, outer_manifest=True):
"""Sync the manifest and all submanifests.
Args:
@@ -3478,6 +3479,7 @@
branch from the server.
platform: a string, restrict the checkout to projects with the specified
platform group.
+ git_event_log: an EventLog, for git tracing.
tags: a boolean, whether to fetch tags.,
manifest_name: a string, the name of the manifest file to use.
this_manifest_only: a boolean, whether to only operate on the current sub
@@ -3489,6 +3491,7 @@
"""
assert _kwargs_only == (), 'Sync only accepts keyword arguments.'
+ 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
# not to.
@@ -3514,6 +3517,7 @@
current_branch_only=current_branch_only,
tags=tags,
depth=depth,
+ git_event_log=git_event_log,
manifest_name=manifest_name,
this_manifest_only=this_manifest_only,
outer_manifest=False)
@@ -3670,7 +3674,7 @@
self.config.SetBoolean('repo.partialclone', partial_clone)
if clone_filter:
self.config.SetString('repo.clonefilter', clone_filter)
- elif self.partialclone:
+ elif self.partial_clone:
clone_filter = self.clone_filter
else:
clone_filter = None
@@ -3747,52 +3751,51 @@
print('fatal: %s' % str(e), file=sys.stderr)
return False
- # Lastly, clone the superproject.
- superproject = git_superproject.Superproject(self.manifest,
- self.repodir,
- self.git_event_log,
- quiet=not verbose)
- sync_result = superproject.Sync()
- if not sync_result.success:
- print('warning: git update of superproject 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 not this_manifest_only:
+ for submanifest in self.manifest.submanifests.values():
+ spec = submanifest.ToSubmanifestSpec(root=self.manifest.outer_client)
+ submanifest.repo_client.manifestProject.Sync(
+ manifest_url=spec.manifestUrl,
+ manifest_branch=spec.revision,
+ standalone_manifest=standalone_manifest,
+ groups=self.manifest_groups,
+ platform=platform,
+ mirror=mirror,
+ dissociate=dissociate,
+ reference=reference,
+ worktree=worktree,
+ submodules=submodules,
+ archive=archive,
+ partial_clone=partial_clone,
+ clone_filter=clone_filter,
+ partial_clone_exclude=partial_clone_exclude,
+ clone_bundle=clone_bundle,
+ git_lfs=git_lfs,
+ use_superproject=use_superproject,
+ verbose=verbose,
+ current_branch_only=current_branch_only,
+ tags=tags,
+ depth=depth,
+ git_event_log=git_event_log,
+ manifest_name=spec.manifestName,
+ this_manifest_only=False,
+ outer_manifest=False,
+ )
- if this_manifest_only:
- return True
-
- for submanifest in self.manifest.submanifests.values():
- spec = submanifest.ToSubmanifestSpec(root=self.manifest.outer_client)
- submanifest.repo_client.manifestProject.Sync(
- manifest_url=spec.manifestUrl,
- manifest_branch=spec.revision,
- standalone_manifest=standalone_manifest,
- groups=self.manifest_groups,
- platform=platform,
- mirror=mirror,
- dissociate=dissociate,
- reference=reference,
- worktree=worktree,
- submodules=submodules,
- archive=archive,
- partial_clone=partial_clone,
- clone_filter=clone_filter,
- partial_clone_exclude=partial_clone_exclude,
- clone_bundle=clone_bundle,
- git_lfs=git_lfs,
- use_superproject=use_superproject,
- verbose=verbose,
- current_branch_only=current_branch_only,
- tags=tags,
- depth=depth,
- manifest_name=spec.manifestName,
- this_manifest_only=False,
- outer_manifest=False,
- )
+ # 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
return True
diff --git a/subcmds/init.py b/subcmds/init.py
index 2cb3ff3..65b63ef 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -135,6 +135,7 @@
current_branch_only=opt.current_branch_only,
tags=opt.tags,
depth=opt.depth,
+ git_event_log=self.git_event_log,
manifest_name=opt.manifest_name):
sys.exit(1)