[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