diffmanifests: honor user-supplied manifest paths
The current implementation ignores the user-specified paths to
manifests. if the "repo diffmanifests" is invoked with absolute
file paths for one or both manifests, the command fails with message:
fatal: duplicate path ... in /tmp/manifest-old.xml
Also the current implementation fails to expand the absolute path to
manifest files if "repo diffmanifests" is invoked with relative
paths, i.e "repo diffmanifests manifest-old.xml manifest-new.xml".
fatal: manifest manifest-old.xml not found
This commit fixes the first issue by disabling the local manifest
discovery for diffmanifests command, and the second issue by
expanding paths to manifests within "diffmanifests" sub-command.
Test: repo manifest --revision-as-HEAD -o /tmp/manifest-old.xml
repo sync
repo manifest --revision-as-HEAD -o /tmp/manifest-new.xml
repo diffmanifests /tmp/manifest-old.xml /tmp/manifest-new.xml
Change-Id: Ia125d769bfbea75adb9aba81abbd8c636f2168d4
Signed-off-by: Vasyl Gello <vasek.gello@gmail.com>
diff --git a/manifest_xml.py b/manifest_xml.py
index f37732c..23b4fb7 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -135,6 +135,7 @@
self.globalConfig = GitConfig.ForUser()
self.localManifestWarning = False
self.isGitcClient = False
+ self._load_local_manifests = True
self.repoProject = MetaProject(self, 'repo',
gitdir = os.path.join(repodir, 'repo/.git'),
@@ -146,15 +147,26 @@
self._Unload()
- def Override(self, name):
+ def Override(self, name, load_local_manifests=True):
"""Use a different manifest, just for the current instantiation.
"""
- path = os.path.join(self.manifestProject.worktree, name)
- if not os.path.isfile(path):
- raise ManifestParseError('manifest %s not found' % name)
+ path = None
+
+ # Look for a manifest by path in the filesystem (including the cwd).
+ if not load_local_manifests:
+ local_path = os.path.abspath(name)
+ if os.path.isfile(local_path):
+ path = local_path
+
+ # Look for manifests by name from the manifests repo.
+ if path is None:
+ path = os.path.join(self.manifestProject.worktree, name)
+ if not os.path.isfile(path):
+ raise ManifestParseError('manifest %s not found' % name)
old = self.manifestFile
try:
+ self._load_local_manifests = load_local_manifests
self.manifestFile = path
self._Unload()
self._Load()
@@ -435,23 +447,26 @@
nodes.append(self._ParseManifestXml(self.manifestFile,
self.manifestProject.worktree))
- local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME)
- if os.path.exists(local):
- if not self.localManifestWarning:
- self.localManifestWarning = True
- print('warning: %s is deprecated; put local manifests in `%s` instead'
- % (LOCAL_MANIFEST_NAME, os.path.join(self.repodir, LOCAL_MANIFESTS_DIR_NAME)),
- file=sys.stderr)
- nodes.append(self._ParseManifestXml(local, self.repodir))
+ if self._load_local_manifests:
+ local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME)
+ if os.path.exists(local):
+ if not self.localManifestWarning:
+ self.localManifestWarning = True
+ print('warning: %s is deprecated; put local manifests '
+ 'in `%s` instead' % (LOCAL_MANIFEST_NAME,
+ os.path.join(self.repodir, LOCAL_MANIFESTS_DIR_NAME)),
+ file=sys.stderr)
+ nodes.append(self._ParseManifestXml(local, self.repodir))
- local_dir = os.path.abspath(os.path.join(self.repodir, LOCAL_MANIFESTS_DIR_NAME))
- try:
- for local_file in sorted(platform_utils.listdir(local_dir)):
- if local_file.endswith('.xml'):
- local = os.path.join(local_dir, local_file)
- nodes.append(self._ParseManifestXml(local, self.repodir))
- except OSError:
- pass
+ local_dir = os.path.abspath(os.path.join(self.repodir,
+ LOCAL_MANIFESTS_DIR_NAME))
+ try:
+ for local_file in sorted(platform_utils.listdir(local_dir)):
+ if local_file.endswith('.xml'):
+ local = os.path.join(local_dir, local_file)
+ nodes.append(self._ParseManifestXml(local, self.repodir))
+ except OSError:
+ pass
try:
self._ParseManifest(nodes)
diff --git a/subcmds/diffmanifests.py b/subcmds/diffmanifests.py
index 751a202..a1e823c 100644
--- a/subcmds/diffmanifests.py
+++ b/subcmds/diffmanifests.py
@@ -190,12 +190,12 @@
self.printProject = self.printAdded = self.printRemoved = self.printRevision = self.printText
manifest1 = XmlManifest(self.manifest.repodir)
- manifest1.Override(args[0])
+ manifest1.Override(args[0], load_local_manifests=False)
if len(args) == 1:
manifest2 = self.manifest
else:
manifest2 = XmlManifest(self.manifest.repodir)
- manifest2.Override(args[1])
+ manifest2.Override(args[1], load_local_manifests=False)
diff = manifest1.projectsDiff(manifest2)
if opt.raw: