[yum-commits] Branch 'yum-3_2_X' - 8 commits - rpmUtils/miscutils.py test/packagetests.py yum/__init__.py yum/config.py yum/misc.py yum/sqlitesack.py

James Antill james at osuosl.org
Tue Jun 23 21:47:51 UTC 2009


 rpmUtils/miscutils.py |    8 ++--
 test/packagetests.py  |   85 +++++++++++++++++++++++++++++++++++++++++++++++++-
 yum/__init__.py       |    8 ++--
 yum/config.py         |    6 ++-
 yum/misc.py           |    2 -
 yum/sqlitesack.py     |   51 ++++++++++++++++++++----------
 6 files changed, 133 insertions(+), 27 deletions(-)

New commits:
commit 019e89f247cab9c957dd41ccda91ec063009618e
Author: James Antill <james at and.org>
Date:   Tue Jun 23 17:46:05 2009 -0400

    Expand the tests for rangeCompare()

diff --git a/test/packagetests.py b/test/packagetests.py
index 628247d..e658cfa 100644
--- a/test/packagetests.py
+++ b/test/packagetests.py
@@ -184,9 +184,72 @@ class BuildPackageDictRefTests(unittest.TestCase):
 
         self.assertEquals(0, len(unseen_keys))
 
+def _perms(evr): # Magic comp. sci. stuff ... oooh
+    e, v, r = evr
+    for num in range(8):
+        perm = []
+        if num & 1:
+            perm.append(e)
+        else:
+            perm.append(None)
+        if num & 2:
+            perm.append(v)
+        else:
+            perm.append(None)
+        if num & 4:
+            perm.append(r)
+        else:
+            perm.append(None)
+        yield tuple(perm)
+
 class RangeCompareTests(unittest.TestCase):
 
     def testRangeCompare(self):
+        def tst(requires, provides, result):
+            print requires, provides
+            self.assertEquals(miscutils.rangeCompare(requires, provides),result)
+        def tst_lege_prov(requires, provides, result):
+            if not result or provides[1] != 'EQ':
+                return
+            for flag in ('GE', 'LE'): # EQ is a subset of either LE or GE
+                nprovides = (provides[0], flag, provides[2])
+                tst(requires, nprovides, result)
+        def tst_lege_reqs(requires, provides, result):
+            tst_lege_prov(requires, provides, result)
+            if not result or requires[1] != 'EQ':
+                return
+            for flag in ('GE', 'LE'): # EQ is a subset of either LE or GE
+                nrequires = (requires[0], flag, requires[2])
+                tst(nrequires, provides, result)
+                tst_lege_prov(nrequires, provides, result)
+        def tst_none_reqs(requires, provides, result):
+            if (not result or requires[1] or provides[1] != 'EQ' or
+                requires[2] != (None, None, None)):
+                return
+            tst_lege_prov(requires, provides, result)
+            # Doesn't matter about versions
+            for flag in ('GE', 'EQ', 'LE'):
+                nrequires = (requires[0], flag, requires[2])
+                tst(nrequires, provides, result)
+                tst_lege_prov(nrequires, provides, result)
+        def tst_none_expand(requires, provides, result, *args):
+            if requires[2] != (None, None, None):
+                return
+            # Expand parts of the version, replacing with data from provides.
+            # Eg. (None, None, None) and ('1', '2', '3') becomes:
+            #     (None, None, None)
+            #     ('1',  None,  None)
+            #     (None,  '2',  None)
+            #     (None, None,  '3')
+            #     ('1',   '2',  None)
+            #     ...
+            #     ('1',   '2',   '3')
+
+            for evr in _perms(provides[2]):
+                nrequires = (requires[0], requires[1], evr)
+                for func in args:
+                    func(nrequires, provides, result)
+
         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),
@@ -195,5 +258,25 @@ class RangeCompareTests(unittest.TestCase):
             (('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', None, (None, None, None)),    ('foo', 'EQ', ('3', '1.2.4', '7')),  1),
