[Rpm-metadata] 3 commits - createrepo.spec docs/modifyrepo.1 modifyrepo.py

skvidal at osuosl.org skvidal at osuosl.org
Thu Aug 19 19:37:51 UTC 2010


 createrepo.spec   |    5 +-
 docs/modifyrepo.1 |    9 ++--
 modifyrepo.py     |  116 +++++++++++++++++++++++++-----------------------------
 3 files changed, 64 insertions(+), 66 deletions(-)

New commits:
commit 00a3c8624e76bda962ecaefa0e77eb522ace64bc
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Thu Aug 19 15:36:57 2010 -0400

    require yum 3.2.28 due to the imports in modifyrepo

diff --git a/createrepo.spec b/createrepo.spec
index 19db77b..a0292cb 100644
--- a/createrepo.spec
+++ b/createrepo.spec
@@ -11,7 +11,7 @@ URL: http://createrepo.baseurl.org/
 BuildRoot: %{_tmppath}/%{name}-%{version}root
 BuildArchitectures: noarch
 Requires: python >= 2.1, rpm-python, rpm >= 0:4.1.1, libxml2-python
-Requires: yum-metadata-parser, yum >= 3.2.23, python-deltarpm
+Requires: yum-metadata-parser, yum >= 3.2.28, python-deltarpm
 
 %description
 This utility will generate a common metadata repository from a directory of
@@ -43,6 +43,9 @@ make DESTDIR=$RPM_BUILD_ROOT sysconfdir=%{_sysconfdir} install
 %{python_sitelib}/createrepo
 
 %changelog
+* Thu Aug 19 2010 Seth Vidal <skvidal at fedoraproject.org>
+- increase yum requirement for the modifyrepo use of RepoMD, RepoData and RepoMDError
+
 * Fri Aug 28 2009 Seth Vidal <skvidal at fedoraproject.org>
 - 0.9.8
 
commit 3906b3925f8d2cc646467b6f5717652d0b28bd75
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Thu Aug 19 15:36:46 2010 -0400

    document --mdtype option

diff --git a/docs/modifyrepo.1 b/docs/modifyrepo.1
index 6d16b15..cc031f5 100644
--- a/docs/modifyrepo.1
+++ b/docs/modifyrepo.1
@@ -4,7 +4,7 @@
 modifyrepo \- Modify a repomd (xml-rpm-metadata) repository
 
 .SH "SYNOPSIS"
-\fBmodifyrepo\fP <input metadata> <output repodata>
+\fBmodifyrepo\fP [options] <input metadata> <output repodata>
 .PP
 
 .SH "DESCRIPTION"
@@ -12,10 +12,10 @@ modifyrepo \- Modify a repomd (xml-rpm-metadata) repository
 
 .SH "EXAMPLES"
 .PP
-$ \fBmodifyrepo\fP metadata.xml /repository/repodata
+$ \fBmodifyrepo\fP --mdtype=newmd metadata.xml /repository/repodata
 .br
 Wrote: /repository/repodata/metadata.xml.gz
-           type = metadata
+           type = newmd
        location = repodata/metadata.xml.gz
        checksum = 1d7ee93db2964e7f85e07ec19b3204591da1050c
       timestamp = 1196716296.0
@@ -31,10 +31,11 @@ Wrote: /repository/repodata/repomd.xml
 .SH "AUTHORS"
 .nf 
 Luke Macken <lmacken at redhat.com>
+Seth Vidal <skvidal at fedoraproject.org>
 .fi 
 
 .PP 
 .SH "BUGS"
 Any bugs which are found should be emailed to the mailing list:
-rpm-metadata at linux.duke.edu
+rpm-metadata at lists.baseurl.org
 .fi
commit 3de378d2edbffddd8849517b515c215ec30e959c
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Thu Aug 19 15:35:48 2010 -0400

    - add option parsing for --mdtype
    - use the yum repomd objects to read/write the repomd.xml
    - add mdtype option to RepoMetadata.add() method

diff --git a/modifyrepo.py b/modifyrepo.py
index a5e779e..58ec930 100755
--- a/modifyrepo.py
+++ b/modifyrepo.py
@@ -23,11 +23,13 @@
 
 import os
 import sys
-
+from createrepo import __version__
 from createrepo.utils import checksum_and_rename, GzipFile, MDError
 from yum.misc import checksum
 
+from yum.repoMDObject import RepoMD, RepoMDError, RepoData
 from xml.dom import minidom
+from optparse import OptionParser
 
 
 class RepoMetadata:
@@ -37,23 +39,18 @@ class RepoMetadata:
         self.repodir = os.path.abspath(repo)
         self.repomdxml = os.path.join(self.repodir, 'repomd.xml')
         self.checksum_type = 'sha256'
+
         if not os.path.exists(self.repomdxml):
             raise MDError, '%s not found' % self.repomdxml
