[yum-git] Branch 'yum-3_2_X' - 2 commits - yum/misc.py yum/packages.py yum/sqlitesack.py
Seth Vidal
skvidal at linux.duke.edu
Mon Jul 14 15:30:07 UTC 2008
yum/misc.py | 10 ++
yum/packages.py | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
yum/sqlitesack.py | 17 +++
3 files changed, 281 insertions(+), 1 deletion(-)
New commits:
commit 7a862409f84de04924535b5ca28f935ef70747ca
Merge: 8ce231d... c2fff31...
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Mon Jul 14 11:27:42 2008 -0400
Merge branch 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum into yum-3_2_X
* 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum:
Fix available comparison in "all" mode, use new .ver*() methods
commit 8ce231d8dbc22f2148b1dd3c8956740298cebfef
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Mon Jul 14 11:27:24 2008 -0400
move the xml-generating-bits into yum proper - out of createrepo
diff --git a/yum/misc.py b/yum/misc.py
index 5a59ee4..a587eb6 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -565,6 +565,16 @@ def to_str(obj):
obj = str(obj)
return obj
+def to_xml(item, attrib=False):
+ import xml.sax.saxutils
+ item = to_utf8(item) # verify this does enough conversion
+ item = item.rstrip()
+ if attrib:
+ item = xml.sax.saxutils.escape(item, entities={'"':"""})
+ else:
+ item = xml.sax.saxutils.escape(item)
+ return item
+
def get_my_lang_code():
import locale
mylang = locale.getlocale()
diff --git a/yum/packages.py b/yum/packages.py
index 527b4a5..014064d 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -565,6 +565,12 @@ class YumAvailablePackage(PackageObject, RpmBase):
return self._committime_ret
committime = property(_committime)
+
+ # FIXME test this to see if it causes hell elsewhere
+ def _checksum(self):
+ "Returns the 'default' checksum"
+ return self.checksums[0][1]
+ checksum = property(_checksum)
def getDiscNum(self):
if self.basepath is None:
@@ -730,6 +736,226 @@ class YumAvailablePackage(PackageObject, RpmBase):
csumid = 0
self._checksums.append((ctype, csum, csumid))
+# from here down this is for dumping a package object back out to metadata
+
+
+ def _return_remote_location(self):
+ # break self.remote_url up into smaller pieces
+ base = os.path.dirname(self.remote_url)
+ href = os.path.basename(self.remote_url)
+ msg = """<location xml:base="%s" href="%s"/>\n""" % (
+ misc.to_xml(base,attrib=True), misc.to_xml(href, attrib=True))
+ return msg
+
+ def _dump_base_items(self):
+
+ packager = url = ''
+ if self.packager:
+ packager = misc.to_xml(self.packager)
+
+ if self.url:
+ url = misc.to_xml(self.url)
+
+ msg = """
+ <name>%s</name>
+ <arch>%s</arch>
+ <version epoch="%s" ver="%s" rel="%s"/>
+ <checksum type="sha" pkgid="YES">%s</checksum>
+ <summary>%s</summary>
+ <description>%s</description>
+ <packager>%s</packager>
+ <url>%s</url>
+ <time file="%s" build="%s"/>
+ <size package="%s" installed="%s" archive="%s"/>\n""" % (self.name,
+ self.arch, self.epoch, self.ver, self.rel, self.checksum,
+ misc.to_xml(self.summary), misc.to_xml(self.description), packager,
+ url, self.filetime, self.buildtime, self.packagesize, self.size,
+ self.archivesize)
+
+ msg += self._return_remote_location()
+ return msg
+
+ def _dump_format_items(self):
+ msg = " <format>\n"
+ if self.license:
+ msg += """ <rpm:license>%s</rpm:license>\n""" % misc.to_xml(self.license)
+ else:
+ msg += """ <rpm:license/>\n"""
+
+ if self.vendor:
+ msg += """ <rpm:vendor>%s</rpm:vendor>\n""" % misc.to_xml(self.vendor)
+ else:
+ msg += """ <rpm:vendor/>\n"""
+
+ if self.group:
+ msg += """ <rpm:group>%s</rpm:group>\n""" % misc.to_xml(self.group)
+ else:
+ msg += """ <rpm:group/>\n"""
+
+ if self.buildhost:
+ msg += """ <rpm:buildhost>%s</rpm:buildhost>\n""" % misc.to_xml(self.buildhost)
+ else:
+ msg += """ <rpm:buildhost/>\n"""
+
+ if self.sourcerpm:
+ msg += """ <rpm:sourcerpm>%s</rpm:sourcerpm>\n""" % misc.to_xml(self.sourcerpm)
+ msg +=""" <rpm:header-range start="%s" end="%s"/>""" % (self.hdrstart,
+ self.hdrend)
+ msg += self._dump_pco('provides')
+ msg += self._dump_requires()
+ msg += self._dump_pco('conflicts')
+ msg += self._dump_pco('obsoletes')
+ msg += self._dump_files(True)
+ msg += """\n </format>"""
+ return msg
+
+ def _dump_pco(self, pcotype):
+
+ msg = ""
+ mylist = getattr(self, pcotype)
+ if mylist: msg = "\n <rpm:%s>\n" % pcotype
+ for (name, flags, (e,v,r)) in mylist:
+ pcostring = ''' <rpm:entry name="%s"''' % name
+ if flags:
+ pcostring += ''' flags="%s"''' % flags
+ if e:
+ pcostring += ''' epoch="%s"''' % e
+ if v:
+ pcostring += ''' ver="%s"''' % v
+ if r:
+ pcostring += ''' rel="%s"''' % r
+
+ pcostring += "/>\n"
+ msg += pcostring
+
+ if mylist: msg += " </rpm:%s>" % pcotype
+ return msg
+
+ def _return_primary_files(self, list_of_files=None):
+ fileglobs = ['.*bin\/.*', '^\/etc\/.*', '^\/usr\/lib\/sendmail$']
+ file_re = []
+ for glob in fileglobs:
+ file_re.append(re.compile(glob))
+
+
+ returns = {}
+ if list_of_files is None:
+ list_of_files = self.returnFileEntries('file')
+ for item in list_of_files:
+ if item is None:
+ continue
+ for glob in file_re:
+ if glob.match(item):
+ returns[item] = 1
+ return returns.keys()
+
+ def _return_primary_dirs(self):
+ dirglobs = ['.*bin\/.*', '^\/etc\/.*']
+ dir_re = []
+
+ for glob in dirglobs:
+ dir_re.append(re.compile(glob))
+
+ returns = {}
+ for item in self.returnFileEntries('dir'):
+ if item is None:
+ continue
+ for glob in dir_re:
+ if glob.match(item):
+ returns[item] = 1
+ return returns.keys()
+
+
+ def _dump_files(self, primary=False):
+ msg =""
+ if not primary:
+ files = self.returnFileEntries('file')
+ dirs = self.returnFileEntries('dir')
+ ghosts = self.returnFileEntries('ghost')
+ else:
+ files = self._return_primary_files()
+ ghosts = self._return_primary_files(list_of_files = self.returnFileEntries('ghost'))
+ dirs = self._return_primary_dirs()
+
+ for fn in files:
+ msg += """ <file>%s</file>\n""" % misc.to_xml(fn)
+ for fn in dirs:
+ msg += """ <file type="dir">%s</file>\n""" % misc.to_xml(fn)
+ for fn in ghosts:
+ msg += """ <file type="ghost">%s</file>\n""" % misc.to_xml(fn)
+
+ return msg
+
+
+ def _requires_with_pre(self):
+ raise NotImplementedError()
+
+ def _dump_requires(self):
+ """returns deps in format"""
+ mylist = self._requires_with_pre()
+
+ msg = ""
+
+ if mylist: msg = "\n <rpm:requires>\n"
+ for (name, flags, (e,v,r),pre) in mylist:
+ if name.startswith('rpmlib('):
+ continue
+ prcostring = ''' <rpm:entry name="%s"''' % name
+ if flags:
+ prcostring += ''' flags="%s"''' % flags
+ if e:
+ prcostring += ''' epoch="%s"''' % e
+ if v:
+ prcostring += ''' ver="%s"''' % v
+ if r:
+ prcostring += ''' rel="%s"''' % r
+ if pre:
+ prcostring += ''' pre="%s"''' % pre
+
+ prcostring += "/>\n"
+ msg += prcostring
+
+ if mylist: msg += " </rpm:requires>"
+ return msg
+
+ def _dump_changelog(self, clog_limit):
+ if not self.changelog:
+ return ""
+ msg = "\n"
+ clog_count = 0
+ for (ts, author, content) in reversed(sorted(self.changelog)):
+ if clog_limit and clog_count >= clog_limit:
+ break
+ clog_count += 1
+ msg += '''<changelog author="%s" date="%s">%s</changelog>\n''' % (
+ misc.to_xml(author, attrib=True), str(ts), misc.to_xml(content))
+ return msg
+
+ def xml_dump_primary_metadata(self):
+ msg = """\n<package type="rpm">"""
+ msg += self._dump_base_items()
+ msg += self._dump_format_items()
+ msg += """\n</package>"""
+ return msg
+
+ def xml_dump_filelists_metadata(self):
+ msg = """\n<package pkgid="%s" name="%s" arch="%s">
+ <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name,
+ self.arch, self.epoch, self.ver, self.rel)
+ msg += self._dump_files()
+ msg += "</package>\n"
+ return msg
+
+ def xml_dump_other_metadata(self, clog_limit=0):
+ msg = """\n<package pkgid="%s" name="%s" arch="%s">
+ <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name,
+ self.arch, self.epoch, self.ver, self.rel)
+ msg += self._dump_changelog(clog_limit)
+ msg += "\n</package>\n"
+ return msg
+
+
+
class YumHeaderPackage(YumAvailablePackage):
"""Package object built from an rpm header"""
@@ -879,7 +1105,34 @@ class YumHeaderPackage(YumAvailablePackage):
def returnChecksums(self):
raise NotImplementedError()
-
+
+ def _is_pre_req(self, flag):
+ """check the flags for a requirement, return 1 or 0 whether or not requires
+ is a pre-requires or a not"""
+ # FIXME this should probably be put in rpmUtils.miscutils since
+ # - that's what it is
+ newflag = flag
+ if flag is not None:
+ newflag = flag & rpm.RPMSENSE_PREREQ
+ if newflag == rpm.RPMSENSE_PREREQ:
+ return 1
+ else:
+ return 0
+ return 0
+
+ def _requires_with_pre(self):
+ """returns requires with pre-require bit"""
+ name = self.hdr[rpm.RPMTAG_REQUIRENAME]
+ lst = self.hdr[rpm.RPMTAG_REQUIREFLAGS]
+ flag = map(flagToString, lst)
+ pre = map(self._is_pre_req, lst)
+ lst = self.hdr[rpm.RPMTAG_REQUIREVERSION]
+ vers = map(stringToVersion, lst)
+ if name is not None:
+ lst = zip(name, flag, vers, pre)
+ mylist = misc.unique(lst)
+ return mylist
+
class _CountedReadFile:
""" Has just a read() method, and keeps a count so we can find out how much
has been read. Implemented so we can get the real size of the file from
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 2949df4..15e916b 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -242,6 +242,23 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
self.prco[prcotype].append(_share_data(prco_set))
return RpmBase.returnPrco(self, prcotype, printable)
+
+ def _requires_with_pre(self):
+ """returns requires with pre-require bit"""
+ sql = "SELECT name, version, release, epoch, flags,pre " \
+ "FROM requires WHERE pkgKey = ?"
+ cur = self._sql_MD('primary', sql, (self.pkgKey,))
+ requires = []
+ for ob in cur:
+ pre = "0"
+ if ob['pre'].lower() in ['TRUE', 1]:
+ pre = "1"
+ prco_set = (_share_data(ob['name']), _share_data(ob['flags']),
+ (_share_data(ob['epoch']),
+ _share_data(ob['version']),
+ _share_data(ob['release'])), pre)
+ requires.append(prco_set)
+ return requires
class YumSqlitePackageSack(yumRepo.YumPackageSack):
""" Implementation of a PackageSack that uses sqlite cache instead of fully
More information about the Yum-cvs-commits
mailing list