1 |
commit: 3a5cad45548f3acc695226ea78e2c0a4577149c3 |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Jun 3 19:20:43 2014 +0000 |
4 |
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com> |
5 |
CommitDate: Wed Oct 1 22:58:13 2014 +0000 |
6 |
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=3a5cad45 |
7 |
|
8 |
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in |
9 |
|
10 |
Move all non-consistent data to be passed in via the check functions. |
11 |
Initialize XmlLint once in the PkgMetadata class __init__(). |
12 |
|
13 |
--- |
14 |
pym/repoman/_xml.py | 33 ++++++++++++++++++++++--------- |
15 |
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------ |
16 |
2 files changed, 30 insertions(+), 15 deletions(-) |
17 |
|
18 |
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py |
19 |
index b97c027..d5b5a5e 100644 |
20 |
--- a/pym/repoman/_xml.py |
21 |
+++ b/pym/repoman/_xml.py |
22 |
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput |
23 |
|
24 |
|
25 |
class _XMLParser(xml.etree.ElementTree.XMLParser): |
26 |
+ |
27 |
+ |
28 |
def __init__(self, data, **kwargs): |
29 |
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs) |
30 |
self._portage_data = data |
31 |
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser): |
32 |
self.parser.StartDoctypeDeclHandler = \ |
33 |
self._portage_StartDoctypeDeclHandler |
34 |
|
35 |
+ |
36 |
def _portage_XmlDeclHandler(self, version, encoding, standalone): |
37 |
if self._base_XmlDeclHandler is not None: |
38 |
self._base_XmlDeclHandler(version, encoding, standalone) |
39 |
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone) |
40 |
|
41 |
+ |
42 |
def _portage_StartDoctypeDeclHandler( |
43 |
self, doctypeName, systemId, publicId, has_internal_subset): |
44 |
if self._base_StartDoctypeDeclHandler is not None: |
45 |
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder): |
46 |
|
47 |
class XmlLint(object): |
48 |
|
49 |
- def __init__(self, options, repolevel, repoman_settings): |
50 |
+ def __init__(self, options, repoman_settings): |
51 |
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd') |
52 |
+ self.options = options |
53 |
+ self.repoman_settings = repoman_settings |
54 |
self._is_capable = False |
55 |
self.binary = None |
56 |
- self._check_capable(options, repolevel, repoman_settings) |
57 |
+ self._check_capable() |
58 |
+ |
59 |
|
60 |
- def _check_capable(self, options, repolevel, repoman_settings): |
61 |
- if options.mode == "manifest": |
62 |
+ def _check_capable(self): |
63 |
+ if self.options.mode == "manifest": |
64 |
return |
65 |
self.binary = find_binary('xmllint') |
66 |
if not self.binary: |
67 |
print(red("!!! xmllint not found. Can't check metadata.xml.\n")) |
68 |
- if options.xml_parse or repolevel == 3: |
69 |
- print("%s sorry, xmllint is needed. failing\n" % red("!!!")) |
70 |
- sys.exit(1) |
71 |
else: |
72 |
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings): |
73 |
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings): |
74 |
sys.exit(1) |
75 |
# this can be problematic if xmllint changes their output |
76 |
self._is_capable = True |
77 |
|
78 |
+ |
79 |
@property |
80 |
def capable(self): |
81 |
return self._is_capable |
82 |
|
83 |
- def check(self, checkdir): |
84 |
+ |
85 |
+ def check(self, checkdir, repolevel): |
86 |
+ '''Runs checks on the package metadata.xml file |
87 |
+ |
88 |
+ @param checkdir: string, path |
89 |
+ @param repolevel: integer |
90 |
+ @return boolean, False == bad metadata |
91 |
+ ''' |
92 |
if not self.capable: |
93 |
+ if self.options.xml_parse or repolevel == 3: |
94 |
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!")) |
95 |
+ sys.exit(1) |
96 |
return True |
97 |
# xmlint can produce garbage output even on success, so only dump |
98 |
# the ouput when it fails. |
99 |
|
100 |
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py |
101 |
index 0778696..674d32f 100644 |
102 |
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py |
103 |
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py |
104 |
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint |
105 |
class PkgMetadata(object): |
106 |
'''Package metadata.xml checks''' |
107 |
|
108 |
- def __init__(self, options, qatracker, repolevel, repoman_settings): |
109 |
+ def __init__(self, options, qatracker, repoman_settings): |
110 |
'''PkgMetadata init function |
111 |
|
112 |
@param options: ArgumentParser.parse_known_args(argv[1:]) options |
113 |
@param qatracker: QATracker instance |
114 |
- @param repolevel: integer |
115 |
@param repoman_settings: settings instance |
116 |
''' |
117 |
self.options = options |
118 |
self.qatracker = qatracker |
119 |
- self.repolevel = repolevel |
120 |
self.repoman_settings = repoman_settings |
121 |
self.musedict = {} |
122 |
+ self.xmllint = XmlLint(self.options, self.repoman_settings) |
123 |
+ |
124 |
|
125 |
|
126 |
- def check(self, xpkg, checkdir, checkdirlist): |
127 |
+ def check(self, xpkg, checkdir, checkdirlist, repolevel): |
128 |
'''Performs the checks on the metadata.xml for the package |
129 |
|
130 |
@param xpkg: the pacakge being checked |
131 |
@param checkdir: string, directory path |
132 |
@param checkdirlist: list of checkdir's |
133 |
+ @param repolevel: integer |
134 |
''' |
135 |
|
136 |
self.musedict = {} |
137 |
@@ -165,8 +166,7 @@ class PkgMetadata(object): |
138 |
|
139 |
# Only carry out if in package directory or check forced |
140 |
if not metadata_bad: |
141 |
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings) |
142 |
- if not xmllint.check(checkdir): |
143 |
+ if not self.xmllint.check(checkdir, repolevel): |
144 |
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml") |
145 |
del metadata_bad |
146 |
return |