-        self.doc = minidom.parse(self.repomdxml)
-
-    def _insert_element(self, parent, name, attrs=None, text=None):
-        child = self.doc.createElement(name)
-        if not attrs:
-            attrs = {}
-        for item in attrs.items():
-            child.setAttribute(item[0], item[1])
-        if text:
-            txtnode = self.doc.createTextNode(text)
-            child.appendChild(txtnode)
-        parent.appendChild(child)
-        return child
-
-    def add(self, metadata):
+
+        try:
+            self.repoobj = RepoMD(self.repodir)
+            self.repoobj.parse(self.repomdxml)
+        except RepoMDError, e:
+            raise MDError, 'Could not parse %s' % self.repomdxml
+
+
+    def add(self, metadata, mdtype=None):
         """ Insert arbitrary metadata into this repository.
             metadata can be either an xml.dom.minidom.Document object, or
             a filename.
@@ -81,7 +78,9 @@ class RepoMetadata:
         ## Compress the metadata and move it into the repodata
         if not mdname.endswith('.gz'):
             mdname += '.gz'
-        mdtype = mdname.split('.')[0]
+        if not mdtype:
+            mdtype = mdname.split('.')[0]
+            
         destmd = os.path.join(self.repodir, mdname)
         newmd = GzipFile(filename=destmd, mode='wb')
         newmd.write(md)
@@ -89,65 +88,60 @@ class RepoMetadata:
         print "Wrote:", destmd
 
         open_csum = checksum(self.checksum_type, metadata)
-
-
         csum, destmd = checksum_and_rename(destmd, self.checksum_type)
         base_destmd = os.path.basename(destmd)
 
 
         ## Remove any stale metadata
-        for elem in self.doc.getElementsByTagName('data'):
-            if elem.attributes['type'].value == mdtype:
-                self.doc.firstChild.removeChild(elem)
-
-        ## Build the metadata
-        root = self.doc.firstChild
-        root.appendChild(self.doc.createTextNode("  "))
-        data = self._insert_element(root, 'data', attrs={ 'type' : mdtype })
-        data.appendChild(self.doc.createTextNode("\n    "))
-
-        self._insert_element(data, 'location',
-                             attrs={ 'href' : 'repodata/' + base_destmd })
-        data.appendChild(self.doc.createTextNode("\n    "))
-        self._insert_element(data, 'checksum',
-                             attrs={ 'type' : self.checksum_type },
-                             text=csum)
-        data.appendChild(self.doc.createTextNode("\n    "))
-        self._insert_element(data, 'timestamp',
-                             text=str(os.stat(destmd).st_mtime))
-        data.appendChild(self.doc.createTextNode("\n    "))
-        self._insert_element(data, 'open-checksum',
-                             attrs={ 'type' : self.checksum_type },
-                             text=open_csum)
-
-        data.appendChild(self.doc.createTextNode("\n  "))
-        root.appendChild(self.doc.createTextNode("\n"))
-
-        print "           type =", mdtype
-        print "       location =", 'repodata/' + mdname
-        print "       checksum =", csum
-        print "      timestamp =", str(os.stat(destmd).st_mtime)
-        print "  open-checksum =", open_csum
+        if mdtype in self.repoobj.repoData:
+            del self.repoobj.repoData[mdtype]
+            
+
+        new_rd = RepoData()
+        new_rd.type = mdtype
+        new_rd.location = (None, 'repodata/' + base_destmd)
+        new_rd.checksum = (self.checksum_type, csum)
+        new_rd.openchecksum = (self.checksum_type, open_csum)
+        new_rd.size = str(os.stat(destmd).st_size)
+        new_rd.timestamp = str(os.stat(destmd).st_mtime)
+        self.repoobj.repoData[new_rd.type] = new_rd
+        
+        print "           type =", new_rd.type
+        print "       location =", new_rd.location[1]
+        print "       checksum =", new_rd.checksum[1]
+        print "      timestamp =", new_rd.timestamp
+        print "  open-checksum =", new_rd.openchecksum[1]
 
         ## Write the updated repomd.xml
         outmd = file(self.repomdxml, 'w')
-        self.doc.writexml(outmd)
-        outmd.write("\n")
+        outmd.write(self.repoobj.dump_xml())
         outmd.close()
         print "Wrote:", self.repomdxml
 
 
-if __name__ == '__main__':
-    if len(sys.argv) != 3 or '-h' in sys.argv:
+def main(args):
+    parser = OptionParser(version='modifyrepo version %s' % __version__)
+    # query options
+    parser.add_option("--mdtype", dest='mdtype',
+                      help="specific datatype of the metadata, will be derived from the filename if not specified")
+    
+    (opts, argsleft) = parser.parse_args(args)
+    if len(argsleft) != 2:
         print "Usage: %s <input metadata> <output repodata>" % sys.argv[0]
-        sys.exit()
+        return 0
+    metadata = argsleft[0]
+    repodir = argsleft[1]
     try:
-        repomd = RepoMetadata(sys.argv[2])
+        repomd = RepoMetadata(repodir)
     except MDError, e:
         print "Could not access repository: %s" % str(e)
-        sys.exit(1)
+        return 1
     try:
-        repomd.add(sys.argv[1])
+        repomd.add(metadata, mdtype=opts.mdtype)
     except MDError, e:
-        print "Could not add metadata from file %s: %s" % (sys.argv[1], str(e))
-        sys.exit(1)
+        print "Could not add metadata from file %s: %s" % (metadata, str(e))
+        return 1
+
+if __name__ == '__main__':
+    ret = main(sys.argv[1:])
+    sys.exit(ret)


More information about the Rpm-metadata mailing list