Gentoo Archives: gentoo-commits

From: Brian Dolbec <dolsen@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/modules/scan/metadata/
Date: Tue, 03 May 2016 09:33:52
Message-Id: 1462266836.52bce5a348c68a5af0def40f399943d3b1d4f509.dolsen@gentoo
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,