diff options
Diffstat (limited to 'manifest_xml.py')
-rw-r--r-- | manifest_xml.py | 125 |
1 files changed, 70 insertions, 55 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index fe09f498..edcbadae 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
@@ -57,6 +57,60 @@ urllib.parse.uses_netloc.extend([ | |||
57 | 'rpc']) | 57 | 'rpc']) |
58 | 58 | ||
59 | 59 | ||
60 | def XmlBool(node, attr, default=None): | ||
61 | """Determine boolean value of |node|'s |attr|. | ||
62 | |||
63 | Invalid values will issue a non-fatal warning. | ||
64 | |||
65 | Args: | ||
66 | node: XML node whose attributes we access. | ||
67 | attr: The attribute to access. | ||
68 | default: If the attribute is not set (value is empty), then use this. | ||
69 | |||
70 | Returns: | ||
71 | True if the attribute is a valid string representing true. | ||
72 | False if the attribute is a valid string representing false. | ||
73 | |default| otherwise. | ||
74 | """ | ||
75 | value = node.getAttribute(attr) | ||
76 | s = value.lower() | ||
77 | if s == '': | ||
78 | return default | ||
79 | elif s in {'yes', 'true', '1'}: | ||
80 | return True | ||
81 | elif s in {'no', 'false', '0'}: | ||
82 | return False | ||
83 | else: | ||
84 | print('warning: manifest: %s="%s": ignoring invalid XML boolean' % | ||
85 | (attr, value), file=sys.stderr) | ||
86 | return default | ||
87 | |||
88 | |||
89 | def XmlInt(node, attr, default=None): | ||
90 | """Determine integer value of |node|'s |attr|. | ||
91 | |||
92 | Args: | ||
93 | node: XML node whose attributes we access. | ||
94 | attr: The attribute to access. | ||
95 | default: If the attribute is not set (value is empty), then use this. | ||
96 | |||
97 | Returns: | ||
98 | The number if the attribute is a valid number. | ||
99 | |||
100 | Raises: | ||
101 | ManifestParseError: The number is invalid. | ||
102 | """ | ||
103 | value = node.getAttribute(attr) | ||
104 | if not value: | ||
105 | return default | ||
106 | |||
107 | try: | ||
108 | return int(value) | ||
109 | except ValueError: | ||
110 | raise ManifestParseError('manifest: invalid %s="%s" integer' % | ||
111 | (attr, value)) | ||
112 | |||
113 | |||
60 | class _Default(object): | 114 | class _Default(object): |
61 | """Project defaults within the manifest.""" | 115 | """Project defaults within the manifest.""" |
62 | 116 | ||
@@ -757,29 +811,14 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
757 | d.destBranchExpr = node.getAttribute('dest-branch') or None | 811 | d.destBranchExpr = node.getAttribute('dest-branch') or None |
758 | d.upstreamExpr = node.getAttribute('upstream') or None | 812 | d.upstreamExpr = node.getAttribute('upstream') or None |
759 | 813 | ||
760 | sync_j = node.getAttribute('sync-j') | 814 | d.sync_j = XmlInt(node, 'sync-j', 1) |
761 | if sync_j == '' or sync_j is None: | 815 | if d.sync_j <= 0: |
762 | d.sync_j = 1 | 816 | raise ManifestParseError('%s: sync-j must be greater than 0, not "%s"' % |
763 | else: | 817 | (self.manifestFile, d.sync_j)) |
764 | d.sync_j = int(sync_j) | ||
765 | |||
766 | sync_c = node.getAttribute('sync-c') | ||
767 | if not sync_c: | ||
768 | d.sync_c = False | ||
769 | else: | ||
770 | d.sync_c = sync_c.lower() in ("yes", "true", "1") | ||
771 | |||
772 | sync_s = node.getAttribute('sync-s') | ||
773 | if not sync_s: | ||
774 | d.sync_s = False | ||
775 | else: | ||
776 | d.sync_s = sync_s.lower() in ("yes", "true", "1") | ||
777 | 818 | ||
778 | sync_tags = node.getAttribute('sync-tags') | 819 | d.sync_c = XmlBool(node, 'sync-c', False) |
779 | if not sync_tags: | 820 | d.sync_s = XmlBool(node, 'sync-s', False) |
780 | d.sync_tags = True | 821 | d.sync_tags = XmlBool(node, 'sync-tags', True) |
781 | else: | ||
782 | d.sync_tags = sync_tags.lower() in ("yes", "true", "1") | ||
783 | return d | 822 | return d |
784 | 823 | ||
785 | def _ParseNotice(self, node): | 824 | def _ParseNotice(self, node): |
@@ -856,39 +895,15 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
856 | raise ManifestParseError("project %s path cannot be absolute in %s" % | 895 | raise ManifestParseError("project %s path cannot be absolute in %s" % |
857 | (name, self.manifestFile)) | 896 | (name, self.manifestFile)) |
858 | 897 | ||
859 | rebase = node.getAttribute('rebase') | 898 | rebase = XmlBool(node, 'rebase', True) |
860 | if not rebase: | 899 | sync_c = XmlBool(node, 'sync-c', False) |
861 | rebase = True | 900 | sync_s = XmlBool(node, 'sync-s', self._default.sync_s) |
862 | else: | 901 | sync_tags = XmlBool(node, 'sync-tags', self._default.sync_tags) |
863 | rebase = rebase.lower() in ("yes", "true", "1") | ||
864 | |||
865 | sync_c = node.getAttribute('sync-c') | ||
866 | if not sync_c: | ||
867 | sync_c = False | ||
868 | else: | ||
869 | sync_c = sync_c.lower() in ("yes", "true", "1") | ||
870 | |||
871 | sync_s = node.getAttribute('sync-s') | ||
872 | if not sync_s: | ||
873 | sync_s = self._default.sync_s | ||
874 | else: | ||
875 | sync_s = sync_s.lower() in ("yes", "true", "1") | ||
876 | |||
877 | sync_tags = node.getAttribute('sync-tags') | ||
878 | if not sync_tags: | ||
879 | sync_tags = self._default.sync_tags | ||
880 | else: | ||
881 | sync_tags = sync_tags.lower() in ("yes", "true", "1") | ||
882 | 902 | ||
883 | clone_depth = node.getAttribute('clone-depth') | 903 | clone_depth = XmlInt(node, 'clone-depth') |
884 | if clone_depth: | 904 | if clone_depth is not None and clone_depth <= 0: |
885 | try: | 905 | raise ManifestParseError('%s: clone-depth must be greater than 0, not "%s"' % |
886 | clone_depth = int(clone_depth) | 906 | (self.manifestFile, clone_depth)) |
887 | if clone_depth <= 0: | ||
888 | raise ValueError() | ||
889 | except ValueError: | ||
890 | raise ManifestParseError('invalid clone-depth %s in %s' % | ||
891 | (clone_depth, self.manifestFile)) | ||
892 | 907 | ||
893 | dest_branch = node.getAttribute('dest-branch') or self._default.destBranchExpr | 908 | dest_branch = node.getAttribute('dest-branch') or self._default.destBranchExpr |
894 | 909 | ||
@@ -911,7 +926,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
911 | groups.extend(set(default_groups).difference(groups)) | 926 | groups.extend(set(default_groups).difference(groups)) |
912 | 927 | ||
913 | if self.IsMirror and node.hasAttribute('force-path'): | 928 | if self.IsMirror and node.hasAttribute('force-path'): |
914 | if node.getAttribute('force-path').lower() in ("yes", "true", "1"): | 929 | if XmlBool(node, 'force-path', False): |
915 | gitdir = os.path.join(self.topdir, '%s.git' % path) | 930 | gitdir = os.path.join(self.topdir, '%s.git' % path) |
916 | 931 | ||
917 | project = Project(manifest=self, | 932 | project = Project(manifest=self, |