[yum-git] Branch 'yum-3_2_X' - 3 commits - cli.py README README.API_CHANGES rpmUtils/miscutils.py test/depsolvetests.py test/operationstests.py test/packagetests.py test/simpleobsoletestests.py test/simpleupdatetests.py test/skipbroken-tests.py test/testbase.py yum/depsolve.py yum/__init__.py yum/packageSack.py yum/packages.py yum/rpmsack.py yum/sqlitesack.py
James Antill
james at linux.duke.edu
Mon Jun 2 22:25:17 UTC 2008
README | 2
README.API_CHANGES | 11 --
cli.py | 4
rpmUtils/miscutils.py | 46 +++++---
test/depsolvetests.py | 114 +++++++++++-----------
test/operationstests.py | 10 -
test/packagetests.py | 60 +++++------
test/simpleobsoletestests.py | 6 -
test/simpleupdatetests.py | 8 -
test/skipbroken-tests.py | 36 +++----
test/testbase.py | 16 ---
yum/__init__.py | 12 +-
yum/depsolve.py | 221 ++++++++++++++++++++++++++++++-------------
yum/packageSack.py | 99 ++++++++++++++-----
yum/packages.py | 8 -
yum/rpmsack.py | 128 +++++++++++++++++-------
yum/sqlitesack.py | 43 ++++----
17 files changed, 512 insertions(+), 312 deletions(-)
New commits:
commit 0f495a7a61638bd8efe4a9b2ae29ce740ef24ac0
Author: James Antill <james at and.org>
Date: Mon Jun 2 18:25:09 2008 -0400
Give the --showduplicates output for provides, as that's how it's calc'd.
diff --git a/cli.py b/cli.py
index dcb8e96..8ff9d80 100644
--- a/cli.py
+++ b/cli.py
@@ -731,7 +731,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
of items matching the provides strings. This is a cli wrapper to the
module"""
+ old_sdup = self.conf.showdupesfromrepos
+ # For output, as searchPackageProvides() is always in showdups mode
+ self.conf.showdupesfromrepos = True
matching = self.searchPackageProvides(args, callback=self.matchcallback)
+ self.conf.showdupesfromrepos = old_sdup
if len(matching) == 0:
return 0, ['No Matches found']
commit 57362df5676c4102eba9897f6e8bbd1143aea632
Author: James Antill <james at and.org>
Date: Mon Jun 2 18:14:05 2008 -0400
Add text for git diff, to make sure we don't have HEAD merges
diff --git a/README b/README
index b2c3bff..ca0c1b4 100644
--- a/README
+++ b/README
@@ -30,4 +30,6 @@ web page: http://linux.duke.edu/yum/
wiki: http://wiki.linux.duke.edu/Yum
3.2.X Branch - yum-3_2_X
+ Starting commit is roughly: a3c91d7f6a15f31a42d020127b2da2877dfc137d
+ E.g. git diff a3c91d7f6a15f31a42d020127b2da2877dfc137d
commit 91e4cee0d52660421906442265d4d41232c0b203
Author: James Antill <james at and.org>
Date: Mon Jun 2 18:10:41 2008 -0400
Revert "Merge branch 'master' of ssh://login.linux.duke.edu/home/groups/yum/git/yum"
This reverts commit 7bf7ce04f34b0fa1540b02de70d696675864efc3.
Another stupid HEAD => 3.2.x branch merge. *hates SCMs for a while*
diff --git a/README.API_CHANGES b/README.API_CHANGES
deleted file mode 100644
index ae451a8..0000000
--- a/README.API_CHANGES
+++ /dev/null
@@ -1,11 +0,0 @@
-
-4.0.0
-=====
-
-Removed:
-
- * PackageSack.search(Provides|Requires|Conflicts|Obsoletes)
- * use PackageSack.get* instead
- * RpmSack(whatProvides|Requires)
- * use PackageSack.get* instead
- * SqliteSack.searchPrco
diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py
index 606aea0..64e232e 100644
--- a/rpmUtils/miscutils.py
+++ b/rpmUtils/miscutils.py
@@ -129,7 +129,7 @@ def rangeCheck(reqtuple, pkgtuple):
# nameonly shouldn't ever raise it
#(reqn, reqf, (reqe, reqv, reqr)) = reqtuple
(n, a, e, v, r) = pkgtuple
- return rangeCompare(reqtuple, (n, rpm.RPMSENSE_EQUAL, (e, v, r)))
+ return rangeCompare(reqtuple, (n, 'EQ', (e, v, r)))
def rangeCompare(reqtuple, provtuple):
"""returns true if provtuple satisfies reqtuple"""
@@ -141,9 +141,6 @@ def rangeCompare(reqtuple, provtuple):
if f is None or reqf is None:
return 1
- if isinstance(f, str) or isinstance(reqf, str):
- raise ValueError, "%r %r" % (f, reqf)
-
# and you thought we were done having fun
# if the requested release is left out then we have
# to remove release from the package prco to make sure the match
@@ -164,33 +161,42 @@ def rangeCompare(reqtuple, provtuple):
# does not match unless
if rc >= 1:
- if reqf & rpm.RPMSENSE_GREATER:
+ if reqf in ['GT', 'GE', 4, 12]:
return 1
- if reqf == rpm.RPMSENSE_EQUAL:
- if f == (rpm.RPMSENSE_LESS|rpm.RPMSENSE_EQUAL):
+ if reqf in ['EQ', 8]:
+ if f in ['LE', 10]:
return 1
if rc == 0:
- if reqf == rpm.RPMSENSE_GREATER:
- if f & rpm.RPMSENSE_GREATER:
+ if reqf in ['GT', 4]:
+ if f in ['GT', 'GE', 4, 12]:
return 1
- if reqf == (rpm.RPMSENSE_GREATER|rpm.RPMSENSE_EQUAL):
- if f != rpm.RPMSENSE_LESS:
+ if reqf in ['GE', 12]:
+ if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10]:
return 1
- if reqf == rpm.RPMSENSE_EQUAL:
- if f & rpm.RPMSENSE_EQUAL:
+ if reqf in ['EQ', 8]:
+ if f in ['EQ', 'GE', 'LE', 8, 12, 10]:
return 1
- if reqf == (rpm.RPMSENSE_LESS|rpm.RPMSENSE_EQUAL):
- if f != rpm.RPMSENSE_GREATER:
+ if reqf in ['LE', 10]:
+ if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12]:
return 1
- if reqf == rpm.RPMSENSE_LESS:
- if f & rpm.RPMSENSE_LESS:
+ if reqf in ['LT', 2]:
+ if f in ['LE', 'LT', 10, 2]:
return 1
if rc <= -1:
- if not (reqf & rpm.RPMSENSE_LESS):
- if f & rpm.RPMSENSE_GREATER:
+ if reqf in ['GT', 'GE', 'EQ', 4, 12, 8]:
+ if f in ['GT', 'GE', 4, 12]:
return 1
- if reqf & rpm.RPMSENSE_LESS:
+ if reqf in ['LE', 'LT', 10, 2]:
return 1
+# if rc >= 1:
+# if reqf in ['GT', 'GE', 4, 12]:
+# return 1
+# if rc == 0:
+# if reqf in ['GE', 'LE', 'EQ', 8, 10, 12]:
+# return 1
+# if rc <= -1:
+# if reqf in ['LT', 'LE', 2, 10]:
+# return 1
return 0
diff --git a/test/depsolvetests.py b/test/depsolvetests.py
index 3e445ba..3f8c748 100644
--- a/test/depsolvetests.py
+++ b/test/depsolvetests.py
@@ -64,7 +64,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer1NotProvided(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, (None, '1.3', '2'))
+ po.addRequires('zip', 'EQ', (None, '1.3', '2'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.0', '2', None, 'i386')
@@ -74,7 +74,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer1Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, (None, '1.3', '2'))
+ po.addRequires('zip', 'EQ', (None, '1.3', '2'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '2', None, 'i386')
@@ -85,7 +85,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer2NotProvided(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, (None, '1.3', '4'))
+ po.addRequires('zip', 'EQ', (None, '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '2', None, 'i386')
@@ -95,7 +95,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer2Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, (None, '1.3', '4'))
+ po.addRequires('zip', 'EQ', (None, '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', None, 'i386')
@@ -106,7 +106,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer3NotProvided(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', GE, ('1', '1.3', '4'))
+ po.addRequires('zip', 'GE', ('1', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '0', 'i386')
@@ -116,7 +116,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer3Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', GE, ('2', '1.3', '4'))
+ po.addRequires('zip', 'GE', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
@@ -127,7 +127,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer4NotProvided(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
@@ -137,7 +137,7 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireVer4_1Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.0', '4', '2', 'i386')
@@ -147,7 +147,7 @@ class DepsolveTests(DepsolveTests):
self.assertResult((po, ipo))
def testInstallSinglePackageRequireVer4_2Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '3', '2', 'i386')
@@ -157,7 +157,7 @@ class DepsolveTests(DepsolveTests):
self.assertResult((po, ipo))
def testInstallSinglePackageRequireVer4_3Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', None, 'i386')
@@ -167,7 +167,7 @@ class DepsolveTests(DepsolveTests):
self.assertResult((po, ipo))
def testInstallSinglePackageRequireVer4_4Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '1', 'i386')
@@ -177,7 +177,7 @@ class DepsolveTests(DepsolveTests):
self.assertResult((po, ipo))
def testInstallSinglePackageRequireVer4_5Installed(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', LT, ('2', '1.3', '4'))
+ po.addRequires('zip', 'LT', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '0.3', '4', '2', 'i386')
@@ -188,8 +188,8 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireXtraBadVer(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('2', '1.3', '4'))
- po.addRequires('zap', EQ, ('2', '1.3', '4'))
+ po.addRequires('zip', 'EQ', ('2', '1.3', '4'))
+ po.addRequires('zap', 'EQ', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
@@ -202,8 +202,8 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireXtra(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('2', '1.3', '4'))
- po.addRequires('zap', EQ, ('4', '2.6', '8'))
+ po.addRequires('zip', 'EQ', ('2', '1.3', '4'))
+ po.addRequires('zap', 'EQ', ('4', '2.6', '8'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
@@ -217,11 +217,11 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireInstalledRequireXtra(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('2', '1.3', '4'))
+ po.addRequires('zip', 'EQ', ('2', '1.3', '4'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
- ipo.addRequires('zap', EQ, ('4', '2.6', '8'))
+ ipo.addRequires('zap', 'EQ', ('4', '2.6', '8'))
self.rpmdb.addPackage(ipo)
xpo = FakePackage('zap', '2.6', '8', '4', 'i386')
@@ -232,33 +232,33 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireUpgradeRequireXtraErr(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('4', '2.6', '8'))
+ po.addRequires('zip', 'EQ', ('4', '2.6', '8'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
- ipo.addRequires('zap', EQ, ('2', '1.3', '3'))
+ ipo.addRequires('zap', 'EQ', ('2', '1.3', '3'))
self.rpmdb.addPackage(ipo)
xpo = FakePackage('zip', '2.6', '8', '4', 'i386')
- xpo.addRequires('zap', EQ, ('2', '1.3', '4'))
+ xpo.addRequires('zap', 'EQ', ('2', '1.3', '4'))
self.xsack.addPackage(xpo)
xpo = FakePackage('zap', '1.3', '4', '2', 'i386')
- xpo.addRequires('zsh', EQ, ('2', '4', '8'))
+ xpo.addRequires('zsh', 'EQ', ('2', '4', '8'))
self.xsack.addPackage(xpo)
self.assertEquals('err', *self.resolveCode())
def testInstallSinglePackageRequireUpgradeRequireXtraOk(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('4', '2.6', '8'))
+ po.addRequires('zip', 'EQ', ('4', '2.6', '8'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '4', '2', 'i386')
- ipo.addRequires('zap', EQ, ('2', '1.3', '3'))
+ ipo.addRequires('zap', 'EQ', ('2', '1.3', '3'))
self.rpmdb.addPackage(ipo)
xpo = FakePackage('zip', '2.6', '8', '4', 'i386')
- xpo.addRequires('zap', EQ, ('2', '1.3', '4'))
+ xpo.addRequires('zap', 'EQ', ('2', '1.3', '4'))
self.xsack.addPackage(xpo)
xpo2 = FakePackage('zap', '1.3', '4', '2', 'i386')
self.xsack.addPackage(xpo2)
@@ -268,11 +268,11 @@ class DepsolveTests(DepsolveTests):
def testInstallSinglePackageRequireMultiXtra(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, ('4', '2.6', '8'))
+ po.addRequires('zip', 'EQ', ('4', '2.6', '8'))
self.tsInfo.addInstall(po)
xpo = FakePackage('zip', '2.6', '8', '4', 'i386')
- xpo.addRequires('zap', EQ, ('2', '1.3', '4'))
+ xpo.addRequires('zap', 'EQ', ('2', '1.3', '4'))
self.xsack.addPackage(xpo)
xpo2 = FakePackage('zap', '1.3', '4', '2', 'i386')
@@ -346,7 +346,7 @@ class DepsolveTests(DepsolveTests):
def testUpdateForDependency(self):
po = FakePackage('zsh', '1', '1', '0', 'i386')
- po.addRequires('zip', EQ, ('0', '2', '1'))
+ po.addRequires('zip', 'EQ', ('0', '2', '1'))
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
@@ -360,18 +360,18 @@ class DepsolveTests(DepsolveTests):
def testUpdateSplitPackage(self):
po = FakePackage('zsh', '1', '1', '0', 'i386')
- po.addRequires('libzip', EQ, ('0', '2', '1'))
+ po.addRequires('libzip', 'EQ', ('0', '2', '1'))
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
- installedpo.addProvides('libzip', EQ, ('0', '1', '1'))
+ installedpo.addProvides('libzip', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(installedpo)
updatepo = FakePackage('zip', '2', '1', '0', 'i386')
- updatepo.addRequires('zip-libs', EQ, ('0', '2', '1'))
+ updatepo.addRequires('zip-libs', 'EQ', ('0', '2', '1'))
self.xsack.addPackage(updatepo)
updatepo2 = FakePackage('zip-libs', '2', '1', '0', 'i386')
- updatepo2.addProvides('libzip', EQ, ('0', '2', '1'))
+ updatepo2.addProvides('libzip', 'EQ', ('0', '2', '1'))
self.xsack.addPackage(updatepo2)
self.assertEquals('ok', *self.resolveCode())
@@ -442,7 +442,7 @@ class DepsolveTests(DepsolveTests):
def testUpdateForConflict(self):
po = FakePackage('zsh', '1', '1', '0', 'i386')
- po.addConflicts('zip', LE, ('0', '1', '1'))
+ po.addConflicts('zip', 'LE', ('0', '1', '1'))
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
@@ -459,7 +459,7 @@ class DepsolveTests(DepsolveTests):
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
- installedpo.addConflicts('zsh', LE, ('0', '1', '1'))
+ installedpo.addConflicts('zsh', 'LE', ('0', '1', '1'))
self.rpmdb.addPackage(installedpo)
updatepo = FakePackage('zip', '2', '1', '0', 'i386')
@@ -470,11 +470,11 @@ class DepsolveTests(DepsolveTests):
def testUpdateForConflictProvide(self):
po = FakePackage('zsh', '1', '1', '0', 'i386')
- po.addConflicts('zippy', LE, ('0', '1', '1'))
+ po.addConflicts('zippy', 'LE', ('0', '1', '1'))
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
- installedpo.addProvides('zippy', EQ, ('0', '1', '1'))
+ installedpo.addProvides('zippy', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(installedpo)
updatepo = FakePackage('zip', '2', '1', '0', 'i386')
@@ -485,17 +485,17 @@ class DepsolveTests(DepsolveTests):
def testUpdateForConflictProvide2(self):
po = FakePackage('zsh', '1', '1', '0', 'i386')
- po.addProvides('zippy', EQ, ('0', '2', '1'))
+ po.addProvides('zippy', 'EQ', ('0', '2', '1'))
self.tsInfo.addInstall(po)
installedpo = FakePackage('zip', '1', '1', '0', 'i386')
- installedpo.addConflicts('zippy', GT, ('0', '1', '1'))
- installedpo.addConflicts('zippy', LT, ('0', '1', '1'))
+ installedpo.addConflicts('zippy', 'GT', ('0', '1', '1'))
+ installedpo.addConflicts('zippy', 'LT', ('0', '1', '1'))
self.rpmdb.addPackage(installedpo)
updatepo = FakePackage('zip', '2', '1', '0', 'i386')
- updatepo.addConflicts('zippy', GT, ('0', '2', '1'))
- updatepo.addConflicts('zippy', LT, ('0', '2', '1'))
+ updatepo.addConflicts('zippy', 'GT', ('0', '2', '1'))
+ updatepo.addConflicts('zippy', 'LT', ('0', '2', '1'))
self.xsack.addPackage(updatepo)
self.assertEquals('ok', *self.resolveCode())
@@ -785,13 +785,13 @@ class DepsolveTests(DepsolveTests):
def testMultiPkgVersions1(self):
ipo1 = FakePackage('abcd', arch='noarch')
- ipo1.addRequires('Foo', EQ, ('0', '1', '1'))
+ ipo1.addRequires('Foo', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(ipo1)
ipo2 = FakePackage('Foo', arch='noarch')
self.rpmdb.addPackage(ipo2)
xpo = FakePackage('abcd', version='2', arch='noarch')
- xpo.addRequires('Foo', GE, ('0', '2', '1'))
+ xpo.addRequires('Foo', 'GE', ('0', '2', '1'))
self.tsInfo.addUpdate(xpo, oldpo=ipo1)
po1 = FakePackage('Foo', arch='noarch')
@@ -806,13 +806,13 @@ class DepsolveTests(DepsolveTests):
def testMultiPkgVersions2(self):
ipo1 = FakePackage('abcd', arch='i586')
- ipo1.addRequires('Foo', EQ, ('0', '1', '1'))
+ ipo1.addRequires('Foo', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(ipo1)
ipo2 = FakePackage('Foo', arch='i586')
self.rpmdb.addPackage(ipo2)
xpo = FakePackage('abcd', version='2', arch='i586')
- xpo.addRequires('Foo', GE, ('0', '2', '1'))
+ xpo.addRequires('Foo', 'GE', ('0', '2', '1'))
self.tsInfo.addUpdate(xpo, oldpo=ipo1)
po1 = FakePackage('Foo', arch='i586')
@@ -827,13 +827,13 @@ class DepsolveTests(DepsolveTests):
def testMultiPkgVersions3(self):
ipo1 = FakePackage('abcd', arch='i586')
- ipo1.addRequires('Foo', EQ, ('0', '1', '1'))
+ ipo1.addRequires('Foo', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(ipo1)
ipo2 = FakePackage('Foo', arch='i586')
self.rpmdb.addPackage(ipo2)
xpo = FakePackage('abcd', version='2', arch='i586')
- xpo.addRequires('Foo', GE, ('0', '2', '1'))
+ xpo.addRequires('Foo', 'GE', ('0', '2', '1'))
self.tsInfo.addUpdate(xpo, oldpo=ipo1)
po1 = FakePackage('Foo', arch='i586')
@@ -851,13 +851,13 @@ class DepsolveTests(DepsolveTests):
def testMultiPkgVersions4(self):
ipo1 = FakePackage('abcd', arch='i386')
- ipo1.addRequires('Foo', EQ, ('0', '1', '1'))
+ ipo1.addRequires('Foo', 'EQ', ('0', '1', '1'))
self.rpmdb.addPackage(ipo1)
ipo2 = FakePackage('Foo', arch='i386')
self.rpmdb.addPackage(ipo2)
xpo = FakePackage('abcd', version='2', arch='i386')
- xpo.addRequires('Foo', GE, ('0', '2', '1'))
+ xpo.addRequires('Foo', 'GE', ('0', '2', '1'))
self.tsInfo.addUpdate(xpo, oldpo=ipo1)
po1 = FakePackage('Foo', arch='i386')
@@ -880,12 +880,12 @@ class DepsolveTests(DepsolveTests):
self.tsInfo.addInstall(xpo)
po1 = FakePackage('unison213', version='2.13.16', release='9')
- po1.addProvides('unison', EQ, ('0', '2.13.16', '9'))
- po1.addObsoletes('unison', LT, ('0', '2.27.57', '3'))
+ po1.addProvides('unison', 'EQ', ('0', '2.13.16', '9'))
+ po1.addObsoletes('unison', 'LT', ('0', '2.27.57', '3'))
self.xsack.addPackage(po1)
po2 = FakePackage('unison227', version='2.27.57', release='7')
- po2.addProvides('unison', EQ, ('0', '2.27.57', '7'))
- po2.addObsoletes('unison', LT, ('0', '2.27.57', '3'))
+ po2.addProvides('unison', 'EQ', ('0', '2.27.57', '7'))
+ po2.addObsoletes('unison', 'LT', ('0', '2.27.57', '3'))
self.xsack.addPackage(po2)
self.assertEquals('ok', *self.resolveCode())
@@ -897,11 +897,11 @@ class DepsolveTests(DepsolveTests):
self.tsInfo.addInstall(xpo)
po1 = FakePackage('unison213', version='2.13.16', release='9')
- po1.addProvides('unison', EQ, ('0', '2.13.16', '9'))
- po1.addObsoletes('unison', LT, ('0', '2.27.57', '3'))
+ po1.addProvides('unison', 'EQ', ('0', '2.13.16', '9'))
+ po1.addObsoletes('unison', 'LT', ('0', '2.27.57', '3'))
po2 = FakePackage('unison227', version='2.27.57', release='7')
- po2.addProvides('unison', EQ, ('0', '2.27.57', '7'))
- po2.addObsoletes('unison', LT, ('0', '2.27.57', '3'))
+ po2.addProvides('unison', 'EQ', ('0', '2.27.57', '7'))
+ po2.addObsoletes('unison', 'LT', ('0', '2.27.57', '3'))
self.xsack.addPackage(po2)
self.xsack.addPackage(po1)
diff --git a/test/operationstests.py b/test/operationstests.py
index 71d311f..12a1627 100644
--- a/test/operationstests.py
+++ b/test/operationstests.py
@@ -9,7 +9,7 @@ class ComplicatedTests(OperationsTests):
simpleobsoletestests.SimpleObsoletesTests.buildPkgs(pkgs)
# conflicts
pkgs.conflicts = FakePackage('super-zippy', '0.3', '1', '0', 'i386')
- pkgs.conflicts.addConflicts('zsh', EQ, ('0', '1', '1'))
+ pkgs.conflicts.addConflicts('zsh', 'EQ', ('0', '1', '1'))
def testObsoleteForConflict(self):
p = self.pkgs
@@ -31,11 +31,11 @@ class CombinedUpdateObsoletesTest(OperationsTests):
pkgs.kdevel_2 = FakePackage('k-devel', '3.5', '2')
pkgs.kdevel_2.addRequires('k')
pkgs.klibs_2_i386 = FakePackage('klibs', '3.5', '2', arch='i386')
- pkgs.klibs_2_i386.addObsoletes('klibs', LT, (None, '3.5', '2'))
- pkgs.klibs_2_i386.addObsoletes('k', LT, (None, '3.5', '2'))
+ pkgs.klibs_2_i386.addObsoletes('klibs', 'LT', (None, '3.5', '2'))
+ pkgs.klibs_2_i386.addObsoletes('k', 'LT', (None, '3.5', '2'))
pkgs.klibs_2_x86_64 = FakePackage('klibs', '3.5', '2', arch='x86_64')
- pkgs.klibs_2_x86_64.addObsoletes('klibs', LT, (None, '3.5', '2'))
- pkgs.klibs_2_x86_64.addObsoletes('k', LT, (None, '3.5', '2'))
+ pkgs.klibs_2_x86_64.addObsoletes('klibs', 'LT', (None, '3.5', '2'))
+ pkgs.klibs_2_x86_64.addObsoletes('k', 'LT', (None, '3.5', '2'))
def testSelfObsolete(self):
p = self.pkgs
diff --git a/test/packagetests.py b/test/packagetests.py
index 44946de..628247d 100644
--- a/test/packagetests.py
+++ b/test/packagetests.py
@@ -3,90 +3,89 @@ import settestpath
from yum import packages
from rpmUtils import miscutils
-from testbase import *
class InPrcoRangePackageTests(unittest.TestCase):
def setUp(self):
self.po = packages.RpmBase()
self.po.rel = 10
- self.po.prco['provides'].append(("seth", EQ, (1, 2, 3)))
- self.po.prco['requires'].append(("foo", GE, (4, 5, None)))
+ self.po.prco['provides'].append(("seth", "EQ", (1, 2, 3)))
+ self.po.prco['requires'].append(("foo", "GE", (4, 5, None)))
def testRequiresEqPass(self):
- dep = ("foo", EQ, (4, 5, 0))
+ dep = ("foo", "EQ", (4, 5, 0))
self.assertTrue(self.po.inPrcoRange('requires', dep))
def testRequiresEqFailGt(self):
- dep = ("foo", EQ, (4, 4, 0))
+ dep = ("foo", "EQ", (4, 4, 0))
self.assertFalse(self.po.inPrcoRange('requires', dep))
def testProvidesGePass(self):
- dep = ("seth", GE, (1, 0, 0))
+ dep = ("seth", "GE", (1, 0, 0))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesGePassWithEqual(self):
- dep = ("seth", GE, (1, 2, 3))
+ dep = ("seth", "GE", (1, 2, 3))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesGeFailOnEpoch(self):
- dep = ("seth", GE, (2, 0, 0))
+ dep = ("seth", "GE", (2, 0, 0))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesGeFailOnVersion(self):
- dep = ("seth", GE, (1, 3, 0))
+ dep = ("seth", "GE", (1, 3, 0))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesGeFailOnRelease(self):
- dep = ("seth", GE, (1, 2, 4))
+ dep = ("seth", "GE", (1, 2, 4))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesGtPass(self):
- dep = ("seth", GT, (1, 0, 0))
+ dep = ("seth", "GT", (1, 0, 0))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesGtFail(self):
- dep = ("seth", GT, (1, 2, 4))
+ dep = ("seth", "GT", (1, 2, 4))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesGtFailOnEqual(self):
- dep = ("seth", GT, (1, 2, 3))
+ dep = ("seth", "GT", (1, 2, 3))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesEqPass(self):
- dep = ("seth", EQ, (1, 2, 3))
+ dep = ("seth", "EQ", (1, 2, 3))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesEqFailGt(self):
- dep = ("seth", EQ, (1, 2, 0))
+ dep = ("seth", "EQ", (1, 2, 0))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesEqFailLt(self):
- dep = ("seth", EQ, (1, 2, 4))
+ dep = ("seth", "EQ", (1, 2, 4))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesLePassEq(self):
- dep = ("seth", LE, (1, 2, 3))
+ dep = ("seth", "LE", (1, 2, 3))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesLePassGt(self):
- dep = ("seth", LE, (1, 5, 2))
+ dep = ("seth", "LE", (1, 5, 2))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesLeFail(self):
- dep = ("seth", LE, (0, 2, 2))
+ dep = ("seth", "LE", (0, 2, 2))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesLtPass(self):
- dep = ("seth", LT, (1, 2, 6))
+ dep = ("seth", "LT", (1, 2, 6))
self.assertTrue(self.po.inPrcoRange('provides', dep))
def testProvidesLtFailEq(self):
- dep = ("seth", LT, (1, 2, 3))
+ dep = ("seth", "LT", (1, 2, 3))
self.assertFalse(self.po.inPrcoRange('provides', dep))
def testProvidesLtFailGt(self):
- dep = ("seth", LT, (1, 0, 2))
+ dep = ("seth", "LT", (1, 0, 2))
self.assertFalse(self.po.inPrcoRange('provides', dep))
@@ -189,13 +188,12 @@ class RangeCompareTests(unittest.TestCase):
def testRangeCompare(self):
for requires, provides, result in (
- (('foo', EQ, ('0', '1.4.4', '0')), ('foo', EQ, ('0', '1.4.4', '0')), 1),
- (('foo', EQ, ('0', '1.4.4', '0')), ('foo', EQ, ('0', '1.4.4', None)), 1),
- (('foo', EQ, ('0', '1.4.4', None)), ('foo', EQ, ('0', '1.4.4', '8')), 1),
- (('foo', LT, ('0', '1.5.4', None)), ('foo', EQ, ('0', '1.4.4', '7')), 1),
- (('foo', GE, ('0', '1.4.4', '7.1')), ('foo', EQ, ('0', '1.4.4', '7')), 0),
- (('foo', EQ, ('0', '1.4', None)), ('foo', EQ, ('0', '1.4.4', '7')), 0),
- (('foo', GT, ('1', '1.4.4', None)), ('foo', EQ, ('3', '1.2.4', '7')), 1),
+ (('foo', 'EQ', ('0', '1.4.4', '0')), ('foo', 'EQ', ('0', '1.4.4', '0')), 1),
+ (('foo', 'EQ', ('0', '1.4.4', '0')), ('foo', 'EQ', ('0', '1.4.4', None)), 1),
+ (('foo', 'EQ', ('0', '1.4.4', None)), ('foo', 'EQ', ('0', '1.4.4', '8')), 1),
+ (('foo', 'LT', ('0', '1.5.4', None)), ('foo', 'EQ', ('0', '1.4.4', '7')), 1),
+ (('foo', 'GE', ('0', '1.4.4', '7.1')), ('foo', 'EQ', ('0', '1.4.4', '7')), 0),
+ (('foo', 'EQ', ('0', '1.4', None)), ('foo', 'EQ', ('0', '1.4.4', '7')), 0),
+ (('foo', 'GT', ('1', '1.4.4', None)), ('foo', 'EQ', ('3', '1.2.4', '7')), 1),
):
- self.assertEquals(miscutils.rangeCompare(requires, provides), result,
- "%r %r: %r" % (requires, provides, result))
+ self.assertEquals(miscutils.rangeCompare(requires, provides), result)
diff --git a/test/simpleobsoletestests.py b/test/simpleobsoletestests.py
index f10f6e4..05ebf05 100644
--- a/test/simpleobsoletestests.py
+++ b/test/simpleobsoletestests.py
@@ -226,11 +226,11 @@ class GitMetapackageObsoletesTests(OperationsTests):
pkgs.metapackage = FakePackage('git', '1.5.4.2', '1', '0', 'x86_64')
# obsoletes
pkgs.new_git = FakePackage('git', '1.5.4.4', '1', '0', 'x86_64')
- pkgs.new_git.addObsoletes('git-core', LE, ('0', '1.5.4.3', '1'))
- pkgs.new_git.addProvides('git-core', EQ, ('0', '1.5.4', '1'))
+ pkgs.new_git.addObsoletes('git-core', 'LE', ('0', '1.5.4.3', '1'))
+ pkgs.new_git.addProvides('git-core', 'EQ', ('0', '1.5.4', '1'))
pkgs.git_all = FakePackage('git-all', '1.5.4', '1', '0', 'x86_64')
- pkgs.git_all.addObsoletes('git', LE, ('0', '1.5.4.3', '1'))
+ pkgs.git_all.addObsoletes('git', 'LE', ('0', '1.5.4.3', '1'))
def testGitMetapackageOnlyCoreInstalled(self):
diff --git a/test/simpleupdatetests.py b/test/simpleupdatetests.py
index 180c880..fe4f414 100644
--- a/test/simpleupdatetests.py
+++ b/test/simpleupdatetests.py
@@ -18,18 +18,18 @@ class SimpleUpdateTests(OperationsTests):
def buildPkgs(pkgs, *args):
# installed
pkgs.installed_i386 = FakePackage('zsh', '1', '1', '0', 'i386')
- pkgs.installed_i386.addRequires('bar', EQ, ('0', '1', '1'))
+ pkgs.installed_i386.addRequires('bar', 'EQ', ('0', '1', '1'))
pkgs.installed_x86_64 = FakePackage('zsh', '1', '1', '0', 'x86_64')
- pkgs.installed_x86_64.addRequires('bar', EQ, ('0', '1', '1'))
+ pkgs.installed_x86_64.addRequires('bar', 'EQ', ('0', '1', '1'))
pkgs.installed_noarch = FakePackage('zsh', '1', '1', '0', 'noarch')
- pkgs.installed_noarch.addRequires('bar', EQ, ('0', '1', '1'))
+ pkgs.installed_noarch.addRequires('bar', 'EQ', ('0', '1', '1'))
# updates
pkgs.update_i386 = FakePackage('zsh', '2', '1', '0', 'i386')
pkgs.update_x86_64 = FakePackage('zsh', '2', '1', '0', 'x86_64')
pkgs.update_noarch = FakePackage('zsh', '2', '1', '0', 'noarch')
# requires update (UpdateForDependency tests)
pkgs.requires_update = FakePackage('zsh-utils', '2', '1', '0', 'noarch')
- pkgs.requires_update.addRequires('zsh', EQ, ('0', '2', '1'))
+ pkgs.requires_update.addRequires('zsh', 'EQ', ('0', '2', '1'))
# removed requirement due to update (UpdateForDependency2 tests)
pkgs.required = FakePackage('bar', '1', '1', '0')
pkgs.required_updated = FakePackage('bar', version='2')
diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index 2b9aabd..e15ae56 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -76,7 +76,7 @@ class SkipBrokenTests(DepsolveTests):
po2 = self.repoPackage('foo', '2')
ipo = self.instPackage('foo-tools', '2.5')
- ipo.addRequires('foo', EQ, ('0', '1', '0'))
+ ipo.addRequires('foo', 'EQ', ('0', '1', '0'))
self.tsInfo.addUpdate(po2, oldpo=po1)
@@ -89,9 +89,9 @@ class SkipBrokenTests(DepsolveTests):
is not provided, the update should be skipped and result in a empty transaction
'''
po1 = self.instPackage('foo', '1')
- po1.addRequires('foo-tools', EQ, ('0', '1', '0'))
+ po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
po2 = self.repoPackage('foo', '2')
- po2.addRequires('foo-tools', EQ, ('0', '2', '0'))
+ po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
ipo = self.instPackage('foo-tools', '1')
@@ -108,13 +108,13 @@ class SkipBrokenTests(DepsolveTests):
there is not longer provided.
'''
po1 = self.instPackage('foo', '1')
- po1.addRequires('foo-tools', EQ, ('0', '1', '0'))
+ po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
po2 = self.repoPackage('foo', '2')
- po2.addRequires('foo-tools', EQ, ('0', '2', '0'))
+ po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
ipo = self.instPackage('foo-tools', '1')
por = self.repoPackage('foo-gui', '1')
- por.addRequires('foo', EQ, ('0', '2', '0'))
+ por.addRequires('foo', 'EQ', ('0', '2', '0'))
self.tsInfo.addUpdate(po2, oldpo=po1)
self.tsInfo.addInstall(por)
@@ -129,7 +129,7 @@ class SkipBrokenTests(DepsolveTests):
'''
ipo = self.instPackage('foo', '1')
ipo2 = self.instPackage('foo-tools', '1')
- ipo2.addRequires('foo', EQ, ('0', '1', '0'))
+ ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
self.tsInfo.addErase(ipo)
self.assertEquals('ok', *self.resolveCode(skip=True))
@@ -141,10 +141,10 @@ class SkipBrokenTests(DepsolveTests):
'''
ipo = self.instPackage('foo', '1')
ipo2 = self.instPackage('foo-tools', '1')
- ipo2.addRequires('foo', EQ, ('0', '1', '0'))
+ ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
upo2 = self.repoPackage('foo-tools', '2')
- upo2.addRequires('foo', EQ, ('0', '1', '0'))
+ upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
self.tsInfo.addErase(ipo)
self.tsInfo.addUpdate(upo2, oldpo=ipo2)
@@ -158,10 +158,10 @@ class SkipBrokenTests(DepsolveTests):
'''
ipo = self.instPackage('foo', '1')
ipo2 = self.instPackage('foo-tools', '1')
- ipo2.addRequires('foo', EQ, ('0', '1', '0'))
+ ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
upo2 = self.repoPackage('foo-tools', '2')
- upo2.addRequires('foo', EQ, ('0', '1', '0'))
+ upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
self.tsInfo.addUpdate(upo2, oldpo=ipo2)
self.tsInfo.addErase(ipo)
@@ -176,7 +176,7 @@ class SkipBrokenTests(DepsolveTests):
'''
po1 = self.instPackage('foo', '1')
po2 = self.repoPackage('foo', '2')
- po2.addConflicts('bar', EQ, ('0', '1', '0'))
+ po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
ipo = self.instPackage('bar', '1')
@@ -193,13 +193,13 @@ class SkipBrokenTests(DepsolveTests):
'''
po1 = self.instPackage('foo', '1')
po2 = self.repoPackage('foo', '2')
- po2.addConflicts('bar', EQ, ('0', '1', '0'))
+ po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
ipo = self.instPackage('bar', '1')
xpo = self.repoPackage('bar', '2')
- xpo.addRequires('foo', EQ, ('0', '1', '0'))
+ xpo.addRequires('foo', 'EQ', ('0', '1', '0'))
self.tsInfo.addUpdate(po2, oldpo=po1)
@@ -215,13 +215,13 @@ class SkipBrokenTests(DepsolveTests):
'''
po1 = self.instPackage('foo', '1')
po2 = self.repoPackage('foo', '2')
- po2.addConflicts('bar', EQ, ('0', '1', '0'))
+ po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
ipo = self.instPackage('bar', '1')
xpo = self.repoPackage('bar', '2')
- xpo.addRequires('poo', EQ, ('0', '1', '0'))
+ xpo.addRequires('poo', 'EQ', ('0', '1', '0'))
self.tsInfo.addUpdate(po2, oldpo=po1)
@@ -286,7 +286,7 @@ class SkipBrokenTests(DepsolveTests):
self.tsInfo.addInstall(po1)
po2 = self.repoPackage('bar')
- po2.addRequires('baz', EQ, (None, '2', '1'))
+ po2.addRequires('baz', 'EQ', (None, '2', '1'))
ipo = self.instPackage('baz')
upo = self.repoPackage('baz', '2', '1')
@@ -353,7 +353,7 @@ class SkipBrokenTests(DepsolveTests):
ipo2 = self.instPackage('foo', '1',arch='x86_64')
po1 = self.repoPackage('foo', '2',arch='i386')
po2 = self.repoPackage('foo', '2',arch='x86_64')
- po2.addRequires('notfound', EQ, ('0', '1', '0'))
+ po2.addRequires('notfound', 'EQ', ('0', '1', '0'))
self.tsInfo.addUpdate(po1, oldpo=ipo1)
self.tsInfo.addUpdate(po2, oldpo=ipo2)
self.assertEquals('empty', *self.resolveCode(skip=True))
diff --git a/test/testbase.py b/test/testbase.py
index b939c12..372fec3 100644
--- a/test/testbase.py
+++ b/test/testbase.py
@@ -16,18 +16,6 @@ import inspect
from rpmUtils import arch
#############################################################
-### RPM Flag constants ######################################
-#############################################################
-import rpm
-
-GT = rpm.RPMSENSE_GREATER
-GE = rpm.RPMSENSE_EQUAL | rpm.RPMSENSE_GREATER
-LT = rpm.RPMSENSE_LESS
-LE = rpm.RPMSENSE_LESS | rpm.RPMSENSE_EQUAL
-EQ = rpm.RPMSENSE_EQUAL
-
-
-#############################################################
### Helper classes ##########################################
#############################################################
@@ -72,7 +60,7 @@ class FakePackage(packages.YumAvailablePackage):
self.arch = arch
self.pkgtup = (self.name, self.arch, self.epoch, self.version, self.release)
- self.prco['provides'].append((name, EQ, (epoch, version, release)))
+ self.prco['provides'].append((name, 'EQ', (epoch, version, release)))
# Just a unique integer
self.id = self.__hash__()
@@ -169,7 +157,7 @@ class DepsolveTests(_DepsolveTestsBase):
def testInstallPackageRequireInstalled(self):
po = FakePackage('zsh', '1', '1', None, 'i386')
- po.addRequires('zip', EQ, (None, '1.3', '2'))
+ po.addRequires('zip', 'EQ', (None, '1.3', '2'))
self.tsInfo.addInstall(po)
ipo = FakePackage('zip', '1.3', '2', None, 'i386')
diff --git a/yum/__init__.py b/yum/__init__.py
index c621a73..ee096c6 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1485,7 +1485,12 @@ class YumBase(depsolve.Depsolve):
if r.startswith('rpmlib('):
continue
- pkgresults[req] = self.pkgs.getProvides(r, f, v).keys()
+ satisfiers = []
+
+ for po in self.whatProvides(r, f, v):
+ satisfiers.append(po)
+
+ pkgresults[req] = satisfiers
return results
@@ -1956,7 +1961,10 @@ class YumBase(depsolve.Depsolve):
raise Errors.YumBaseError, _('Invalid version flag')
depflags = SYMBOLFLAGS[flagsymbol]
- return self.pkgSack.getProvides(depname, depflags, depver).keys()
+ sack = self.whatProvides(depname, depflags, depver)
+ results = sack.returnPackages()
+ return results
+
def returnPackageByDep(self, depstring):
"""Pass in a generic [build]require string and this function will
diff --git a/yum/depsolve.py b/yum/depsolve.py
index ead17b7..dad4912 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -53,6 +53,12 @@ except:
for y in args:
if x < y: x = y
return x
+flags = {"GT": rpm.RPMSENSE_GREATER,
+ "GE": rpm.RPMSENSE_EQUAL | rpm.RPMSENSE_GREATER,
+ "LT": rpm.RPMSENSE_LESS,
+ "LE": rpm.RPMSENSE_LESS | rpm.RPMSENSE_EQUAL,
+ "EQ": rpm.RPMSENSE_EQUAL,
+ None: 0 }
class Depsolve(object):
@@ -135,6 +141,45 @@ class Depsolve(object):
for flag in self.tsInfo.probFilterFlags:
probfilter |= flag
self._ts.setProbFilter(probfilter)
+
+ def whatProvides(self, name, flags, version):
+ """searches the packageSacks for what provides the arguments
+ returns a ListPackageSack of providing packages, possibly empty"""
+
+ self.verbose_logger.log(logginglevels.DEBUG_1, _('Searching pkgSack for dep: %s'),
+ name)
+ # we need to check the name - if it doesn't match:
+ # /etc/* bin/* or /usr/lib/sendmail then we should fetch the
+ # filelists.xml for all repos to make the searchProvides more complete.
+ if name[0] == '/':
+ if not misc.re_primary_filename(name):
+ self.doSackFilelistPopulate()
+
+ pkgs = self.pkgSack.searchProvides(name)
+
+
+ if flags == 0:
+ flags = None
+ if type(version) in (types.StringType, types.NoneType, types.UnicodeType):
+ (r_e, r_v, r_r) = rpmUtils.miscutils.stringToVersion(version)
+ elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
+ (r_e, r_v, r_r) = version
+
+ defSack = ListPackageSack() # holder for items definitely providing this dep
+
+ for po in pkgs:
+ self.verbose_logger.log(logginglevels.DEBUG_2,
+ _('Potential match for %s from %s'), name, po)
+ if name[0] == '/' and r_v is None:
+ # file dep add all matches to the defSack
+ defSack.addPackage(po)
+ continue
+
+ if po.checkPrco('provides', (name, flags, (r_e, r_v, r_r))):
+ defSack.addPackage(po)
+ self.verbose_logger.debug(_('Matched %s to require for %s'), po, name)
+
+ return defSack
def allowedMultipleInstalls(self, po):
"""takes a packageObject, returns 1 or 0 depending on if the package
@@ -206,7 +251,7 @@ class Depsolve(object):
self.verbose_logger.log(logginglevels.DEBUG_1,
_('Removing Package %s'), txmbr.po)
- def _processReq(self, po, requirement, remove_txmbr=None):
+ def _processReq(self, po, requirement):
"""processes a Requires dep from the resolveDeps functions, returns a tuple
of (CheckDeps, missingdep, conflicts, errors) the last item is an array
of error messages"""
@@ -222,7 +267,7 @@ class Depsolve(object):
if po.repo.id != "installed":
CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
else:
- CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, remove_txmbr, errormsgs)
+ CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
# Check packages with problems
if missingdep:
@@ -241,7 +286,7 @@ class Depsolve(object):
return (CheckDeps, missingdep, errormsgs)
- def _requiringFromInstalled(self, requiringPo, requirement, remove_txmbr, errorlist):
+ def _requiringFromInstalled(self, requiringPo, requirement, errorlist):
"""processes the dependency resolution for a dep where the requiring
package is installed"""
@@ -256,15 +301,71 @@ class Depsolve(object):
needname, needflags, needversion = requirement
niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, needflags)
- if not remove_txmbr:
- for po in self.rpmdb.getProvides(*requirement):
- for txmbr in self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES):
- if (remove_txmbr is None or
- (not txmbr.obsoleted_by and not txmbr.updated_by)):
- # prefer true deletes
- remove_txmbr = txmbr
+
+ # we must first find out why the requirement is no longer there
+ # we must find out what provides/provided it from the rpmdb (if anything)
+ # then check to see if that thing is being acted upon by the transaction set
+ # if it is then we need to find out what is being done to it and act accordingly
+ needmode = None # mode in the transaction of the needed pkg (if any)
+ needpo = None
+ providers = []
+
+ if self.cheaterlookup.has_key((needname, needflags, needversion)):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require has already been looked up, cheating'))
+ cheater_po = self.cheaterlookup[(needname, needflags, needversion)]
+ providers = [cheater_po]
+
+ elif self.rpmdb.contains(name=needname):
+ txmbrs = self.tsInfo.matchNaevr(name=needname)
+ for txmbr in txmbrs:
+ 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.getProvides(needname, needflags, needversion)
+
+ for inst_po in providers:
+ inst_str = '%s.%s %s:%s-%s' % inst_po.pkgtup
+ (i_n, i_a, i_e, i_v, i_r) = inst_po.pkgtup
+ self.verbose_logger.log(logginglevels.DEBUG_2,
+ _('Potential Provider: %s'), inst_str)
+ thismode = self.tsInfo.getMode(name=i_n, arch=i_a,
+ epoch=i_e, ver=i_v, rel=i_r)
+
+ if thismode is None and i_n in self.conf.exactarchlist:
+ # check for mode by the same name+arch
+ thismode = self.tsInfo.getMode(name=i_n, arch=i_a)
+
+ if thismode is None and i_n not in self.conf.exactarchlist:
+ # check for mode by just the name
+ thismode = self.tsInfo.getMode(name=i_n)
+
+ # if this package is being obsoleted, it's just like if it's
+ # being upgraded as far as checking for other providers
+ if thismode is None:
+ if filter(lambda x: x.obsoleted_by,
+ self.tsInfo.matchNaevr(i_n, i_a, i_e, i_v, i_r)):
+ thismode = 'u'
+
+ if thismode is not None:
+ needmode = thismode
+
+ 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
+
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode for pkg providing %s: %s'),
+ niceformatneed, needmode)
+
+ if needmode in ['e']:
+ 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=inst_po)
+ checkdeps = 1
- if remove_txmbr and (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
+ if needmode in ['i', 'u']:
length = len(self.tsInfo)
self.update(name=name, epoch=epoch, version=ver, release=rel)
txmbrs = self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES)
@@ -278,16 +379,23 @@ class Depsolve(object):
return checkdeps, missingdep
self.verbose_logger.log(logginglevels.DEBUG_2, _('Cannot find an update path for dep for: %s'), niceformatneed)
return self._requiringFromTransaction(requiringPo, requirement, errorlist)
+
- if remove_txmbr and remove_txmbr.ts_state=='e' and not (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
- 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=remove_txmbr.po)
- checkdeps = 1
- return checkdeps, missingdep
+ if needmode is None:
+ reqpkg = (name, ver, rel, None)
+ if self.pkgSack is None:
+ return self._requiringFromTransaction(requiringPo, requirement, errorlist)
+ else:
+ prob_pkg = "%s (%s)" % (requiringPo,requiringPo.repoid)
+ msg = _('Unresolvable requirement %s for %s') % (niceformatneed,
+ prob_pkg)
+ self.verbose_logger.log(logginglevels.DEBUG_2, msg)
+ checkdeps = 0
+ missingdep = 1
+ errorlist.append(msg)
- return self._requiringFromTransaction(requiringPo, requirement, errorlist)
+ return checkdeps, missingdep
+
def _requiringFromTransaction(self, requiringPo, requirement, errorlist):
"""processes the dependency resolution for a dep where requiring
@@ -319,8 +427,7 @@ class Depsolve(object):
# - if they are the same
# - be confused but continue
- provSack = ListPackageSack(self.pkgSack.getProvides(
- needname, needflags or None, rpmUtils.miscutils.stringToVersion(needversion)))
+ provSack = self.whatProvides(needname, needflags, needversion)
# get rid of things that are already in the rpmdb - b/c it's pointless to use them here
@@ -547,17 +654,10 @@ class Depsolve(object):
# check global FileRequires
if CheckRemoves:
CheckRemoves = False
- filerequires = self._checkFileRequires()
- while True:
- for po, dep in filerequires:
- (checkdep, missing, errormsgs) = self._processReq(po, dep)
- CheckDeps |= checkdep
- errors += errormsgs
- if CheckDeps:
- filerequires = self._checkFileRequires()
- break
- else:
- break # end while loop if for loop ran through
+ for po, dep in self._checkFileRequires():
+ (checkdep, missing, errormsgs) = self._processReq(po, dep)
+ CheckDeps |= checkdep
+ errors += errormsgs
if CheckDeps:
if self.dsCallback: self.dsCallback.restartLoop()
@@ -567,17 +667,10 @@ class Depsolve(object):
# check Conflicts
if CheckInstalls:
CheckInstalls = False
- conflicts = self._checkConflicts()
- while True:
- for conflict in conflicts:
- (checkdep, errormsgs) = self._processConflict(*conflict)
- CheckDeps |= checkdep
- errors += errormsgs
- if checkdep:
- conflicts = self._checkConflicts()
- break
- else:
- break # end while loop if for loop ran through
+ for conflict in self._checkConflicts():
+ (checkdep, errormsgs) = self._processConflict(*conflict)
+ CheckDeps |= checkdep
+ errors += errormsgs
if CheckDeps:
if self.dsCallback: self.dsCallback.restartLoop()
@@ -643,21 +736,11 @@ class Depsolve(object):
CheckRemoves = True
missing_in_pkg = False
-
- while True:
- for po, dep, removed_txmbr in thisneeds:
- (checkdep, missing, errormsgs) = self._processReq(po, dep, removed_txmbr)
- CheckDeps |= checkdep
- errors += errormsgs
- missing_in_pkg |= missing
- if checkdep:
- if (txmbr.output_state in TS_INSTALL_STATES) == (txmbr.po.state != None):
- thisneeds = self._checkInstall(txmbr)
- else:
- thisneeds = self._checkRemove(txmbr)
- break
- else:
- break
+ for po, dep in thisneeds:
+ (checkdep, missing, errormsgs) = self._processReq(po, dep)
+ CheckDeps |= checkdep
+ errors += errormsgs
+ missing_in_pkg |= missing
if not missing_in_pkg:
self.tsInfo.markAsResolved(txmbr)
@@ -678,6 +761,7 @@ class Depsolve(object):
oldreqs.extend(oldpo.returnPrco('requires'))
oldreqs = set(oldreqs)
+ ret = []
for req in txmbr_reqs:
if req[0].startswith('rpmlib('):
continue
@@ -689,7 +773,8 @@ class Depsolve(object):
self.verbose_logger.log(logginglevels.DEBUG_2, _("looking for %s as a requirement of %s"), req, txmbr)
provs = self.tsInfo.getProvides(*req)
if not provs:
- yield (txmbr.po, (req[0], req[1], version_tuple_to_string(req[2])), None)
+ ret.append( (txmbr.po, (req[0], flags[req[1]], version_tuple_to_string(req[2]))) )
+ continue
#Add relationship
for po in provs:
@@ -699,6 +784,8 @@ class Depsolve(object):
pkgtup=po.pkgtup, output_states=TS_INSTALL_STATES):
member.relatedto.append((txmbr.po, 'dependson'))
+ return ret
+
def _checkRemove(self, txmbr):
po = txmbr.po
provs = po.returnPrco('provides')
@@ -709,6 +796,7 @@ class Depsolve(object):
for newpo in txmbr.updated_by:
for p in newpo.provides:
newpoprovs[p] = 1
+ ret = []
# iterate over the provides of the package being removed
# and see what's actually going away
@@ -720,11 +808,13 @@ class Depsolve(object):
for pkg, hits in self.tsInfo.getRequires(*prov).iteritems():
for rn, rf, rv in hits:
if not self.tsInfo.getProvides(rn, rf, rv):
- yield (pkg, (rn, rf, version_tuple_to_string(rv)), txmbr)
+ ret.append( (pkg, (rn, flags[rf], version_tuple_to_string(rv))) )
+ return ret
def _checkFileRequires(self):
fileRequires = set()
reverselookup = {}
+ ret = []
# generate list of file requirement in rpmdb
if self.installedFileRequires is None:
@@ -771,9 +861,13 @@ class Depsolve(object):
for filename in fileRequires:
if not self.tsInfo.getOldProvides(filename) and not self.tsInfo.getNewProvides(filename):
for po in reverselookup[filename]:
- yield (po, (filename, 0, ''))
+ ret.append( (po, (filename, 0, '')) )
+
+ return ret
+
def _checkConflicts(self):
+ ret = [ ]
for po in self.rpmdb.returnPackages():
if self.tsInfo.getMembersWithState(po.pkgtup, output_states=TS_REMOVE_STATES):
continue
@@ -782,7 +876,7 @@ class Depsolve(object):
for conflicting_po in self.tsInfo.getNewProvides(r, f, v):
if conflicting_po.pkgtup[0] == po.pkgtup[0] and conflicting_po.pkgtup[2:] == po.pkgtup[2:]:
continue
- yield (po, (r, f, version_tuple_to_string(v)), conflicting_po)
+ ret.append( (po, (r, flags[f], version_tuple_to_string(v)), conflicting_po) )
for txmbr in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES):
po = txmbr.po
for conflict in txmbr.po.returnPrco('conflicts'):
@@ -790,7 +884,8 @@ class Depsolve(object):
for conflicting_po in self.tsInfo.getProvides(r, f, v):
if conflicting_po.pkgtup[0] == po.pkgtup[0] and conflicting_po.pkgtup[2:] == po.pkgtup[2:]:
continue
- yield (po, (r, f, version_tuple_to_string(v)), conflicting_po)
+ ret.append( (po, (r, flags[f], version_tuple_to_string(v)), conflicting_po) )
+ return ret
def isPackageInstalled(self, pkgname):
diff --git a/yum/packageSack.py b/yum/packageSack.py
index 4aeccbb..975a39b 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -88,12 +88,20 @@ class PackageSackBase(object):
"""return dict { packages -> list of matching requires }"""
raise NotImplementedError()
- def getConflicts(self, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching conflicts }"""
+ def searchRequires(self, name):
+ """return list of package requiring the name (any evr and flag)"""
raise NotImplementedError()
- def getObsoletes(self, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching obsoletes }"""
+ def searchProvides(self, name):
+ """return list of package providing the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def searchConflicts(self, name):
+ """return list of package conflicting with the name (any evr and flag)"""
+ raise NotImplementedError()
+
+ def searchObsoletes(self, name):
+ """return list of package obsoleting the name (any evr and flag)"""
raise NotImplementedError()
def returnObsoletes(self, newest=False):
@@ -290,13 +298,21 @@ class MetaSack(PackageSackBase):
"""return dict { packages -> list of matching requires }"""
return self._computeAggregateDictResult("getRequires", name, flags, version)
- def getConflicts(self, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching provides }"""
- return self._computeAggregateDictResult("getConflicts", name, flags, version)
+ def searchRequires(self, name):
+ """return list of package requiring the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchRequires", name)
- def getObsoletes(self, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching requires }"""
- return self._computeAggregateDictResult("getObsoletes", name, flags, version)
+ def searchProvides(self, name):
+ """return list of package providing the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchProvides", name)
+
+ def searchConflicts(self, name):
+ """return list of package conflicting with the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchConflicts", name)
+
+ def searchObsoletes(self, name):
+ """return list of package obsoleting the name (any evr and flag)"""
+ return self._computeAggregateListResult("searchObsoletes", name)
def returnObsoletes(self, newest=False):
"""returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
@@ -504,20 +520,14 @@ class PackageSack(PackageSackBase):
result.append(po)
return result
- def _getPRCO(self, PRCO, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching RCO }"""
+ def getProvides(self, name, flags=None, version=(None, None, None)):
+ """return dict { packages -> list of matching provides }"""
self._checkIndexes(failure='build')
result = { }
- for po in getattr(self, PRCO).get(name, []):
- hits = po.matchingPrcos(PRCO, (name, flags, version))
+ for po in self.provides.get(name, []):
+ hits = po.matchingPrcos('provides', (name, flags, version))
if hits:
result[po] = hits
- return result
-
- def getProvides(self, name, flags=None, version=(None, None, None)):
- """return dict { packages -> list of matching provides }"""
- self._checkIndexes(failure='build')
- result = self._getPRCO('provides', name, flags, version)
if name[0] == '/':
hit = (name, None, (None, None, None))
for po in self.searchFiles(name):
@@ -525,11 +535,50 @@ class PackageSack(PackageSackBase):
return result
def getRequires(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('requires', name, flags, version)
- def getConflicts(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('conflicts', name, flags, version)
- def getObsoletes(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('obsoletes', name, flags, version)
+ """return dict { packages -> list of matching requires }"""
+ self._checkIndexes(failure='build')
+ result = { }
+ for po in self.requires.get(name, []):
+ hits = po.matchingPrcos('requires', (name, flags, version))
+ if hits:
+ result[po] = hits
+ return result
+
+ def searchRequires(self, name):
+ """return list of package requiring the name (any evr and flag)"""
+ self._checkIndexes(failure='build')
+ if self.requires.has_key(name):
+ return self.requires[name]
+ else:
+ return []
+
+ def searchProvides(self, name):
+ """return list of package providing the name (any evr and flag)"""
+ # FIXME - should this do a pkgobj.checkPrco((name, flag, (e,v,r,))??
+ # has to do a searchFiles and a searchProvides for things starting with /
+ self._checkIndexes(failure='build')
+ returnList = []
+ if name[0] == '/':
+ returnList.extend(self.searchFiles(name))
+ if self.provides.has_key(name):
+ returnList.extend(self.provides[name])
+ return returnList
+
+ def searchConflicts(self, name):
+ """return list of package conflicting with the name (any evr and flag)"""
+ self._checkIndexes(failure='build')
+ if self.conflicts.has_key(name):
+ return self.conflicts[name]
+ else:
+ return []
+
+ def searchObsoletes(self, name):
+ """return list of package obsoleting the name (any evr and flag)"""
+ self._checkIndexes(failure='build')
+ if self.obsoletes.has_key(name):
+ return self.obsoletes[name]
+ else:
+ return []
def returnObsoletes(self, newest=False):
"""returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
diff --git a/yum/packages.py b/yum/packages.py
index 4e5d61e..49630f6 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -310,8 +310,8 @@ class RpmBase(object):
continue
if f == '=':
- f = rpm.RPMSENSE_EQUAL
- if f != rpm.RPMSENSE_EQUAL and prcotype == 'provides':
+ f = 'EQ'
+ if f != 'EQ' and prcotype == 'provides':
# isn't this odd, it's not 'EQ' and it is a provides
# - it really should be EQ
# use the pkgobj's evr for the comparison
@@ -751,7 +751,9 @@ class YumHeaderPackage(YumAvailablePackage):
if name is None:
continue
- flag = map(misc.share_data, hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)])
+ lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)]
+ 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)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index f64409e..7b08ab0 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -93,11 +93,16 @@ class RPMDBPackageSack(PackageSackBase):
self._tup2pkg = {}
self._completely_loaded = False
self._simple_pkgtup_list = []
- self._get_prco_cache = {'provides' : {},
- 'requires' : {},
- 'conflicts' : {},
- 'obsoletes' : {}}
+ self._get_pro_cache = {}
+ self._get_req_cache = {}
self.ts = None
+
+ self._cache = {
+ 'provides' : { },
+ 'requires' : { },
+ 'conflicts' : { },
+ 'obsoletes' : { },
+ }
def _get_pkglist(self):
'''Getter for the pkglist property.
@@ -117,9 +122,15 @@ class RPMDBPackageSack(PackageSackBase):
self._tup2pkg = {}
self._completely_loaded = False
self._simple_pkgtup_list = []
- for cache in self._get_prco_cache.values():
- cache.clear()
+ self._get_pro_cache = {}
+ self._get_req_cache = {}
misc.unshare_data()
+ self._cache = {
+ 'provides' : { },
+ 'requires' : { },
+ 'conflicts' : { },
+ 'obsoletes' : { },
+ }
def readOnlyTS(self):
if not self.ts:
@@ -175,6 +186,43 @@ class RPMDBPackageSack(PackageSackBase):
result = result.values()
return result
+ def searchPrco(self, name, prcotype):
+
+ result = self._cache[prcotype].get(name)
+ if result is not None:
+ return result
+
+ ts = self.readOnlyTS()
+ result = {}
+ tag = self.DEP_TABLE[prcotype][0]
+ mi = ts.dbMatch(tag, name)
+ for hdr in mi:
+ po = self._makePackageObject(hdr, mi.instance())
+ result[po.pkgid] = po
+ del mi
+
+ # If it's not a provides or filename, we are done
+ if prcotype == 'provides' and name[0] == '/':
+ fileresults = self.searchFiles(name)
+ for pkg in fileresults:
+ result[pkg.pkgid] = pkg
+
+ result = result.values()
+ self._cache[prcotype][name] = result
+ return result
+
+ def searchProvides(self, name):
+ return self.searchPrco(name, 'provides')
+
+ def searchRequires(self, name):
+ return self.searchPrco(name, 'requires')
+
+ def searchObsoletes(self, name):
+ return self.searchPrco(name, 'obsoletes')
+
+ def searchConflicts(self, name):
+ return self.searchPrco(name, 'conflicts')
+
def simplePkgList(self):
return self.pkglist
@@ -477,55 +525,63 @@ class RPMDBPackageSack(PackageSackBase):
misc.share_data(r_r)))
return misc.share_data(deptup)
- def _getPRCO(self, PRCO, name, flags=None, version=(None, None, None)):
+ def getProvides(self, name, flags=None, version=(None, None, None)):
"""searches the rpmdb for what provides the arguments
returns a list of pkgtuples of providing packages, possibly empty"""
name = misc.share_data(name)
deptup = self._genDeptup(name, flags, version)
- if deptup in self._get_prco_cache[PRCO]:
- return self._get_prco_cache[PRCO][deptup]
+ if deptup in self._get_pro_cache:
+ return self._get_pro_cache[deptup]
r_v = deptup[2][1]
-
- ts = self.readOnlyTS()
- pkgs = {}
- tag = self.DEP_TABLE[PRCO][0]
- mi = ts.dbMatch(tag, name)
- for hdr in mi:
- po = self._makePackageObject(hdr, mi.instance())
- pkgs[po.pkgid] = po
- del mi
-
- # If it's not a provides or filename, we are done
- if PRCO == 'provides' and name[0] == '/':
- fileresults = self.searchFiles(name)
- for pkg in fileresults:
- pkgs[pkg.pkgid] = pkg
- result = {}
- for po in pkgs.values():
+ pkgs = self.searchProvides(name)
+
+ result = { }
+
+ for po in pkgs:
if name[0] == '/' and r_v is None:
- # file dep add all matches to the defSack
result[po] = [(name, None, (None, None, None))]
continue
- hits = po.matchingPrcos(PRCO, deptup)
+ hits = po.matchingPrcos('provides', deptup)
if hits:
result[po] = hits
- self._get_prco_cache[PRCO][deptup] = result
+ self._get_pro_cache[deptup] = result
return result
- def getProvides(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('provides', name, flags, version)
+ def whatProvides(self, name, flags, version):
+ # XXX deprecate?
+ return [po.pkgtup for po in self.getProvides(name, flags, version)]
def getRequires(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('requires', name, flags, version)
+ """searches the rpmdb for what provides the arguments
+ returns a list of pkgtuples of providing packages, possibly empty"""
- def getConflicts(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('conflicts', name, flags, version)
+ name = misc.share_data(name)
+ deptup = self._genDeptup(name, flags, version)
+ if deptup in self._get_req_cache:
+ return self._get_req_cache[deptup]
+ r_v = deptup[2][1]
+
+ pkgs = self.searchRequires(name)
- def getObsoletes(self, name, flags=None, version=(None, None, None)):
- return self._getPRCO('obsoletes', name, flags, version)
+ result = { }
+ for po in pkgs:
+ if name[0] == '/' and r_v is None:
+ # file dep add all matches to the defSack
+ result[po] = [(name, None, (None, None, None))]
+ continue
+ hits = po.matchingPrcos('requires', deptup)
+ if hits:
+ result[po] = hits
+ self._get_req_cache[deptup] = result
+ return result
+
+ def whatRequires(self, name, flags, version):
+ # XXX deprecate?
+ return [po.pkgtup for po in self.getRequires(name, flags, version)]
+
def main():
sack = RPMDBPackageSack('/')
for p in sack.simplePkgList():
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 6b66e31..90cdfb3 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -27,7 +27,6 @@ import yumRepo
from packages import PackageObject, RpmBase, YumAvailablePackage
import Errors
import misc
-import rpm
from sqlutils import executeSQL
import rpmUtils.miscutils
@@ -52,13 +51,6 @@ def catchSqliteException(func):
def _share_data(value):
return misc.share_data(value)
-_flags2rpm = {"GT": rpm.RPMSENSE_GREATER,
- "GE": rpm.RPMSENSE_EQUAL | rpm.RPMSENSE_GREATER,
- "LT": rpm.RPMSENSE_LESS,
- "LE": rpm.RPMSENSE_LESS | rpm.RPMSENSE_EQUAL,
- "EQ": rpm.RPMSENSE_EQUAL,
- None: 0 }
-
class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
def __init__(self, repo, db_obj):
self.prco = { 'obsoletes': (),
@@ -243,7 +235,7 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
cur = self._sql_MD('primary', sql, (self.pkgKey,))
self.prco[prcotype] = [ ]
for ob in cur:
- prco_set = (_share_data(ob['name']), _share_data(_flags2rpm[ob['flags']]),
+ prco_set = (_share_data(ob['name']), _share_data(ob['flags']),
(_share_data(ob['epoch']),
_share_data(ob['version']),
_share_data(ob['release'])))
@@ -422,7 +414,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
# or provide a file containing name
def searchAll(self,name, query_type='like'):
# this function is just silly and it reduces down to just this
- return self._searchPrco(name, 'provides')
+ return self.searchPrco(name, 'provides')
def _sql_pkgKey2po(self, repo, cur, pkgs=None):
""" Takes a cursor and maps the pkgKey rows into a list of packages. """
@@ -603,7 +595,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
_share_data(ob['epoch']), _share_data(ob['version']),
_share_data(ob['release']))
(n,f,e,v,r) = ( _share_data(ob['oname']),
- _share_data(_flags2rpm[ob['oflags']]),
+ _share_data(ob['oflags']),
_share_data(ob['oepoch']),
_share_data(ob['oversion']),
_share_data(ob['orelease']))
@@ -650,7 +642,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
cur = cache.cursor()
executeSQL(cur, "select * from %s" % prcotype)
for x in cur:
- val = (_share_data(x['name']), _share_data(_flags2rpm[x['flags']]),
+ val = (_share_data(x['name']), _share_data(x['flags']),
(_share_data(x['epoch']), _share_data(x['version']),
_share_data(x['release'])))
val = _share_data(val)
@@ -713,7 +705,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
(name,))
tmp = { }
for x in cur:
- val = (_share_data(x['name']), _share_data(_flags2rpm[x['flags']]),
+ val = (_share_data(x['name']), _share_data(x['flags']),
(_share_data(x['epoch']), _share_data(x['version']),
_share_data(x['release'])))
val = _share_data(val)
@@ -758,15 +750,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
def getRequires(self, name, flags=None, version=(None, None, None)):
return self._search("requires", name, flags, version)
- def getConflicts(self, name, flags=None, version=(None, None, None)):
- return self._search("conflicts", name, flags, version)
-
- def getObsoletes(self, name, flags=None, version=(None, None, None)):
- return self._search("obsoletes", name, flags, version)
-
@catchSqliteException
- def _searchPrco(self, name, prcotype):
+ def searchPrco(self, name, prcotype):
"""return list of packages having prcotype name (any evr and flag)"""
glob = True
querytype = 'glob'
@@ -847,6 +833,23 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
#~ return results
+ def searchProvides(self, name):
+ """return list of packages providing name (any evr and flag)"""
+ return self.searchPrco(name, "provides")
+
+ def searchRequires(self, name):
+ """return list of packages requiring name (any evr and flag)"""
+ return self.searchPrco(name, "requires")
+
+ def searchObsoletes(self, name):
+ """return list of packages obsoleting name (any evr and flag)"""
+ return self.searchPrco(name, "obsoletes")
+
+ def searchConflicts(self, name):
+ """return list of packages conflicting with name (any evr and flag)"""
+ return self.searchPrco(name, "conflicts")
+
+
def db2class(self, db, nevra_only=False):
print 'die die die die die db2class'
pass
More information about the Yum-cvs-commits
mailing list