commit:     275ac5e04bb296394c308bdd6dfd92ac51cfbd42
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Apr 17 08:06:29 2016 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Mon Apr 25 15:28:53 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=275ac5e0

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(-)

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..0000000
--- a/cnf/metadata.dtd
+++ /dev/null
@@ -1,102 +0,0 @@
-<!ELEMENT packages ( pkgmetadata* )>
-
-<!-- Metadata for a category -->
-<!ELEMENT catmetadata ( (longdescription)* )>
-<!ATTLIST catmetadata pkgname CDATA "">
-
-<!-- Metadata for a package -->
-<!ELEMENT pkgmetadata ( 
(herd|maintainer|natural-name|longdescription|use|upstream)* )>
-<!ATTLIST pkgmetadata pkgname CDATA "">
-
-  <!-- One tag for each herd this package is assigned to. -->
-  <!ELEMENT herd (#PCDATA)>
-
-  <!-- One tag for each maintainer of a package, multiple allowed-->
-  <!ELEMENT maintainer ( email, (description| name)* )>
-
-  <!-- Natural name for package, example: LibreOffice (for 
app-office/libreoffice) -->
-  <!ELEMENT natural-name (#PCDATA) >
-
-  <!-- A long description of the package in freetext-->
-  <!ELEMENT longdescription (#PCDATA|pkg|cat)* >
-
-  <!-- The changelog of the package-->
-  <!-- Please note that #PCDATA is mentioned only for the upstream changelog
-    element, where the content is a URL. This is due to limitations of the DTD 
-->
-  <!ELEMENT changelog (#PCDATA|change)* >
-    <!-- The changelog contains various "changes"-->
-    <!ELEMENT change 
(date,(developer|version|description|file|contributor|bug)*) >
-      <!ELEMENT date (#PCDATA) >
-        <!-- The date of the change, in "YYYY-MM-DD" format -->
-      <!ELEMENT developer (name?,email) >
-        <!-- The developer that made the change. The email is required, name
-          is optional-->
-      <!ELEMENT version (#PCDATA) >
-        <!--version of the packages involved (one tag per version)-->
-      <!ELEMENT file (#PCDATA) ><!-- one tag per file touched -->
-      <!ELEMENT contributor (name?,email?) >
-        <!-- A reference to a user that helped in causing this change. 
-          There should at least be a name or email address included. 
-          Email is preferred -->
-      <!ELEMENT bug (#PCDATA) >
-        <!-- bug-id of a bug fixed by this change, multiple allowed. The 
-          format of this is a number or alias for a bug. NOT including a 
-          # character -->
-
-  <!-- description of what this USE flag does for this package -->
-  <!ELEMENT use (flag)* >
-    <!ELEMENT flag (#PCDATA|pkg|cat)* >
-      <!-- name attribute holds the name of the USE flag -->
-      <!ATTLIST flag name CDATA #REQUIRED >
-
-  <!-- upstream metadata information (maintainers, upstream docs,..) -->
-  <!ELEMENT upstream (maintainer|changelog|doc|bugs-to|remote-id)* >
-    <!-- Due to the limitation of DTD this will also allow a status
-      attribute for the package maintainer element. Please note that
-      the usage of the status attribute is nevertheless _only_ allowed
-      in the upstream maintainer element. -->
-    <!ATTLIST maintainer status (active|inactive|unknown) "unknown" >
-    <!-- URL where the location of the upstream documentation can be found -->
-    <!ELEMENT doc (#PCDATA)>
-      <!ATTLIST doc lang CDATA "C" >
-    <!-- location where to report bugs
-      (may also be an email address prefixed with mailto:) -->
-    <!ELEMENT bugs-to (#PCDATA)>
-    <!-- specify a type of package identification tracker -->
-    <!ELEMENT remote-id (#PCDATA)>
-      <!ATTLIST remote-id type 
(bitbucket|cpan|cpan-module|cpe|cran|ctan|freecode|freshmeat|github|gitorious|google-code|launchpad|pear|pecl|pypi|rubyforge|rubygems|sourceforge|sourceforge-jp|vim)
 #REQUIRED>
-
-  <!-- category/package information for cross-linking in descriptions
-    and useflag descriptions -->
-  <!ELEMENT pkg (#PCDATA) >
-  <!ELEMENT cat (#PCDATA) >
-          
-<!-- Common attributes -->
-
-<!-- the lang attribute, specifies the language of this tag. This is 
-  only useful for descriptions of various kinds. If a tag with this 
-  attribute is included there must be a description in the default 
-  language "C" or "en", which is equivalent -->
-  <!ATTLIST description lang CDATA "C" >
-  <!ATTLIST longdescription lang CDATA "C" >
-  <!ATTLIST use lang CDATA "C" >
-
-<!-- The restrict attribute, this attribute specifies restrictions on 
-  the applicability of tags on versions. The format of this attribute is 
-  equal to the format of DEPEND lines in ebuilds. There is one special 
-  value though: restrict="*". A tag that specifies this only applies if 
-  there are no other tags that apply.
-  
-  For required tags, there must be either an unrestricted version, or a 
-  version that is default restricted. -->
-  <!ATTLIST herd restrict CDATA #IMPLIED >
-  <!ATTLIST maintainer restrict CDATA #IMPLIED >
-  <!ATTLIST longdescription restrict CDATA #IMPLIED >
-  <!ATTLIST flag restrict CDATA #IMPLIED >
-
-
-
-<!-- standard parts -->
-<!ELEMENT email (#PCDATA) ><!-- an email address -->
-<!ELEMENT name (#PCDATA) ><!-- the name of a person (maintainer, 
contributor)-->
-<!ELEMENT description (#PCDATA) ><!-- A description of a maintainer or 
change-->

diff --git a/cnf/metadata.xsd b/cnf/metadata.xsd
new file mode 100644
index 0000000..0ead09e
--- /dev/null
+++ b/cnf/metadata.xsd
@@ -0,0 +1,547 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+       <!-- top-level variants -->
+       <xs:element name='pkgmetadata' type='pkgMetadataType'>
+               <!-- note: restrict uniquity rules are simplified
+                        the spec says: one for each matched package
+                        we can only do: one for each restrict rule -->
+               <xs:unique name='longDescUniquityConstraint'>
+                       <xs:selector xpath='longdescription'/>
+                       <xs:field xpath='@lang'/>
+                       <xs:field xpath='@restrict'/>
+               </xs:unique>
+               <xs:unique name='maintainerUniquityConstraint'>
+                       <xs:selector xpath='maintainer'/>
+                       <xs:field xpath='email'/>
+                       <xs:field xpath='@restrict'/>
+               </xs:unique>
+               <xs:unique name='slotsUniquityConstraint'>
+                       <xs:selector xpath='slots'/>
+                       <xs:field xpath='@lang'/>
+               </xs:unique>
+               <xs:unique name='upstreamSingleConstraint'>
+                       <xs:selector xpath='upstream'/>
+                       <xs:field xpath='@fake-only-once'/>
+               </xs:unique>
+               <xs:unique name='useUniquityConstraint'>
+                       <xs:selector xpath='use'/>
+                       <xs:field xpath='@lang'/>
+               </xs:unique>
+       </xs:element>
+       <xs:element name='catmetadata' type='catMetadataType'>
+               <xs:unique name='catLongDescUniquityConstraint'>
+                       <xs:selector xpath='longdescription'/>
+                       <xs:field xpath='@lang'/>
+               </xs:unique>
+       </xs:element>
+
+       <!-- global elements -->
+       <xs:complexType name='pkgMetadataType'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='longdescription' type='longDescType'/>
+                       <xs:element name='maintainer' type='maintainerType'>
+                               <xs:unique 
name='maintainerDescUniquityConstraint'>
+                                       <xs:selector xpath='description'/>
+                                       <xs:field xpath='@lang'/>
+                               </xs:unique>
+                       </xs:element>
+                       <xs:element name='slots' type='slotsType'>
+                               <xs:unique name='slotUniquityConstraint'>
+                                       <xs:selector xpath='slot'/>
+                                       <xs:field xpath='@name'/>
+                               </xs:unique>
+                               <xs:unique name='subslotsSingleConstraint'>
+                                       <xs:selector xpath='subslots'/>
+                                       <xs:field xpath='@fake-only-once'/>
+                               </xs:unique>
+                       </xs:element>
+                       <xs:element name='upstream' type='upstreamType'>
+                               <xs:unique name='bugsToSingleConstraint'>
+                                       <xs:selector xpath='bugs-to'/>
+                                       <xs:field xpath='@fake-only-once'/>
+                               </xs:unique>
+                               <xs:unique name='changelogSingleConstraint'>
+                                       <xs:selector xpath='changelog'/>
+                                       <xs:field xpath='@fake-only-once'/>
+                               </xs:unique>
+                               <!-- prevent accidentally repeating the same 
remote -->
+                               <xs:unique 
name='upstreamRemoteIdRepetitionConstraint'>
+                                       <xs:selector xpath='remote-id'/>
+                                       <xs:field xpath='@type'/>
+                                       <xs:field xpath='.'/>
+                               </xs:unique>
+                               <xs:unique name='upstreamDocUniquityConstraint'>
+                                       <xs:selector xpath='doc'/>
+                                       <xs:field xpath='@lang'/>
+                               </xs:unique>
+                       </xs:element>
+                       <xs:element name='use' type='useType'>
+                               <xs:unique name='flagUniquityConstraint'>
+                                       <xs:selector xpath='flag'/>
+                                       <xs:field xpath='@name'/>
+                                       <xs:field xpath='@restrict'/>
+                               </xs:unique>
+                       </xs:element>
+               </xs:choice>
+       </xs:complexType>
+
+       <xs:complexType name='catMetadataType'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='longdescription' 
type='catLongDescType'/>
+               </xs:choice>
+       </xs:complexType>
+
+       <!-- the huge <upstream/> structure -->
+       <xs:complexType name='upstreamType'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='maintainer' 
type='upstreamMaintainerType'>
+                               <xs:unique 
name='upstreamMaintainerUniquityConstraint'>
+                                       <xs:selector xpath='maintainer'/>
+                                       <xs:field xpath='name'/>
+                               </xs:unique>
+                       </xs:element>
+                       <xs:element name='changelog' type='urlOnceType'/>
+                       <xs:element name='doc' type='upstreamDocType'/>
+                       <xs:element name='bugs-to' type='urlOnceType'/>
+                       <xs:element name='remote-id' 
type='upstreamRemoteIdType'/>
+               </xs:choice>
+               <xs:attribute name='fake-only-once'
+                       fixed='there can be at most one &lt;upstream/&gt; 
element'/>
+       </xs:complexType>
+
+       <!-- maintainer in two variants -->
+       <xs:complexType name='maintainerType'>
+               <xs:all>
+                       <xs:element name='email' type='emailType'
+                               minOccurs='1'/>
+                       <xs:element name='name' type='xs:token'
+                               minOccurs='0'/>
+                       <xs:element name='description' type='maintainerDescType'
+                               minOccurs='0'/>
+               </xs:all>
+               <xs:attribute name='type' type='maintainerTypeAttrType'
+                       use='required'/>
+               <xs:attribute name='restrict' type='restrictAttrType'/>
+       </xs:complexType>
+
+       <xs:simpleType name='maintainerTypeAttrType'>
+               <xs:restriction base='xs:token'>
+                       <xs:enumeration value='person'/>
+                       <xs:enumeration value='project'/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name='upstreamMaintainerType'>
+               <xs:all>
+                       <xs:element name='email' type='emailType'
+                               minOccurs='0'/>
+                       <xs:element name='name' type='xs:token'
+                               minOccurs='0'/>
+               </xs:all>
+               <xs:attribute name='status' 
type='upstreamMaintainerStatusAttrType'
+                       default='unknown'/>
+       </xs:complexType>
+
+       <xs:simpleType name='upstreamMaintainerStatusAttrType'>
+               <xs:restriction base='xs:token'>
+                       <xs:enumeration value='active'/>
+                       <xs:enumeration value='inactive'/>
+                       <xs:enumeration value='unknown'/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name='maintainerDescType'>
+               <xs:simpleContent>
+                       <xs:extension base="xs:token">
+                               <xs:attribute name='lang' type='langAttrType' 
default='en'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+
+       <!-- long description -->
+       <xs:complexType name='longDescType' mixed='true'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='pkg' type='pkgType'/>
+                       <xs:element name='cat' type='catType'/>
+               </xs:choice>
+               <xs:attribute name='lang' type='langAttrType' default='en'/>
+               <xs:attribute name='restrict' type='restrictAttrType'/>
+       </xs:complexType>
+
+       <xs:complexType name='catLongDescType' mixed='true'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='pkg' type='pkgType'/>
+                       <xs:element name='cat' type='catType'/>
+               </xs:choice>
+               <xs:attribute name='lang' type='langAttrType' default='en'/>
+       </xs:complexType>
+
+       <!-- slots -->
+       <xs:complexType name='slotsType'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='slot' type='slotType'/>
+                       <xs:element name='subslots' type='tokenOnceType'/>
+               </xs:choice>
+               <xs:attribute name='lang' type='langAttrType' default='en'/>
+       </xs:complexType>
+
+       <xs:complexType name='slotType'>
+               <xs:simpleContent>
+                       <xs:extension base="xs:token">
+                               <xs:attribute name='name' 
type='slotNameAttrType'
+                                       use='required'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+
+       <xs:simpleType name='slotNameAttrType'>
+               <xs:restriction base='xs:token'>
+                       <!-- PMS 3.1.3 Slot Names + special value '*' -->
+                       <xs:pattern value="[A-Za-z0-9_][A-Za-z0-9+_.-]*|[*]"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <!-- use flags -->
+       <xs:complexType name='useType'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='flag' type='flagType'/>
+               </xs:choice>
+               <xs:attribute name='lang' type='langAttrType' default='en'/>
+       </xs:complexType>
+
+       <xs:complexType name='flagType' mixed='true'>
+               <xs:choice minOccurs='0' maxOccurs='unbounded'>
+                       <xs:element name='cat' type='catType'/>
+                       <xs:element name='pkg' type='pkgType'/>
+               </xs:choice>
+               <xs:attribute name='name' type='flagNameAttrType'
+                       use='required'/>
+               <xs:attribute name='restrict' type='restrictAttrType'
+                       default=''/>
+       </xs:complexType>
+
+       <xs:simpleType name='flagNameAttrType'>
+               <xs:restriction base='xs:token'>
+                       <!-- PMS 3.1.4 USE Flag Names -->
+                       <xs:pattern value="[A-Za-z0-9][A-Za-z0-9+_@-]*"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <!-- upstream-specific types -->
+       <xs:complexType name='upstreamDocType'>
+               <xs:simpleContent>
+                       <xs:extension base="urlType">
+                               <xs:attribute name='lang' type='langAttrType' 
default='en'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+
+       <xs:complexType name='upstreamRemoteIdType'>
+               <xs:simpleContent>
+                       <xs:extension base="xs:token">
+                               <xs:attribute name='type' 
type='upstreamRemoteIdTypeAttrType'
+                                       use='required'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+
+       <xs:simpleType name='upstreamRemoteIdTypeAttrType'>
+               <xs:restriction base='xs:token'>
+                       <xs:enumeration value='bitbucket'/>
+                       <xs:enumeration value='cpan'/>
+                       <xs:enumeration value='cpan-module'/>
+                       <xs:enumeration value='cpe'/>
+                       <xs:enumeration value='cran'/>
+                       <xs:enumeration value='ctan'/>
+                       <xs:enumeration value='freecode'/>
+                       <xs:enumeration value='freshmeat'/>
+                       <xs:enumeration value='github'/>
+                       <xs:enumeration value='gitlab'/>
+                       <xs:enumeration value='gitorious'/>
+                       <xs:enumeration value='google-code'/>
+                       <xs:enumeration value='launchpad'/>
+                       <xs:enumeration value='pear'/>
+                       <xs:enumeration value='pecl'/>
+                       <xs:enumeration value='pypi'/>
+                       <xs:enumeration value='rubyforge'/>
+                       <xs:enumeration value='rubygems'/>
+                       <xs:enumeration value='sourceforge'/>
+                       <xs:enumeration value='sourceforge-jp'/>
+                       <xs:enumeration value='vim'/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <!-- creepy mixed-text types -->
+       <xs:simpleType name='catType'>
+               <xs:restriction base='xs:token'>
+                       <!-- PMS 3.1.1 Category Names -->
+                       <xs:pattern value="[A-Za-z0-9_][A-Za-z0-9+_.-]*"/>
+               </xs:restriction>
+       </xs:simpleType>
+       <xs:simpleType name='pkgType'>
+               <xs:restriction base='xs:token'>
+                       <!-- PMS 3.1.1 Category Names + 3.1.2 Package Names -->
+                       <!-- note: this does not enforce the 'anything matching
+                                the version syntax' requirement -->
+                       <xs:pattern
+                               
value="[A-Za-z0-9_][A-Za-z0-9+_.-]*/[A-Za-z0-9_][A-Za-z0-9+_-]*"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <!-- common attributes -->
+       <xs:simpleType name='langAttrType'>
+               <xs:restriction base='xs:token'>
+                       <!-- ISO 639-1 language codes -->
+                       <xs:enumeration value='aa'/>
+                       <xs:enumeration value='ab'/>
+                       <xs:enumeration value='ae'/>
+                       <xs:enumeration value='af'/>
+                       <xs:enumeration value='ak'/>
+                       <xs:enumeration value='am'/>
+                       <xs:enumeration value='an'/>
+                       <xs:enumeration value='ar'/>
+                       <xs:enumeration value='as'/>
+                       <xs:enumeration value='av'/>
+                       <xs:enumeration value='ay'/>
+                       <xs:enumeration value='az'/>
+                       <xs:enumeration value='ba'/>
+                       <xs:enumeration value='be'/>
+                       <xs:enumeration value='bg'/>
+                       <xs:enumeration value='bh'/>
+                       <xs:enumeration value='bi'/>
+                       <xs:enumeration value='bm'/>
+                       <xs:enumeration value='bn'/>
+                       <xs:enumeration value='bo'/>
+                       <xs:enumeration value='bo'/>
+                       <xs:enumeration value='br'/>
+                       <xs:enumeration value='bs'/>
+                       <xs:enumeration value='ca'/>
+                       <xs:enumeration value='ce'/>
+                       <xs:enumeration value='ch'/>
+                       <xs:enumeration value='co'/>
+                       <xs:enumeration value='cr'/>
+                       <xs:enumeration value='cs'/>
+                       <xs:enumeration value='cs'/>
+                       <xs:enumeration value='cu'/>
+                       <xs:enumeration value='cv'/>
+                       <xs:enumeration value='cy'/>
+                       <xs:enumeration value='cy'/>
+                       <xs:enumeration value='da'/>
+                       <xs:enumeration value='de'/>
+                       <xs:enumeration value='de'/>
+                       <xs:enumeration value='dv'/>
+                       <xs:enumeration value='dz'/>
+                       <xs:enumeration value='ee'/>
+                       <xs:enumeration value='el'/>
+                       <xs:enumeration value='el'/>
+                       <xs:enumeration value='en'/>
+                       <xs:enumeration value='eo'/>
+                       <xs:enumeration value='es'/>
+                       <xs:enumeration value='et'/>
+                       <xs:enumeration value='eu'/>
+                       <xs:enumeration value='eu'/>
+                       <xs:enumeration value='fa'/>
+                       <xs:enumeration value='fa'/>
+                       <xs:enumeration value='ff'/>
+                       <xs:enumeration value='fi'/>
+                       <xs:enumeration value='fj'/>
+                       <xs:enumeration value='fo'/>
+                       <xs:enumeration value='fr'/>
+                       <xs:enumeration value='fr'/>
+                       <xs:enumeration value='fy'/>
+                       <xs:enumeration value='ga'/>
+                       <xs:enumeration value='ga'/>
+                       <xs:enumeration value='Ga'/>
+                       <xs:enumeration value='gd'/>
+                       <xs:enumeration value='gl'/>
+                       <xs:enumeration value='gn'/>
+                       <xs:enumeration value='gu'/>
+                       <xs:enumeration value='gv'/>
+                       <xs:enumeration value='ha'/>
+                       <xs:enumeration value='he'/>
+                       <xs:enumeration value='hi'/>
+                       <xs:enumeration value='ho'/>
+                       <xs:enumeration value='hr'/>
+                       <xs:enumeration value='ht'/>
+                       <xs:enumeration value='hu'/>
+                       <xs:enumeration value='hy'/>
+                       <xs:enumeration value='hy'/>
+                       <xs:enumeration value='hz'/>
+                       <xs:enumeration value='ia'/>
+                       <xs:enumeration value='id'/>
+                       <xs:enumeration value='ie'/>
+                       <xs:enumeration value='ig'/>
+                       <xs:enumeration value='ii'/>
+                       <xs:enumeration value='ik'/>
+                       <xs:enumeration value='io'/>
+                       <xs:enumeration value='is'/>
+                       <xs:enumeration value='is'/>
+                       <xs:enumeration value='it'/>
+                       <xs:enumeration value='iu'/>
+                       <xs:enumeration value='ja'/>
+                       <xs:enumeration value='jv'/>
+                       <xs:enumeration value='ka'/>
+                       <xs:enumeration value='ka'/>
+                       <xs:enumeration value='kg'/>
+                       <xs:enumeration value='ki'/>
+                       <xs:enumeration value='kj'/>
+                       <xs:enumeration value='kk'/>
+                       <xs:enumeration value='kl'/>
+                       <xs:enumeration value='km'/>
+                       <xs:enumeration value='kn'/>
+                       <xs:enumeration value='ko'/>
+                       <xs:enumeration value='kr'/>
+                       <xs:enumeration value='ks'/>
+                       <xs:enumeration value='ku'/>
+                       <xs:enumeration value='kv'/>
+                       <xs:enumeration value='kw'/>
+                       <xs:enumeration value='ky'/>
+                       <xs:enumeration value='la'/>
+                       <xs:enumeration value='lb'/>
+                       <xs:enumeration value='lg'/>
+                       <xs:enumeration value='li'/>
+                       <xs:enumeration value='ln'/>
+                       <xs:enumeration value='lo'/>
+                       <xs:enumeration value='lt'/>
+                       <xs:enumeration value='lu'/>
+                       <xs:enumeration value='lv'/>
+                       <xs:enumeration value='mg'/>
+                       <xs:enumeration value='mh'/>
+                       <xs:enumeration value='mi'/>
+                       <xs:enumeration value='mi'/>
+                       <xs:enumeration value='mk'/>
+                       <xs:enumeration value='mk'/>
+                       <xs:enumeration value='ml'/>
+                       <xs:enumeration value='mn'/>
+                       <xs:enumeration value='mr'/>
+                       <xs:enumeration value='ms'/>
+                       <xs:enumeration value='ms'/>
+                       <xs:enumeration value='mt'/>
+                       <xs:enumeration value='my'/>
+                       <xs:enumeration value='my'/>
+                       <xs:enumeration value='na'/>
+                       <xs:enumeration value='nb'/>
+                       <xs:enumeration value='nd'/>
+                       <xs:enumeration value='ne'/>
+                       <xs:enumeration value='ng'/>
+                       <xs:enumeration value='nl'/>
+                       <xs:enumeration value='nl'/>
+                       <xs:enumeration value='nn'/>
+                       <xs:enumeration value='no'/>
+                       <xs:enumeration value='nr'/>
+                       <xs:enumeration value='nv'/>
+                       <xs:enumeration value='ny'/>
+                       <xs:enumeration value='oc'/>
+                       <xs:enumeration value='oj'/>
+                       <xs:enumeration value='om'/>
+                       <xs:enumeration value='or'/>
+                       <xs:enumeration value='os'/>
+                       <xs:enumeration value='pa'/>
+                       <xs:enumeration value='pi'/>
+                       <xs:enumeration value='pl'/>
+                       <xs:enumeration value='ps'/>
+                       <xs:enumeration value='pt'/>
+                       <xs:enumeration value='qu'/>
+                       <xs:enumeration value='rm'/>
+                       <xs:enumeration value='rn'/>
+                       <xs:enumeration value='ro'/>
+                       <xs:enumeration value='ro'/>
+                       <xs:enumeration value='ru'/>
+                       <xs:enumeration value='rw'/>
+                       <xs:enumeration value='sa'/>
+                       <xs:enumeration value='sc'/>
+                       <xs:enumeration value='sd'/>
+                       <xs:enumeration value='se'/>
+                       <xs:enumeration value='sg'/>
+                       <xs:enumeration value='si'/>
+                       <xs:enumeration value='sk'/>
+                       <xs:enumeration value='sk'/>
+                       <xs:enumeration value='sl'/>
+                       <xs:enumeration value='sm'/>
+                       <xs:enumeration value='sn'/>
+                       <xs:enumeration value='so'/>
+                       <xs:enumeration value='sq'/>
+                       <xs:enumeration value='sq'/>
+                       <xs:enumeration value='sr'/>
+                       <xs:enumeration value='ss'/>
+                       <xs:enumeration value='st'/>
+                       <xs:enumeration value='su'/>
+                       <xs:enumeration value='sv'/>
+                       <xs:enumeration value='sw'/>
+                       <xs:enumeration value='ta'/>
+                       <xs:enumeration value='te'/>
+                       <xs:enumeration value='tg'/>
+                       <xs:enumeration value='th'/>
+                       <xs:enumeration value='ti'/>
+                       <xs:enumeration value='tk'/>
+                       <xs:enumeration value='tl'/>
+                       <xs:enumeration value='tn'/>
+                       <xs:enumeration value='to'/>
+                       <xs:enumeration value='tr'/>
+                       <xs:enumeration value='ts'/>
+                       <xs:enumeration value='tt'/>
+                       <xs:enumeration value='tw'/>
+                       <xs:enumeration value='ty'/>
+                       <xs:enumeration value='ug'/>
+                       <xs:enumeration value='uk'/>
+                       <xs:enumeration value='ur'/>
+                       <xs:enumeration value='uz'/>
+                       <xs:enumeration value='ve'/>
+                       <xs:enumeration value='vi'/>
+                       <xs:enumeration value='vo'/>
+                       <xs:enumeration value='wa'/>
+                       <xs:enumeration value='wo'/>
+                       <xs:enumeration value='xh'/>
+                       <xs:enumeration value='yi'/>
+                       <xs:enumeration value='yo'/>
+                       <xs:enumeration value='za'/>
+                       <xs:enumeration value='zh'/>
+                       <xs:enumeration value='zh'/>
+                       <xs:enumeration value='zu'/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:simpleType name='restrictAttrType'>
+               <xs:restriction base='xs:token'>
+                       <!-- simplified package dependency syntax -->
+                       <!-- note: 'pure' package atom is technically valid too
+                                but not really meaningful -->
+                       <xs:pattern
+                               
value="(([&lt;&gt;]=?|[=~])[A-Za-z0-9_][A-Za-z0-9+_.-]*/[A-Za-z0-9_][A-Za-z0-9+_-]*-[0-9]+(\.[0-9]+)*[a-z]?((_alpha|_beta|_pre|_rc|_p)[0-9]*)*(-r[0-9]+)?\*?)?"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <!-- generic types -->
+       <xs:simpleType name='emailType'>
+               <xs:restriction base='xs:token'>
+                       <!-- minimal safe regex -->
+                       <xs:pattern value="[^@]+@[^.]+\..+"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name='tokenOnceType'>
+               <xs:simpleContent>
+                       <xs:extension base="xs:token">
+                               <xs:attribute name='fake-only-once'
+                                       fixed='there can be at most one element 
of this type'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+
+       <xs:simpleType name='urlType'>
+               <xs:restriction base='xs:token'>
+                       <!-- TODO: something better? -->
+                       <xs:pattern 
value="(mailto:[^@]+@[^.]+\..+|https?://.+)"/>
+               </xs:restriction>
+       </xs:simpleType>
+
+       <xs:complexType name='urlOnceType'>
+               <xs:simpleContent>
+                       <xs:extension base="urlType">
+                               <xs:attribute name='fake-only-once'
+                                       fixed='there can be at most one element 
of this type'/>
+                       </xs:extension>
+               </xs:simpleContent>
+       </xs:complexType>
+</xs:schema>

diff --git a/pym/portage/tests/repoman/test_simple.py 
b/pym/portage/tests/repoman/test_simple.py
index 720560b..6a79761 100644
--- a/pym/portage/tests/repoman/test_simple.py
+++ b/pym/portage/tests/repoman/test_simple.py
@@ -128,7 +128,7 @@ class SimpleRepomanTestCase(TestCase):
                }
                licenses = ["GPL-2"]
                arch_list = ["x86"]
-               metadata_dtd = os.path.join(PORTAGE_BASE_PATH, 
"cnf/metadata.dtd")
+               metadata_xsd = os.path.join(PORTAGE_BASE_PATH, 
"cnf/metadata.xsd")
                metadata_xml_files = (
                        (
                                "dev-libs/A",
@@ -269,9 +269,9 @@ class SimpleRepomanTestCase(TestCase):
                        # involving canonical vs. non-canonical paths.
                        test_repo_symlink = os.path.join(eroot, 
"test_repo_symlink")
                        os.symlink(test_repo_location, test_repo_symlink)
-                       metadata_dtd_dest = os.path.join(test_repo_location, 
'metadata/dtd/metadata.dtd')
-                       os.makedirs(os.path.dirname(metadata_dtd_dest))
-                       os.symlink(metadata_dtd, metadata_dtd_dest)
+                       metadata_xsd_dest = os.path.join(test_repo_location, 
'metadata/xml-schema/metadata.xsd')
+                       os.makedirs(os.path.dirname(metadata_xsd_dest))
+                       os.symlink(metadata_xsd, metadata_xsd_dest)
 
                        if debug:
                                # The subprocess inherits both stdout and 
stderr, for

Reply via email to