+            (('fuu', None, (None, None, None)),    ('foo', 'EQ', ('3', '1.2.4', '7')),  0),
+            (('foo', None, (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  1),
+
+            (('foo', 'EQ', (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  0),
+            (('foo', 'LT', (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  0),
+            (('foo', 'LE', (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  0),
+            (('foo', 'GE', (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  1),
+            (('foo', 'GT', (None, None, None)),    ('foo', 'GT', ('3', '1.2.4', '7')),  1),
+
+            (('foo', 'EQ', (None, None, None)),    ('foo', 'LT', ('3', '1.2.4', '7')),  0),
+            (('foo', 'LT', (None, None, None)),    ('foo', 'LT', ('3', '1.2.4', '7')),  1),
+            (('foo', 'LE', (None, None, None)),    ('foo', 'LT', ('3', '1.2.4', '7')),  1),
+            (('foo', 'GE', (None, None, None)),    ('foo', 'LT', ('3', '1.2.4', '7')),  0),
+            (('foo', 'GT', (None, None, None)),    ('foo', 'LT', ('3', '1.2.4', '7')),  0),
             ):
-            self.assertEquals(miscutils.rangeCompare(requires, provides), result)
+
+            tst(requires, provides, result)
+
+            tst_lege_reqs(requires, provides, result)
+            tst_none_expand(requires, provides, result,
+                            tst, tst_lege_reqs, tst_none_reqs)
commit 3068a8a5cc83ca2f879e3735bc32bd26559df699
Author: Ville Skyttä <ville.skytta at iki.fi>
Date:   Sun Jun 21 23:14:23 2009 +0300

    Make unversioned satisfy everything in rangeCompare() also with flag=0.

diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py
index 9f32e54..83026d6 100644
--- a/rpmUtils/miscutils.py
+++ b/rpmUtils/miscutils.py
@@ -146,7 +146,8 @@ def rangeCompare(reqtuple, provtuple):
     if reqn != n:
         return 0
 
-    if f is None or reqf is None:
+    # unversioned satisfies everything
+    if not f or not reqf:
         return 1
 
     # and you thought we were done having fun
commit 2f6e979847e88761c75571f15fe34ba179783ec5
Author: James Antill <james at and.org>
Date:   Tue Jun 23 14:51:26 2009 -0400

     Speed up SQL searchFiles() when we can.
       Eg. "*/blah" can make the function match be == filename
       Eg. "*bin/blah" can filter to directories that end in "bin", and do
           the filename thing.

diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index a77a4c8..5692c07 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -36,6 +36,7 @@ import operator
 from yum.misc import seq_max_split
 from yum.i18n import to_utf8, to_unicode
 import sys
+import re
 
 def catchSqliteException(func):
     """This decorator converts sqlite exceptions into RepoError"""
@@ -727,10 +728,16 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         # if so, just use those for the lookup
         
         glob = True
+        file_glob = True
         querytype = 'glob'
+        dirname  = os.path.dirname(name)
+        filename = os.path.basename(name)
         if strict or not misc.re_glob(name):
             glob = False
+            file_glob = False
             querytype = '='
+        elif not misc.re_glob(filename):
+            file_glob = False
 
         # Take off the trailing slash to act like rpm
         if name[-1] == '/':
@@ -754,41 +761,53 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
             if pri_pkgs != fil_pkgs:
                 raise Errors.RepoError
 
+        sql_params = []
+        dirname_check = ""
+        if not glob:
+            (pattern, esc) = self._sql_esc(filename)
+            dirname_check = "dirname = ? and filenames LIKE ? %s and " % esc
+            sql_params.append(dirname)
+            sql_params.append('%' + pattern + '%')
+        elif not file_glob:
+            (pattern, esc) = self._sql_esc(filename)
+            dirname_check = "dirname GLOB ? and filenames LIKE ? %s and " % esc
+            sql_params.append(dirname)
+            sql_params.append('%' + pattern + '%')
+
         for (rep,cache) in self.filelistsdb.items():
             if rep in self._all_excludes:
                 continue
 
             cur = cache.cursor()
 
-            if glob:
-                dirname_check = ""
-            else:
-                dirname = os.path.dirname(name)
-                dirname_check = "dirname = \"%s\" and " % dirname
-
             # grab the entries that are a single file in the 
             # filenames section, use sqlites globbing if it is a glob
             executeSQL(cur, "select pkgKey from filelist where \
                     %s length(filetypes) = 1 and \
                     dirname || ? || filenames \
-                    %s ?" % (dirname_check, querytype), ('/', name))
+                    %s ?" % (dirname_check, querytype), sql_params + ['/',name])
             self._sql_pkgKey2po(rep, cur, pkgs)
 
-            def filelist_globber(dirname, filenames):
-                files = filenames.split('/')
-                fns = map(lambda f: '%s/%s' % (dirname, f), files)
-                if glob:
-                    matches = fnmatch.filter(fns, name)
-                else:
-                    matches = filter(lambda x: name==x, fns)
-                return len(matches)
+            if file_glob:
+                name_re = re.compile(fnmatch.translate(name))
+            def filelist_globber(sql_dirname, sql_filenames):
+                files = sql_filenames.split('/')
+                if not file_glob:
+                    return filename in files
+
+                fns = map(lambda f: '%s/%s' % (sql_dirname, f), files)
+                for match in fns:
+                    if name_re.match(match):
+                        return True
+                return False
 
             cache.create_function("filelist_globber", 2, filelist_globber)
             # for all the ones where filenames is multiple files, 
             # make the files up whole and use python's globbing method
             executeSQL(cur, "select pkgKey from filelist where \
                              %s length(filetypes) > 1 \
-                             and filelist_globber(dirname,filenames)" % dirname_check)
+                             and filelist_globber(dirname,filenames)" % dirname_check,
+                       sql_params)
 
             self._sql_pkgKey2po(rep, cur, pkgs)
 
commit a1beea1b7d687837b2688c86767a7521cb26bb6e
Author: James Antill <james at and.org>
Date:   Tue Jun 23 14:16:15 2009 -0400

    Move preconf deletion, so rpmdb open fails still have it.
    Add "Error:" to rpmdb open failure message.

diff --git a/yum/__init__.py b/yum/__init__.py
index ae70354..0f9111e 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -212,10 +212,6 @@ class YumBase(depsolve.Depsolve):
         else:
             arch = self.arch.canonarch
 
-        #  We don't want people accessing/altering preconf after it becomes
-        # worthless. So we delete it, and thus. it'll raise AttributeError
-        del self.preconf
-
         # TODO: Remove this block when we no longer support configs outside
         # of /etc/yum/
         if fn == '/etc/yum/yum.conf' and not os.path.exists(fn):
@@ -251,6 +247,10 @@ class YumBase(depsolve.Depsolve):
 
         self._conf = config.readMainConfig(startupconf)
 
+        #  We don't want people accessing/altering preconf after it becomes
+        # worthless. So we delete it, and thus. it'll raise AttributeError
+        del self.preconf
+
         # run the postconfig plugin hook
         self.plugins.run('postconfig')
         self.yumvar = self.conf.yumvar
diff --git a/yum/config.py b/yum/config.py
index 06a7ece..6162b68 100644
--- a/yum/config.py
+++ b/yum/config.py
@@ -869,7 +869,7 @@ def _getsysver(installroot, distroverpkg):
         idx = ts.dbMatch('provides', distroverpkg)
     except TypeError, e:
         # This is code for "cannot open rpmdb"
-        raise Errors.YumBaseError(e.message)
+        raise Errors.YumBaseError("Error: " + e.message)
     # we're going to take the first one - if there is more than one of these
     # then the user needs a beating
     if idx.count() == 0:
commit e78ee995e87a8c17732f5791eaac051a07cc2fe0
Merge: 201776c... abbb82c...
Author: James Antill <james at and.org>
Date:   Tue Jun 23 14:13:33 2009 -0400

    Merge branch 'rpmdb-lock-error' into yum-3_2_X
    
    * rpmdb-lock-error:
      Work around rpmdb locks issue

commit 201776c3a518ecfc3399887e63326ad81448e05d
Author: Ville Skyttä <ville.skytta at iki.fi>
Date:   Sun Jun 21 23:11:01 2009 +0300

    Do not format flags if no version is passed to formatRequire.

diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py
index 0e04194..9f32e54 100644
--- a/rpmUtils/miscutils.py
+++ b/rpmUtils/miscutils.py
@@ -340,7 +340,7 @@ def rpm2cpio(fdno, out=sys.stdout, bufsize=2048):
 def formatRequire (name, version, flags):
     s = name
     
-    if flags:
+    if flags and version:
         if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER |
                     rpm.RPMSENSE_EQUAL):
             s = s + " "
@@ -350,8 +350,7 @@ def formatRequire (name, version, flags):
                 s = s + ">"
             if flags & rpm.RPMSENSE_EQUAL:
                 s = s + "="
-            if version:
-                s = "%s %s" %(s, version)
+            s = "%s %s" % (s, version)
     return s
     
 def flagToString(flags):
commit b485ebde8365fc0ce35375878cd3c41016ebf846
Author: James Antill <james at and.org>
Date:   Mon Jun 22 10:40:51 2009 -0400

    Use LC_MESSAGES instead of LC_CTYPE category in get_my_lang_code

diff --git a/yum/misc.py b/yum/misc.py
index 2135634..ab92b78 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -815,7 +815,7 @@ def setup_locale(override_codecs=True, override_time=False):
 
 
 def get_my_lang_code():
-    mylang = locale.getlocale()
+    mylang = locale.getlocale(locale.LC_MESSAGES)
     if mylang == (None, None): # odd :)
         mylang = 'C'
     else:
commit abbb82caec8464669b3ebadb8c26f62419638029
Author: James Antill <james at and.org>
Date:   Thu Mar 19 12:06:51 2009 -0400

    Work around rpmdb locks issue

diff --git a/yum/config.py b/yum/config.py
index d3ace8f..04385dd 100644
--- a/yum/config.py
+++ b/yum/config.py
@@ -861,7 +861,11 @@ def _getsysver(installroot, distroverpkg):
     '''
     ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot)
     ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS))
-    idx = ts.dbMatch('provides', distroverpkg)
+    try:
+        idx = ts.dbMatch('provides', distroverpkg)
+    except TypeError, e:
+        # This is code for "cannot open rpmdb"
+        raise Errors.YumBaseError(e.message)
     # we're going to take the first one - if there is more than one of these
     # then the user needs a beating
     if idx.count() == 0:


More information about the Yum-commits mailing list