[gentoo-portage-dev] [PATCH 3/4] repoman: Use XML Schema for metadata.xml validation

2016-04-17 Thread Michał Górny
---
 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

2016-04-17 Thread Michał Górny
---
 .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

2016-04-17 Thread Michał Górny
---
 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

2016-04-17 Thread Michał Górny
---
 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

2016-04-17 Thread Michał Górny
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