diff options
Diffstat (limited to 'manifest_xml.py')
| -rw-r--r-- | manifest_xml.py | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index cd5954df..e96e0620 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -624,16 +624,22 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 624 | b = b[len(R_HEADS):] | 624 | b = b[len(R_HEADS):] |
| 625 | self.branch = b | 625 | self.branch = b |
| 626 | 626 | ||
| 627 | # The manifestFile was specified by the user which is why we allow include | ||
| 628 | # paths to point anywhere. | ||
| 627 | nodes = [] | 629 | nodes = [] |
| 628 | nodes.append(self._ParseManifestXml(self.manifestFile, | 630 | nodes.append(self._ParseManifestXml( |
| 629 | self.manifestProject.worktree)) | 631 | self.manifestFile, self.manifestProject.worktree, |
| 632 | restrict_includes=False)) | ||
| 630 | 633 | ||
| 631 | if self._load_local_manifests and self.local_manifests: | 634 | if self._load_local_manifests and self.local_manifests: |
| 632 | try: | 635 | try: |
| 633 | for local_file in sorted(platform_utils.listdir(self.local_manifests)): | 636 | for local_file in sorted(platform_utils.listdir(self.local_manifests)): |
| 634 | if local_file.endswith('.xml'): | 637 | if local_file.endswith('.xml'): |
| 635 | local = os.path.join(self.local_manifests, local_file) | 638 | local = os.path.join(self.local_manifests, local_file) |
| 636 | nodes.append(self._ParseManifestXml(local, self.repodir)) | 639 | # Since local manifests are entirely managed by the user, allow |
| 640 | # them to point anywhere the user wants. | ||
| 641 | nodes.append(self._ParseManifestXml( | ||
| 642 | local, self.repodir, restrict_includes=False)) | ||
| 637 | except OSError: | 643 | except OSError: |
| 638 | pass | 644 | pass |
| 639 | 645 | ||
| @@ -651,7 +657,19 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 651 | 657 | ||
| 652 | self._loaded = True | 658 | self._loaded = True |
| 653 | 659 | ||
| 654 | def _ParseManifestXml(self, path, include_root, parent_groups=''): | 660 | def _ParseManifestXml(self, path, include_root, parent_groups='', |
| 661 | restrict_includes=True): | ||
| 662 | """Parse a manifest XML and return the computed nodes. | ||
| 663 | |||
| 664 | Args: | ||
| 665 | path: The XML file to read & parse. | ||
| 666 | include_root: The path to interpret include "name"s relative to. | ||
| 667 | parent_groups: The groups to apply to this projects. | ||
| 668 | restrict_includes: Whether to constrain the "name" attribute of includes. | ||
| 669 | |||
| 670 | Returns: | ||
| 671 | List of XML nodes. | ||
| 672 | """ | ||
| 655 | try: | 673 | try: |
| 656 | root = xml.dom.minidom.parse(path) | 674 | root = xml.dom.minidom.parse(path) |
| 657 | except (OSError, xml.parsers.expat.ExpatError) as e: | 675 | except (OSError, xml.parsers.expat.ExpatError) as e: |
| @@ -670,10 +688,11 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 670 | for node in manifest.childNodes: | 688 | for node in manifest.childNodes: |
| 671 | if node.nodeName == 'include': | 689 | if node.nodeName == 'include': |
| 672 | name = self._reqatt(node, 'name') | 690 | name = self._reqatt(node, 'name') |
| 673 | msg = self._CheckLocalPath(name) | 691 | if restrict_includes: |
| 674 | if msg: | 692 | msg = self._CheckLocalPath(name) |
| 675 | raise ManifestInvalidPathError( | 693 | if msg: |
| 676 | '<include> invalid "name": %s: %s' % (name, msg)) | 694 | raise ManifestInvalidPathError( |
| 695 | '<include> invalid "name": %s: %s' % (name, msg)) | ||
| 677 | include_groups = '' | 696 | include_groups = '' |
| 678 | if parent_groups: | 697 | if parent_groups: |
| 679 | include_groups = parent_groups | 698 | include_groups = parent_groups |
| @@ -681,13 +700,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 681 | include_groups = node.getAttribute('groups') + ',' + include_groups | 700 | include_groups = node.getAttribute('groups') + ',' + include_groups |
| 682 | fp = os.path.join(include_root, name) | 701 | fp = os.path.join(include_root, name) |
| 683 | if not os.path.isfile(fp): | 702 | if not os.path.isfile(fp): |
| 684 | raise ManifestParseError("include %s doesn't exist or isn't a file" | 703 | raise ManifestParseError("include [%s/]%s doesn't exist or isn't a file" |
| 685 | % (name,)) | 704 | % (include_root, name)) |
| 686 | try: | 705 | try: |
| 687 | nodes.extend(self._ParseManifestXml(fp, include_root, include_groups)) | 706 | nodes.extend(self._ParseManifestXml(fp, include_root, include_groups)) |
| 688 | # should isolate this to the exact exception, but that's | 707 | # should isolate this to the exact exception, but that's |
| 689 | # tricky. actual parsing implementation may vary. | 708 | # tricky. actual parsing implementation may vary. |
| 690 | except (KeyboardInterrupt, RuntimeError, SystemExit): | 709 | except (KeyboardInterrupt, RuntimeError, SystemExit, ManifestParseError): |
| 691 | raise | 710 | raise |
| 692 | except Exception as e: | 711 | except Exception as e: |
| 693 | raise ManifestParseError( | 712 | raise ManifestParseError( |
