Jeremy Katz wrote:
On Mon, 2007-04-30 at 12:24 +0200, Florian Festi wrote:
RpmSack.whatProvides and .whatRequires build package objects inside but only
return the pkg tuples. This is really annoying as most places need to
reconstruct these objects later.
While (at times annoyingly :-) inconsistent, changing this breaks API
compatibility and thus I'd really rather not do it, at least not at this
time.
We could go the (still ugly) route of adding a aspo flag and only do it
when that's passed; that would allow new callers to get the benefit
while not breaking older callers. And if we wanted to keep things
consistent, we could implement the same flag on the other sacks, just
with the different default
Could look like the attached patch...
Index: yum/__init__.py
===================================================================
RCS file: /cvsroot/yum/cvs/yum/yum/__init__.py,v
retrieving revision 1.325
diff -u -r1.325 __init__.py
--- yum/__init__.py 26 Apr 2007 14:10:01 -0000 1.325
+++ yum/__init__.py 30 Apr 2007 12:59:02 -0000
@@ -1619,7 +1619,6 @@
"""Pass in a generic [build]require string and this function will
pass back the installed packages it finds providing that dep."""
- results = []
# parse the string out
# either it is 'dep (some operator) e:v-r'
# or /file/dep
@@ -1638,14 +1637,8 @@
if not SYMBOLFLAGS.has_key(flagsymbol):
raise Errors.YumBaseError, 'Invalid version flag'
depflags = SYMBOLFLAGS[flagsymbol]
-
- pkglist = self.rpmdb.whatProvides(depname, depflags, depver)
-
- for pkgtup in pkglist:
- results.append(self.getInstalledPackageObject(pkgtup))
- return results
-
+ return self.rpmdb.whatProvides(depname, depflags, depver, aspo=True)
def _bestPackageFromList(self, pkglist):
"""take list of package objects and return the best package object.
Index: yum/depsolve.py
===================================================================
RCS file: /cvsroot/yum/cvs/yum/yum/depsolve.py,v
retrieving revision 1.163
diff -u -r1.163 depsolve.py
--- yum/depsolve.py 24 Apr 2007 21:02:50 -0000 1.163
+++ yum/depsolve.py 30 Apr 2007 12:59:02 -0000
@@ -361,21 +361,22 @@
if self.cheaterlookup.has_key((needname, needflags, needversion)):
self.verbose_logger.log(logginglevels.DEBUG_2, 'Needed Require has already been looked up, cheating')
- cheater_tup = self.cheaterlookup[(needname, needflags, needversion)]
- providers = [cheater_tup]
+ cheater_po = self.cheaterlookup[(needname, needflags, needversion)]
+ providers = [cheater_po]
elif self.rpmdb.installed(name=needname):
txmbrs = self.tsInfo.matchNaevr(name=needname)
for txmbr in txmbrs:
- providers.append(txmbr.pkgtup)
+ providers.append(txmbr.po)
else:
self.verbose_logger.log(logginglevels.DEBUG_2, 'Needed Require is not a package name. Looking up: %s', niceformatneed)
- providers = self.rpmdb.whatProvides(needname, needflags, needversion)
+ providers = self.rpmdb.whatProvides(
+ needname, needflags, needversion, aspo=True)
- for insttuple in providers:
- inst_str = '%s.%s %s:%s-%s' % insttuple
- (i_n, i_a, i_e, i_v, i_r) = insttuple
+ for inst_po in providers:
+ inst_str = '%s.%s %s:%s-%s' % inst_po.pkgtuple
+ (i_n, i_a, i_e, i_v, i_r) = inst_po.pkgtuple
self.verbose_logger.log(logginglevels.DEBUG_2,
'Potential Provider: %s', inst_str)
thismode = self.tsInfo.getMode(name=i_n, arch=i_a,
@@ -391,13 +392,8 @@
if thismode is not None:
needmode = thismode
- if self.rpmdb.installed(name=i_n, arch=i_a, ver=i_v,
- epoch=i_e, rel=i_r):
- needpo = self.rpmdb.searchPkgTuple(insttuple)[0]
- else:
- needpo = self.getPackageObject(insttuple)
- self.cheaterlookup[(needname, needflags, needversion)] = insttuple
+ self.cheaterlookup[(needname, needflags, needversion)] = inst_po
self.verbose_logger.log(logginglevels.DEBUG_2, 'Mode is %s for provider of %s: %s',
needmode, niceformatneed, inst_str)
break
@@ -409,7 +405,7 @@
self.verbose_logger.log(logginglevels.DEBUG_2, 'TSINFO: %s package requiring %s marked as erase',
requiringPo, needname)
txmbr = self.tsInfo.addErase(requiringPo)
- txmbr.setAsDep(po=needpo)
+ txmbr.setAsDep(po=inst_po)
checkdeps = 1
if needmode in ['i', 'u']:
@@ -689,12 +685,12 @@
best = None
(r, f, v) = req
- for pkgtup in self.rpmdb.whatProvides(r, f, v):
+ for po in self.rpmdb.whatProvides(r, f, v, aspo=True):
# check the rpmdb first for something providing it that's not
# set to be removed
- txmbrs = self.tsInfo.getMembersWithState(pkgtup, TS_REMOVE_STATES)
+ txmbrs = self.tsInfo.getMembersWithState(po.pkgtup,
+ TS_REMOVE_STATES)
if not txmbrs:
- po = self.getInstalledPackageObject(pkgtup)
self.deps[req] = po
return po
@@ -972,12 +968,11 @@
(r, version_tuple_to_string(v)), flags[f],
None, rpm.RPMDEP_SENSE_CONFLICTS) )
- inst = self.rpmdb.whatProvides(r, None, None)
- for pkgtup in inst:
- txmbrs = self.tsInfo.getMembersWithState(pkgtup,
+ inst = self.rpmdb.whatProvides(r, None, None, aspo=True)
+ for po in inst:
+ txmbrs = self.tsInfo.getMembersWithState(po.pkgtup,
TS_REMOVE_STATES)
if not txmbrs:
- po = self.getInstalledPackageObject(pkgtup)
if po.checkPrco('provides', (r, f, v)):
ret.append( ((txmbr.name, txmbr.version, txmbr.release),
(r, version_tuple_to_string(v)), flags[f],
@@ -1004,7 +999,7 @@
newpoprovs[(f, None, (None, None, None))] = 1
ret = []
- self._removing = []
+ self._removing = set()
goneprovs = {}
gonefiles = {}
removes = {}
@@ -1025,10 +1020,8 @@
# now see what from the rpmdb really requires these
for (provname, prov) in goneprovs.items() + gonefiles.items():
- instrequirers = []
- for pkgtup in self.rpmdb.whatRequires(provname, None, None):
- instpo = self.getInstalledPackageObject(pkgtup)
- instrequirers.append(instpo)
+ instrequirers = self.rpmdb.whatRequires(provname, None, None,
+ aspo=True)
self.verbose_logger.log(logginglevels.DEBUG_4, "looking to see what requires %s of %s", prov, po)
removes[prov] = self._requiredByPkg(prov, instrequirers)
@@ -1099,14 +1092,14 @@
self.verbose_logger.log(logginglevels.DEBUG_2, "looking at %s as a requirement of %s", r, pkgtup)
isok = False
# now see if anything else is providing what we need
- for provtup in self.rpmdb.whatProvides(r, None, None):
+ for provpo in self.rpmdb.whatProvides(r, None, None, aspo=True):
# check if this provider is being removed
- if provtup in self._removing:
+ if provpo.pkgtup in self._removing:
continue
- if self.tsInfo.getMembersWithState(provtup, TS_REMOVE_STATES):
+ if self.tsInfo.getMembersWithState(provpo.pkgtup,
+ TS_REMOVE_STATES):
continue
- provpo = self.getInstalledPackageObject(provtup)
if provpo in removeList:
continue
# check if provpo actually satisfies instpo's need for r
Index: yum/rpmsack.py
===================================================================
RCS file: /cvsroot/yum/cvs/yum/yum/rpmsack.py,v
retrieving revision 1.46
diff -u -r1.46 rpmsack.py
--- yum/rpmsack.py 26 Apr 2007 15:30:14 -0000 1.46
+++ yum/rpmsack.py 30 Apr 2007 12:59:03 -0000
@@ -379,7 +379,7 @@
# Can't support this now
raise NotImplementedError
- def whatProvides(self, name, flags, version):
+ def whatProvides(self, name, flags, version, aspo=False):
"""searches the rpmdb for what provides the arguments
returns a list of pkgtuples of providing packages, possibly empty"""
@@ -408,14 +408,12 @@
if po.checkPrco('provides', (name, flags, (r_e, r_v, r_r))):
defSack.addPackage(po)
+ if aspo:
+ return defSack.returnPackages()
+ else:
+ return [po.pkgtup for po in defSack.returnPackages()]
- returnlist = []
- for pkg in defSack.returnPackages():
- returnlist.append(pkg.pkgtup)
-
- return returnlist
-
- def whatRequires(self, name, flags, version):
+ def whatRequires(self, name, flags, version, aspo=False):
"""searches the rpmdb for what provides the arguments
returns a list of pkgtuples of providing packages, possibly empty"""
@@ -441,11 +439,10 @@
if po.checkPrco('requires', (name, flags, (r_e, r_v, r_r))):
defSack.addPackage(po)
- returnlist = []
- for pkg in defSack.returnPackages():
- returnlist.append(pkg.pkgtup)
-
- return returnlist
+ if aspo:
+ return defSack.returnPackages()
+ else:
+ return [po.pkgtup for po in defSack.returnPackages()]
def main():
sack = RPMDBPackageSack('/')
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel