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. """ md = None if not metadata: raise MDError, 'metadata cannot be None' if isinstance(metadata, minidom.Document): md = metadata.toxml() mdname = 'updateinfo.xml' elif isinstance(metadata, str): if os.path.exists(metadata): mdname = os.path.basename(metadata) if mdname.split('.')[-1] in ('gz', 'bz2', 'xz'): mdname = mdname.rsplit('.', 1)[0] oldmd = compressOpen(metadata, mode='rb') else: oldmd = file(metadata, 'r') oldmd = AutoFileChecksums(oldmd, [self.checksum_type]) md = oldmd.read() oldmd.close() else: raise MDError, '%s not found' % metadata else: raise MDError, 'invalid metadata type' ## Compress the metadata and move it into the repodata mdtype = self._get_mdtype(mdname, mdtype) destmd = os.path.join(self.repodir, mdname) if self.compress: destmd += '.' + self.compress_type newmd = compressOpen(destmd, mode='wb', compress_type=self.compress_type) else: newmd = open(destmd, 'wb') newmd.write(md) newmd.close() print "Wrote:", destmd if self.unique_md_filenames: csum, destmd = checksum_and_rename(destmd, self.checksum_type) else: csum = checksum(self.checksum_type, destmd) base_destmd = os.path.basename(destmd) # Remove any stale metadata old_rd = self.repoobj.repoData.pop(mdtype, None) new_rd = RepoData() new_rd.type = mdtype new_rd.location = (None, 'repodata/' + base_destmd) new_rd.checksum = (self.checksum_type, csum) new_rd.size = str(os.stat(destmd).st_size) if self.compress: new_rd.openchecksum = oldmd.checksums.hexdigests().popitem() new_rd.opensize = str(oldmd.checksums.length) new_rd.timestamp = str(int(os.stat(destmd).st_mtime)) self.repoobj.repoData[new_rd.type] = new_rd self._print_repodata(new_rd) self._write_repomd() if old_rd is not None and old_rd.location[1] != new_rd.location[1]: # remove the old file when overwriting metadata # with the same mdtype but different location self._remove_repodata_file(old_rd)
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. """ md = None if not metadata: raise MDError, 'metadata cannot be None' if isinstance(metadata, minidom.Document): md = metadata.toxml() mdname = 'updateinfo.xml' oldmd = AutoFileChecksums(StringIO(md), [self.checksum_type]) oldmd.read() elif isinstance(metadata, str): if os.path.exists(metadata): mdname = os.path.basename(metadata) if mdname.split('.')[-1] in ('gz', 'bz2', 'xz'): mdname = mdname.rsplit('.', 1)[0] oldmd = compressOpen(metadata, mode='rb') else: oldmd = file(metadata, 'r') oldmd = AutoFileChecksums(oldmd, [self.checksum_type]) md = oldmd.read() oldmd.close() else: raise MDError, '%s not found' % metadata else: raise MDError, 'invalid metadata type' if not md and self.compress_type == 'xz': raise MDError, 'LZMA does not support compressing empty files' ## Compress the metadata and move it into the repodata mdtype = self._get_mdtype(mdname, mdtype) destmd = os.path.join(self.repodir, mdname) if self.compress: destmd += '.' + self.compress_type newmd = compressOpen(destmd, mode='wb', compress_type=self.compress_type) else: newmd = open(destmd, 'wb') newmd.write(md) newmd.close() print "Wrote:", destmd if self.unique_md_filenames: csum, destmd = checksum_and_rename(destmd, self.checksum_type) else: csum = checksum(self.checksum_type, destmd) base_destmd = os.path.basename(destmd) # Remove any stale metadata old_rd = self.repoobj.repoData.pop(mdtype, None) new_rd = RepoData() new_rd.type = mdtype new_rd.location = (None, 'repodata/' + base_destmd) new_rd.checksum = (self.checksum_type, csum) new_rd.size = str(os.stat(destmd).st_size) if self.compress: new_rd.openchecksum = (self.checksum_type, oldmd.checksums.hexdigests().popitem()[1]) new_rd.opensize = str(oldmd.checksums.length) new_rd.timestamp = str(int(os.stat(destmd).st_mtime)) self.repoobj.repoData[new_rd.type] = new_rd self._print_repodata(new_rd) self._write_repomd() if old_rd is not None and old_rd.location[1] != new_rd.location[1]: # remove the old file when overwriting metadata # with the same mdtype but different location self._remove_repodata_file(old_rd)
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. """ md = None if not metadata: raise MDError, 'metadata cannot be None' if isinstance(metadata, minidom.Document): md = metadata.toxml() mdname = 'updateinfo.xml' elif isinstance(metadata, str): if os.path.exists(metadata): if metadata.split('.')[-1] in ('gz', 'bz2', 'xz'): oldmd = compressOpen(metadata, mode='rb') else: oldmd = file(metadata, 'r') md = oldmd.read() oldmd.close() mdname = os.path.basename(metadata) else: raise MDError, '%s not found' % metadata else: raise MDError, 'invalid metadata type' do_compress = False ## Compress the metadata and move it into the repodata if self.compress or not mdname.split('.')[-1] in ('gz', 'bz2', 'xz'): do_compress = True mdname += '.' + self.compress_type mdtype = self._get_mdtype(mdname, mdtype) destmd = os.path.join(self.repodir, mdname) if do_compress: newmd = compressOpen(destmd, mode='wb', compress_type=self.compress_type) else: newmd = open(destmd, 'wb') newmd.write(md) newmd.close() 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 old_rd = self.repoobj.repoData.pop(mdtype, None) 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 self._print_repodata(new_rd) self._write_repomd() if old_rd is not None and old_rd.location[1] != new_rd.location[1]: # remove the old file when overwriting metadata # with the same mdtype but different location self._remove_repodata_file(old_rd)