[Secure-testing-commits] r4236 - lib/python

Florian Weimer fw at costa.debian.org
Thu Jun 15 18:17:19 UTC 2006


Author: fw
Date: 2006-06-15 18:17:18 +0000 (Thu, 15 Jun 2006)
New Revision: 4236

Modified:
   lib/python/debian_support.py
   lib/python/security_db.py
Log:
* lib/python/debian_support.py
(Version): Implement using apt_pkg if APT is available.
(version_compare): Add.

* lib/python/security_db.py
(DB._initFunctions): Directly invoke debian_support.version_compare.


Modified: lib/python/debian_support.py
===================================================================
--- lib/python/debian_support.py	2006-06-15 14:21:06 UTC (rev 4235)
+++ lib/python/debian_support.py	2006-06-15 18:17:18 UTC (rev 4236)
@@ -22,6 +22,12 @@
 import sha
 import types
 
+try:
+    import apt_pkg
+    __have_apt_pkg = True
+except ImportError:
+    __have_apt_pkg = False
+
 class ParseError(Exception):
     """An exception which is used to signal a parse failure.
 
@@ -52,74 +58,101 @@
         file.write("%s:%d: %s\n" % (self.filename, self.lineno, self.msg))
         file.flush()
 
-letterValue = [None] * 256
-def initLetterValue():
-    c = 0
-    for x in range(ord('A'), ord('Z') + 1):
-        letterValue[x] = chr(c)
-        c += 1
-    for x in range(ord('a'), ord('z') + 1):
-        letterValue[x] = chr(c)
-        c += 1
-    for x in "+-.:":
-        letterValue[ord(x)] = chr(c)
-        c += 1
-initLetterValue()
-del initLetterValue
+if __have_apt_pkg:
+    class Version:
+        """Version class which uses the original APT comparison algorithm."""
 
-class Version:
-    """This class implements Debian version numbers."""
+        def __init__(self, version):
+            """Creates a new Version object."""
+            assert type(version) == types.StringType, `version`
+            assert version <> ""
+            self.__asString = version
 
-    def __init__(self, version):
-        """Creates a new Version object."""
-        assert type(version) == types.StringType, `version`
-        assert version <> ""
-        self.__asString = version
-        self.__parsed = self.__parse(version)
+        def __str__(self):
+            return self.__asString
 
-    def __str__(self):
-        return self.__asString
+        def __repr__(self):
+            return 'Version(%s)' % `self.__asString`
 
-    def __repr__(self):
-        return 'Version(%s)' % `self.__asString`
+        def __cmp__(self, other):
+            return apt_pkg.VersionCompare(self.__asString, other.__asString)
 
-    def __cmp__(self, other):
-        """Compares two versions.
 
-        This method implements the algorithm in the Debian Policy."""
-        return cmp(self.__parsed, other.__parsed)
+    version_compare = apt_pkg.VersionCompare
+    apt_pkg.init()
 
-    def __parse(self, v, regexp=\
-                re.compile(r'^(?:(\d+):)?([A-Za-z0-9.+:-]+?)'
-                           + r'(?:-([A-Za-z0-9.+]+))?$')):
-        match = regexp.match(v)
-        if match is None:
-            raise ValueError, "invalid Debian version string"
-        (epoch, upstream, debian) = match.groups()
-        if epoch is None:
-            epoch = 0
-        else:
-            epoch = int(epoch)
-        return (epoch, self.__parse_1(upstream), self.__parse_1(debian))
+else:
+    letterValue = [None] * 256
+    def initLetterValue():
+        c = 0
+        for x in range(ord('A'), ord('Z') + 1):
+            letterValue[x] = chr(c)
+            c += 1
+        for x in range(ord('a'), ord('z') + 1):
+            letterValue[x] = chr(c)
+            c += 1
+        for x in "+-.:":
+            letterValue[ord(x)] = chr(c)
+            c += 1
+    initLetterValue()
+    del initLetterValue
 
-    def __parse_1(self, x, non_digits=re.compile(r'^([^0-9]*)(.*)$'),
-                  digits=re.compile(r'^([0-9]*)(.*)$')):
-        l = []
-        while x is not None and x <> '':
-            (nd, x) = non_digits.match(x).groups()
-            (d, x) = digits.match(x).groups()
-            nd_l = []
-            for ch in nd:
-                nd_l.append(letterValue[ord(ch)])
-            nd = ''.join(nd_l)
-            if d == '':
-                d = 0
+    class Version:
+        """This class implements Debian version numbers."""
+
+        def __init__(self, version):
+            """Creates a new Version object."""
+            assert type(version) == types.StringType, `version`
+            assert version <> ""
+            self.__asString = version
+            self.__parsed = self.__parse(version)
+
+        def __str__(self):
+            return self.__asString
+
+        def __repr__(self):
+            return 'Version(%s)' % `self.__asString`
+
+        def __cmp__(self, other):
+            """Compares two versions.
+
+            This method implements the algorithm in the Debian Policy."""
+            return cmp(self.__parsed, other.__parsed)
+
+        def __parse(self, v, regexp=\
+                    re.compile(r'^(?:(\d+):)?([A-Za-z0-9.+:-]+?)'
+                               + r'(?:-([A-Za-z0-9.+]+))?$')):
+            match = regexp.match(v)
+            if match is None:
+                raise ValueError, "invalid Debian version string"
+            (epoch, upstream, debian) = match.groups()
+            if epoch is None:
+                epoch = 0
             else:
-                d = int(d)
-            l.append(nd)
-            l.append(d)
-        return l
+                epoch = int(epoch)
+            return (epoch, self.__parse_1(upstream), self.__parse_1(debian))
 
+        def __parse_1(self, x, non_digits=re.compile(r'^([^0-9]*)(.*)$'),
+                      digits=re.compile(r'^([0-9]*)(.*)$')):
+            l = []
+            while x is not None and x <> '':
+                (nd, x) = non_digits.match(x).groups()
+                (d, x) = digits.match(x).groups()
+                nd_l = []
+                for ch in nd:
+                    nd_l.append(letterValue[ord(ch)])
+                nd = ''.join(nd_l)
+                if d == '':
+                    d = 0
+                else:
+                    d = int(d)
+                l.append(nd)
+                l.append(d)
+            return l
+
+    def version_compare(a,b):
+        return cmp(Version(a), Version(b))
+
 class PackageFile:
     """A Debian package file.
 

Modified: lib/python/security_db.py
===================================================================
--- lib/python/security_db.py	2006-06-15 14:21:06 UTC (rev 4235)
+++ lib/python/security_db.py	2006-06-15 18:17:18 UTC (rev 4236)
@@ -455,11 +455,7 @@
                 return release
         self.db.createscalarfunction("release_name", release_name, 3)
 
-        # This is slower than the version_linear_order table, but
-        # often more convenient to use in queries.
-        def collate_version(a, b):
-            return debian_support.Version(a).__cmp__(debian_support.Version(b))
-        self.db.createcollation("version", collate_version)
+        self.db.createcollation("version", debian_support.version_compare)
 
     def filePrint(self, filename):
         """Returns a fingerprint string for filename."""




More information about the Secure-testing-commits mailing list