[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