[gentoo-portage-dev] [PATCH 3/4] repoman: Use XML Schema for metadata.xml validation
--- pym/repoman/_xml.py | 16 +- pym/repoman/metadata.py | 39 pym/repoman/modules/scan/metadata/__init__.py| 2 +- pym/repoman/modules/scan/metadata/pkgmetadata.py | 6 ++-- pym/repoman/scanner.py | 8 ++--- 5 files changed, 36 insertions(+), 35 deletions(-) diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py index d55dda5..33a536a 100644 --- a/pym/repoman/_xml.py +++ b/pym/repoman/_xml.py @@ -12,7 +12,7 @@ from portage import os from portage.output import red from portage.process import find_binary -from repoman.metadata import fetch_metadata_dtd +from repoman.metadata import fetch_metadata_xsd from repoman._subprocess import repoman_getstatusoutput @@ -53,12 +53,12 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder): class XmlLint(object): - def __init__(self, options, repoman_settings, metadata_dtd=None): - self.metadata_dtd = (metadata_dtd or - os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')) + def __init__(self, options, repoman_settings, metadata_xsd=None): + self.metadata_xsd = (metadata_xsd or + os.path.join(repoman_settings["DISTDIR"], 'metadata.xsd')) self.options = options self.repoman_settings = repoman_settings - self._is_capable = metadata_dtd is not None + self._is_capable = metadata_xsd is not None self.binary = None self._check_capable() @@ -69,7 +69,7 @@ class XmlLint(object): if not self.binary: print(red("!!! xmllint not found. Can't check metadata.xml.\n")) elif not self._is_capable: - if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings): + if not fetch_metadata_xsd(self.metadata_xsd, self.repoman_settings): sys.exit(1) # this can be problematic if xmllint changes their output self._is_capable = True @@ -93,8 +93,8 @@ class XmlLint(object): # xmlint can produce garbage output even on success, so only dump # the ouput when it fails. st, out = repoman_getstatusoutput( - self.binary + " --nonet --noout --dtdvalid %s %s" % ( - portage._shell_quote(self.metadata_dtd), + self.binary + " --nonet --noout --schema %s %s" % ( + portage._shell_quote(self.metadata_xsd), portage._shell_quote( os.path.join(checkdir, "metadata.xml" if st != os.EX_OK: diff --git a/pym/repoman/metadata.py b/pym/repoman/metadata.py index e95ad41..7a514dc 100644 --- a/pym/repoman/metadata.py +++ b/pym/repoman/metadata.py @@ -33,8 +33,9 @@ metadata_xml_declaration = '' \ % (metadata_xml_encoding,) metadata_doctype_name = 'pkgmetadata' metadata_dtd_uri = 'http://www.gentoo.org/dtd/metadata.dtd' +metadata_xsd_uri = 'http://www.gentoo.org/xml-schema/metadata.xsd' # force refetch if the local copy creation time is older than this -metadata_dtd_ctime_interval = 60 * 60 * 24 * 7 # 7 days +metadata_xsd_ctime_interval = 60 * 60 * 24 * 7 # 7 days def parse_metadata_use(xml_tree): @@ -86,36 +87,36 @@ def parse_metadata_use(xml_tree): return uselist -def fetch_metadata_dtd(metadata_dtd, repoman_settings): +def fetch_metadata_xsd(metadata_xsd, repoman_settings): """ - Fetch metadata.dtd if it doesn't exist or the ctime is older than - metadata_dtd_ctime_interval. + Fetch metadata.xsd if it doesn't exist or the ctime is older than + metadata_xsd_ctime_interval. @rtype: bool @return: True if successful, otherwise False """ must_fetch = True - metadata_dtd_st = None + metadata_xsd_st = None current_time = int(time.time()) try: - metadata_dtd_st = os.stat(metadata_dtd) + metadata_xsd_st = os.stat(metadata_xsd) except EnvironmentError as e: if e.errno not in (errno.ENOENT, errno.ESTALE): raise del e else: - # Trigger fetch if metadata.dtd mtime is old or clock is wrong. - if abs(current_time - metadata_dtd_st.st_ctime) \ - < metadata_dtd_ctime_interval: + # Trigger fetch if metadata.xsd mtime is old or clock is wrong. + if abs(current_time - metadata_xsd_st.st_ctime) \ + < metadata_xsd_ctime_interval: must_fetch = False if must_fetch: print() print( - "%s the
[gentoo-portage-dev] [PATCH 4/4] tests: Include metadata.xsd for repoman tests
--- .travis.yml | 4 +- MANIFEST.in | 2 +- cnf/metadata.dtd | 102 -- cnf/metadata.xsd | 547 +++ pym/portage/tests/repoman/test_simple.py | 8 +- 5 files changed, 554 insertions(+), 109 deletions(-) delete mode 100644 cnf/metadata.dtd create mode 100644 cnf/metadata.xsd diff --git a/.travis.yml b/.travis.yml index b662d94..5213fee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,8 +8,8 @@ python: script: - ./setup.py test - ./setup.py install --root=/tmp/install-root -# prevent repoman tests from trying to fetch metadata.dtd +# prevent repoman tests from trying to fetch metadata.xsd - mkdir -p /tmp/install-root/usr/lib/portage/cnf -- cp cnf/metadata.dtd /tmp/install-root/usr/lib/portage/cnf/ +- cp cnf/metadata.xsd /tmp/install-root/usr/lib/portage/cnf/ - sudo rsync -a /tmp/install-root/. / - python -b -Wd -m portage.tests.runTests diff --git a/MANIFEST.in b/MANIFEST.in index d65c874..2178460 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -12,7 +12,7 @@ include cnf/make.conf.example.* # extra files for tests include .portage_not_installed -include cnf/metadata.dtd +include cnf/metadata.xsd # extra scripts include misc/* diff --git a/cnf/metadata.dtd b/cnf/metadata.dtd deleted file mode 100644 index ff2649c..000 --- a/cnf/metadata.dtd +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cnf/metadata.xsd b/cnf/metadata.xsd new file mode 100644 index 000..0ead09e --- /dev/null +++ b/cnf/metadata.xsd @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[gentoo-portage-dev] [PATCH 1/4] tests: Stop using herds
--- pym/portage/tests/emerge/test_simple.py | 2 -- pym/portage/tests/repoman/test_simple.py | 3 --- pym/portage/tests/resolver/ResolverPlayground.py | 22 -- 3 files changed, 27 deletions(-) diff --git a/pym/portage/tests/emerge/test_simple.py b/pym/portage/tests/emerge/test_simple.py index 394ed43..e5ecd4b 100644 --- a/pym/portage/tests/emerge/test_simple.py +++ b/pym/portage/tests/emerge/test_simple.py @@ -153,14 +153,12 @@ pkg_preinst() { ( "dev-libs/A", { - "herd" : "base-system", "flags" : "Description of how USE='flag' affects this package", }, ), ( "dev-libs/B", { - "herd" : "no-herd", "flags" : "Description of how USE='flag' affects this package", }, ), diff --git a/pym/portage/tests/repoman/test_simple.py b/pym/portage/tests/repoman/test_simple.py index 98220c4..720560b 100644 --- a/pym/portage/tests/repoman/test_simple.py +++ b/pym/portage/tests/repoman/test_simple.py @@ -133,21 +133,18 @@ class SimpleRepomanTestCase(TestCase): ( "dev-libs/A", { - "herd" : "base-system", "flags" : "Description of how USE='flag' affects this package", }, ), ( "dev-libs/B", { - "herd" : "no-herd", "flags" : "Description of how USE='flag' affects this package", }, ), ( "dev-libs/C", { - "herd" : "no-herd", "flags" : "Description of how USE='flag' affects this package", }, ), diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py index 6bdf2c7..68e047a 100644 --- a/pym/portage/tests/resolver/ResolverPlayground.py +++ b/pym/portage/tests/resolver/ResolverPlayground.py @@ -47,7 +47,6 @@ class ResolverPlayground(object): metadata_xml_template = """ http://www.gentoo.org/dtd/metadata.dtd;> -%(herd)s maintainer-nee...@gentoo.org Description of the maintainership @@ -381,27 +380,6 @@ class ResolverPlayground(object): #Create profile symlink os.symlink(sub_profile_dir, os.path.join(user_config_dir, "make.profile")) - #Create minimal herds.xml - herds_xml = """ -http://www.gentoo.org/dtd/herds.dtd;> - - - - - base-system - base-sys...@gentoo.org - Core system utilities and libraries. - -base-sys...@gentoo.orgg -Base System -Base System Maintainer - - - -""" - with open(os.path.join(metadata_dir, "metadata.xml"), 'w') as f: - f.write(herds_xml) - make_conf = { "ACCEPT_KEYWORDS": "x86", "CLEAN_DELAY": "0", -- 2.8.1
[gentoo-portage-dev] [PATCH 2/4] tests: Add type="" to
--- pym/portage/tests/resolver/ResolverPlayground.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py index 68e047a..d1434f7 100644 --- a/pym/portage/tests/resolver/ResolverPlayground.py +++ b/pym/portage/tests/resolver/ResolverPlayground.py @@ -47,7 +47,7 @@ class ResolverPlayground(object): metadata_xml_template = """ http://www.gentoo.org/dtd/metadata.dtd;> - + maintainer-nee...@gentoo.org Description of the maintainership -- 2.8.1
[gentoo-portage-dev] [PATCH 0/4] GLEP 67 + XML Schema, rebased against repoman
Same as before, rebased on top of repoman branch. Tested on git-mirror checkout (with metadata/xml-schema dir) and local git checkout (fetching from www). Travis also seems happy. Michał Górny (4): tests: Stop using herds tests: Add type="" to repoman: Use XML Schema for metadata.xml validation tests: Include metadata.xsd for repoman tests .travis.yml | 4 +- MANIFEST.in | 2 +- cnf/metadata.dtd | 102 - cnf/metadata.xsd | 547 +++ pym/portage/tests/emerge/test_simple.py | 2 - pym/portage/tests/repoman/test_simple.py | 11 +- pym/portage/tests/resolver/ResolverPlayground.py | 24 +- pym/repoman/_xml.py | 16 +- pym/repoman/metadata.py | 39 +- pym/repoman/modules/scan/metadata/__init__.py| 2 +- pym/repoman/modules/scan/metadata/pkgmetadata.py | 6 +- pym/repoman/scanner.py | 8 +- 12 files changed, 591 insertions(+), 172 deletions(-) delete mode 100644 cnf/metadata.dtd create mode 100644 cnf/metadata.xsd -- 2.8.1