From c745350ab93e9f0417b312d5509d16a7004485f4 Mon Sep 17 00:00:00 2001 From: Basil Gello Date: Fri, 25 May 2018 20:23:52 +0300 Subject: 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 --- manifest_xml.py | 57 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 21 deletions(-) (limited to 'manifest_xml.py') diff --git a/manifest_xml.py b/manifest_xml.py index f37732cd..23b4fb74 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -135,6 +135,7 @@ class XmlManifest(object): 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 @@ class XmlManifest(object): 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 @@ class XmlManifest(object): 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)) - - 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 + 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 try: self._ParseManifest(nodes) -- cgit v1.2.3-54-g00ecf