summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py125
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
60def 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
89def 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
60class _Default(object): 114class _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,