1 |
commit: 52bce5a348c68a5af0def40f399943d3b1d4f509 |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue May 3 09:01:29 2016 +0000 |
4 |
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue May 3 09:13:56 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=52bce5a3 |
7 |
|
8 |
repoman: Migrate from XmlLint to etree.XMLSchema for validation |
9 |
|
10 |
This change based on work by Dirkjan Ochtman <djc <AT> gentoo.org> |
11 |
Updated the change from XML.DTD to XMLSchema. |
12 |
Additionally: |
13 |
Move the metadata.xsd path determination code to metadata.py. |
14 |
Add the DISTDIR backup location and fetching of the file if missing or stale. |
15 |
|
16 |
pym/repoman/metadata.py | 21 +++++++++++++++++++++ |
17 |
pym/repoman/modules/scan/metadata/pkgmetadata.py | 9 +++------ |
18 |
pym/repoman/scanner.py | 10 ++-------- |
19 |
3 files changed, 26 insertions(+), 14 deletions(-) |
20 |
|
21 |
diff --git a/pym/repoman/metadata.py b/pym/repoman/metadata.py |
22 |
index 7c64c8e..a9ad3e8 100644 |
23 |
--- a/pym/repoman/metadata.py |
24 |
+++ b/pym/repoman/metadata.py |
25 |
@@ -99,3 +99,24 @@ def fetch_metadata_xsd(metadata_xsd, repoman_settings): |
26 |
pass |
27 |
|
28 |
return True |
29 |
+ |
30 |
+ |
31 |
+def get_metadata_xsd(repo_settings): |
32 |
+ '''Locate and or fetch the metadata.xsd file |
33 |
+ |
34 |
+ @param repo_settings: RepoSettings instance |
35 |
+ @returns: path to the metadata.xsd file |
36 |
+ ''' |
37 |
+ metadata_xsd = None |
38 |
+ for path in reversed(repo_settings.repo_config.eclass_db.porttrees): |
39 |
+ path = os.path.join(path, 'metadata/xml-schema/metadata.xsd') |
40 |
+ if os.path.exists(path): |
41 |
+ metadata_xsd = path |
42 |
+ break |
43 |
+ if metadata_xsd is None: |
44 |
+ metadata_xsd = os.path.join( |
45 |
+ repo_settings.repoman_settings["DISTDIR"], 'metadata.xsd' |
46 |
+ ) |
47 |
+ |
48 |
+ fetch_metadata_xsd(metadata_xsd, repo_settings.repoman_settings) |
49 |
+ return metadata_xsd |
50 |
|
51 |
diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py |
52 |
index c744c13..b231370 100644 |
53 |
--- a/pym/repoman/modules/scan/metadata/pkgmetadata.py |
54 |
+++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py |
55 |
@@ -24,7 +24,6 @@ except (ImportError, SystemError, RuntimeError, Exception): |
56 |
# import our initialized portage instance |
57 |
from repoman._portage import portage |
58 |
from repoman.metadata import metadata_dtd_uri |
59 |
-from repoman._xml import XmlLint |
60 |
from repoman.modules.scan.scanbase import ScanBase |
61 |
|
62 |
from portage.exception import InvalidAtom |
63 |
@@ -104,13 +103,11 @@ class PkgMetadata(ScanBase, USEFlagChecks): |
64 |
repo_settings = kwargs.get('repo_settings') |
65 |
self.qatracker = kwargs.get('qatracker') |
66 |
self.options = kwargs.get('options') |
67 |
- metadata_xsd = kwargs.get('metadata_xsd') |
68 |
+ self.metadata_xsd = kwargs.get('metadata_xsd') |
69 |
self.globalUseFlags = kwargs.get('uselist') |
70 |
self.repoman_settings = repo_settings.repoman_settings |
71 |
self.musedict = {} |
72 |
self.muselist = set() |
73 |
- self.xmllint = XmlLint(self.options, self.repoman_settings, |
74 |
- metadata_xsd=metadata_xsd) |
75 |
|
76 |
def check(self, **kwargs): |
77 |
'''Performs the checks on the metadata.xml for the package |
78 |
@@ -123,7 +120,6 @@ class PkgMetadata(ScanBase, USEFlagChecks): |
79 |
xpkg = kwargs.get('xpkg') |
80 |
checkdir = kwargs.get('checkdir') |
81 |
checkdirlist = kwargs.get('checkdirlist').get() |
82 |
- repolevel = kwargs.get('repolevel') |
83 |
|
84 |
self.musedict = {} |
85 |
if self.options.mode in ['manifest']: |
86 |
@@ -205,7 +201,8 @@ class PkgMetadata(ScanBase, USEFlagChecks): |
87 |
|
88 |
# Only carry out if in package directory or check forced |
89 |
if not metadata_bad: |
90 |
- if not self.xmllint.check(checkdir, repolevel): |
91 |
+ validator = etree.XMLSchema(file=self.metadata_xsd) |
92 |
+ if not validator.validate(_metadata_xml): |
93 |
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml") |
94 |
del metadata_bad |
95 |
self.muselist = frozenset(self.musedict) |
96 |
|
97 |
diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py |
98 |
index fd07209..48d9001 100644 |
99 |
--- a/pym/repoman/scanner.py |
100 |
+++ b/pym/repoman/scanner.py |
101 |
@@ -10,6 +10,7 @@ from portage import normalize_path |
102 |
from portage import os |
103 |
from portage.output import green |
104 |
from portage.util.futures.extendedfutures import ExtendedFuture |
105 |
+from repoman.metadata import get_metadata_xsd |
106 |
from repoman.modules.commit import repochecks |
107 |
from repoman.profile import check_profiles, dev_profile_keywords, setup_profile |
108 |
from repoman.repos import repo_metadata |
109 |
@@ -56,13 +57,6 @@ class Scanner(object): |
110 |
portage.util.stack_lists([self.categories], incremental=1)) |
111 |
self.categories = self.repo_settings.repoman_settings.categories |
112 |
|
113 |
- metadata_xsd = None |
114 |
- for path in reversed(self.repo_settings.repo_config.eclass_db.porttrees): |
115 |
- path = os.path.join(path, 'metadata/xml-schema/metadata.xsd') |
116 |
- if os.path.exists(path): |
117 |
- metadata_xsd = path |
118 |
- break |
119 |
- |
120 |
self.portdb = repo_settings.portdb |
121 |
self.portdb.settings = self.repo_settings.repoman_settings |
122 |
# We really only need to cache the metadata that's necessary for visibility |
123 |
@@ -187,7 +181,7 @@ class Scanner(object): |
124 |
"qatracker": self.qatracker, |
125 |
"vcs_settings": self.vcs_settings, |
126 |
"options": self.options, |
127 |
- "metadata_xsd": metadata_xsd, |
128 |
+ "metadata_xsd": get_metadata_xsd(self.repo_settings), |
129 |
"uselist": uselist, |
130 |
"checks": checks, |
131 |
"repo_metadata": self.repo_metadata, |