3 commits - createrepo.spec docs/modifyrepo.1 modifyrepo.py
[email protected] Thu, 19 Aug 2010 19:37:51 +0000 (UTC)
| Newsgroups | gmane.linux.rpm.metadata |
|---|---|
| Message-ID | <[email protected]> |
createrepo.spec | 5 +- docs/modifyrepo.1 | 9 ++-- modifyrepo.py | 116 +++++++++++++++++++++++++----------------------------- 3 files changed, 64 insertions(+), 66 deletions(-) New commits: commit 00a3c8624e76bda962ecaefa0e77eb522ace64bc Author: Seth Vidal <[email protected]> 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 <[email protected]> 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 <[email protected]> +Seth Vidal <[email protected]> .fi .PP .SH "BUGS" Any bugs which are found should be emailed to the mailing list: [email protected] [email protected] .fi commit 3de378d2edbffddd8849517b515c215ec30e959c Author: Seth Vidal <[email protected]> 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)