[yum-commits] yum/mdparser.py yum/packages.py yum/sqlitesack.py
James Antill
james at osuosl.org
Mon Mar 10 20:10:33 UTC 2014
yum/mdparser.py | 3 +-
yum/packages.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++------
yum/sqlitesack.py | 6 +++-
3 files changed, 72 insertions(+), 10 deletions(-)
New commits:
commit cbb8a0f2340fecba9891c17cda5a8691a7e5c225
Author: Michael Schroeder <mls at suse.de>
Date: Mon Mar 10 16:08:11 2014 -0400
Add all the weak deps. tags via. prco.
Edit's by James Antill, note that we aren't supplying an API above
returnPrco() atm.
diff --git a/yum/mdparser.py b/yum/mdparser.py
index 8631f06..8d0c678 100644
--- a/yum/mdparser.py
+++ b/yum/mdparser.py
@@ -155,7 +155,8 @@ class PrimaryEntry(BaseEntry):
p[name] = child.text
elif name in ('provides', 'requires', 'conflicts',
- 'obsoletes'):
+ 'obsoletes',
+ 'suggests', 'enhances', 'recommends', 'supplements'):
self.prco[name] = self.getPrco(child)
elif name == 'header-range':
diff --git a/yum/packages.py b/yum/packages.py
index 1b3061b..ccac9da 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -54,6 +54,9 @@ except ImportError:
import pwd
import grp
+# check if rpm has the new weakdeps tags
+_rpm_has_new_weakdeps = hasattr(rpm, 'RPMTAG_ENHANCENAME')
+
def comparePoEVR(po1, po2):
"""
Compare two Package or PackageEVR objects.
@@ -470,6 +473,10 @@ class RpmBase(object):
self.prco['conflicts'] = [] # (name, flag, (e,v,r))
self.prco['requires'] = [] # (name, flag, (e,v,r))
self.prco['provides'] = [] # (name, flag, (e,v,r))
+ self.prco['suggests'] = [] # (name, flag, (e,v,r))
+ self.prco['enhances'] = [] # (name, flag, (e,v,r))
+ self.prco['recommends'] = [] # (name, flag, (e,v,r))
+ self.prco['supplements'] = [] # (name, flag, (e,v,r))
self.files = {}
self.files['file'] = []
self.files['dir'] = []
@@ -673,6 +680,8 @@ class RpmBase(object):
provides = property(fget=lambda self: self.returnPrco('provides'))
obsoletes = property(fget=lambda self: self.returnPrco('obsoletes'))
conflicts = property(fget=lambda self: self.returnPrco('conflicts'))
+ # weak_requires = property(fget=lambda self: self.returnPrco('recommends'))
+ # info_requires = property(fget=lambda self: self.returnPrco('suggests'))
provides_names = property(fget=lambda self: self.returnPrcoNames('provides'))
requires_names = property(fget=lambda self: self.returnPrcoNames('requires'))
strong_requires_names = property(fget=lambda self: self.returnPrcoNames('strong_requires'))
@@ -1174,6 +1183,10 @@ class YumAvailablePackage(PackageObject, RpmBase):
msg += self._dump_requires()
msg += self._dump_pco('conflicts')
msg += self._dump_pco('obsoletes')
+ msg += self._dump_pco('suggests')
+ msg += self._dump_pco('enhances')
+ msg += self._dump_pco('recommends')
+ msg += self._dump_pco('supplements')
msg += self._dump_files(True)
if msg[-1] != '\n':
msg += """\n"""
@@ -1399,6 +1412,17 @@ class YumHeaderPackage(YumAvailablePackage):
def _get_hdr(self):
return self.hdr
+ def _filter_deps(self, name, flag, vers, andmask, resmask):
+ newname = []
+ newflag = []
+ newvers = []
+ for (n, f, v) in zip(name, flag, vers):
+ if f & andmask == resmask:
+ newname.append(n)
+ newflag.append(f)
+ newvers.append(v)
+ return (newname, newflag, newvers)
+
def _populatePrco(self):
"Populate the package object with the needed PRCO interface."
@@ -1406,6 +1430,17 @@ class YumHeaderPackage(YumAvailablePackage):
"CONFLICT": misc.share_data("conflicts"),
"REQUIRE": misc.share_data("requires"),
"PROVIDE": misc.share_data("provides") }
+
+ def _end_nfv(name, flag, vers):
+ flag = map(rpmUtils.miscutils.flagToString, flag)
+ flag = map(misc.share_data, flag)
+
+ vers = map(rpmUtils.miscutils.stringToVersion, vers)
+ vers = map(lambda x: (misc.share_data(x[0]), misc.share_data(x[1]),
+ misc.share_data(x[2])), vers)
+
+ return map(misc.share_data, zip(name,flag,vers))
+
hdr = self._get_hdr()
for tag in tag2prco:
name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)]
@@ -1418,22 +1453,44 @@ class YumHeaderPackage(YumAvailablePackage):
# Rpm is a bit magic here, and if pkgA requires(pre/post): foo
# it will then let you remove foo _after_ pkgA has been
# installed. So we need to mark those deps. as "weak".
+ # This is not the same as recommends/weak_requires.
bits = rpm.RPMSENSE_SCRIPT_PRE | rpm.RPMSENSE_SCRIPT_POST
weakreqs = [bool(flag & bits) for flag in lst]
- flag = map(rpmUtils.miscutils.flagToString, lst)
- flag = map(misc.share_data, flag)
-
- lst = hdr[getattr(rpm, 'RPMTAG_%sVERSION' % tag)]
- vers = map(rpmUtils.miscutils.stringToVersion, lst)
- vers = map(lambda x: (misc.share_data(x[0]), misc.share_data(x[1]),
- misc.share_data(x[2])), vers)
+ vers = hdr[getattr(rpm, 'RPMTAG_%sVERSION' % tag)]
prcotype = tag2prco[tag]
- self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers))
+ self.prco[prcotype] = _end_nfv(name, lst, vers)
if tag == 'REQUIRE':
weakreqs = zip(weakreqs, self.prco[prcotype])
strongreqs = [wreq[1] for wreq in weakreqs if not wreq[0]]
self.prco['strong_requires'] = strongreqs
+
+ # This looks horrific as we are supporting both the old and new formats:
+ tag2prco = { "SUGGEST": ( misc.share_data("suggests"),
+ 1156, 1157, 1158, 1 << 27, 0),
+ "ENHANCE": ( misc.share_data("enhances"),
+ 1159, 1160, 1161, 1 << 27, 0),
+ "RECOMMEND": ( misc.share_data("recommends"),
+ 1156, 1157, 1158, 1 << 27, 1 << 27),
+ "SUPPLEMENT": ( misc.share_data("supplements"),
+ 1159, 1160, 1161, 1 << 27, 1 << 27) }
+ for tag in tag2prco:
+ (prcotype, oldtagn, oldtagv, oldtagf, andmask, resmask) = tag2prco[tag]
+ name = None
+ if _rpm_has_new_weakdeps:
+ name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)]
+ if not name:
+ name = hdr[oldtagn]
+ if not name:
+ continue
+ (name, flag, vers) = self._filter_deps(name, hdr[oldtagf], hdr[oldtagv], andmask, resmask)
+ else:
+ flag = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)]
+ vers = hdr[getattr(rpm, 'RPMTAG_%sVERSION' % tag)]
+ name = map(misc.share_data, name)
+ if not name: # empty or none or whatever, doesn't matter
+ continue
+ self.prco[prcotype] = _end_nfv(name, flag, vers)
def tagByName(self, tag):
warnings.warn("tagByName() will go away in a furture version of Yum.\n",
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 65401a9..2da5a44 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -179,7 +179,11 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
self.prco = { 'obsoletes': (),
'conflicts': (),
'requires': (),
- 'provides': () }
+ 'provides': (),
+ 'suggests': (),
+ 'enhances': (),
+ 'recommends': (),
+ 'supplements': () }
self.sack = repo.sack
self.repoid = repo.id
self.repo = repo
More information about the Yum-commits
mailing list