Rework the releases codename handling:
authorDidier Raboud <odyx@debian.org>
Wed, 12 Aug 2015 10:51:09 +0000 (12:51 +0200)
committerDidier Raboud <odyx@debian.org>
Wed, 12 Aug 2015 12:18:16 +0000 (14:18 +0200)
- Depend and Build-Depend on distro-info-data, and populate the RELEASES_CODENAME_LOOKUP from that reference
- Drop meaningless tests trying to compare random release names

Gbp-Dch: Full

debian/control
lsb_release.py
test/test_lsb_release.py

index 95e76b89f31ba1066da6433027300bedb2ec27b2..92436a7df69def7eeba0748a89dd4cf224e4eec4 100644 (file)
@@ -8,6 +8,7 @@ Build-Depends: debhelper (>> 9.0),
  dpkg-dev (>= 1.10),
  python3-all-dev,
  dh-python,
+ distro-info-data,
 X-Python3-Version: >= 3.4
 Standards-Version: 3.9.4
 Homepage: http://www.linuxfoundation.org/collaborate/workgroups/lsb
@@ -319,7 +320,8 @@ Architecture: all
 Priority: optional
 Multi-Arch: foreign
 Depends: ${python3:Depends},
- ${misc:Depends}
+ ${misc:Depends},
+ distro-info-data,
 Recommends: apt
 Suggests: lsb
 Description: Linux Standard Base version reporting utility
index 94dad4e4dc57ec2e165dc549f52a69484bfa2eb3..9bdd3660e6af7a95e2c9e99c03b0fff97600fa85 100644 (file)
@@ -25,32 +25,30 @@ import subprocess
 import os
 import re
 import warnings
+import csv
 
-# XXX: Update as needed
-# This should really be included in apt-cache policy output... it is already
-# in the Release file...
-RELEASE_CODENAME_LOOKUP = {
-    '1.1' : 'buzz',
-    '1.2' : 'rex',
-    '1.3' : 'bo',
-    '2.0' : 'hamm',
-    '2.1' : 'slink',
-    '2.2' : 'potato',
-    '3.0' : 'woody',
-    '3.1' : 'sarge',
-    '4.0' : 'etch',
-    '5.0' : 'lenny',
-    '6.0' : 'squeeze',
-    '7'   : 'wheezy',
-    '8'   : 'jessie',
-    }
-
-TESTING_CODENAME = 'unknown.new.testing'
-
-RELEASES_ORDER = list(RELEASE_CODENAME_LOOKUP.items())
-RELEASES_ORDER.sort()
-RELEASES_ORDER = list(list(zip(*RELEASES_ORDER))[1])
-RELEASES_ORDER.extend(['stable', 'testing', 'unstable', 'sid'])
+def get_distro_info(origin='Debian'):
+    try:
+        csvfile = open('/usr/share/distro-info/%s.csv' % origin.lower())
+    except FileNotFoundError:
+        # Unknown distro, fallback to Debian
+        csvfile = open('/usr/share/distro-info/debian.csv')
+
+    reader = csv.DictReader(csvfile)
+    global RELEASE_CODENAME_LOOKUP, RELEASES_ORDER, TESTING_CODENAME
+    RELEASE_CODENAME_LOOKUP = { r['version']: r['series'] for r in reader if r['version']}
+    RELEASES_ORDER = list(RELEASE_CODENAME_LOOKUP.items())
+    RELEASES_ORDER.sort(key=lambda n: float(n[0]))
+    RELEASES_ORDER = list(list(zip(*RELEASES_ORDER))[1])
+
+    if origin.lower() == 'debian':
+        TESTING_CODENAME = 'unknown.new.testing'
+        RELEASES_ORDER.extend(['stable', 'testing', 'unstable', 'sid'])
+
+    csvfile.close()
+
+# Populate default distro info
+get_distro_info()
 
 def lookup_codename(release, unknown=None):
     m = re.match(r'(\d+)\.(\d+)(r(\d+))?', release)
@@ -188,7 +186,10 @@ def release_index(x):
         if suite in RELEASES_ORDER:
             return int(len(RELEASES_ORDER) - RELEASES_ORDER.index(suite))
         else:
-            return suite
+            try:
+                return float(suite)
+            except ValueError:
+                return 0
     return 0
 
 def compare_release(x, y):
@@ -275,6 +276,10 @@ def guess_debian_release():
         except IOError as msg:
             print('Unable to open ' + etc_dpkg_origins_default + ':', str(msg), file=sys.stderr)
 
+    # Populate RELEASES_ORDER for the correct distro
+    if distinfo['ID'].lower() != 'Debian':
+        get_distro_info(distinfo['ID'])
+
     kern = os.uname()[0]
     if kern in ('Linux', 'Hurd', 'NetBSD'):
         distinfo['OS'] = 'GNU/'+kern
index 8681bec73f68095cf981d28da0898649d8c92b5c..94c8dbbbfd0e545b89e8d44a975d514d874e61e1 100644 (file)
@@ -109,38 +109,6 @@ class TestLSBRelease(unittest.TestCase):
                release_line = release_line[:-1]
                self.assertEqual(sorted(lr.parse_policy_line(release_line)),sorted(longnames),'parse_policy_line(' + release_line + ')')
 
-       def test_sort_releases(self):
-               # Compare suites with random suite names
-               releases = []
-               suites = []
-               for i in range(random.randint(5,40)):
-                       suite_name = rnd_string(8,25)
-                       suites.append(suite_name)
-                       releases.append([rnd_string(1,12), {'suite': suite_name}])
-               suites.sort()
-               if sys.version_info[0] == '2':
-                       suites_from_releases     = [x[1]['suite'] for x in sorted(releases,lr.compare_release)]
-                       self.assertEqual(suites,suites_from_releases)
-               suites_from_releases_new = [x[1]['suite'] for x in sorted(releases,key=lr.release_index)]
-               self.assertEqual(suites,suites_from_releases_new)
-
-               # Compare suites with known suite names
-               releases = []
-               suites = []
-               RO_min = 0
-               RO_max = len(lr.RELEASES_ORDER) - 1
-               for i in range(random.randint(5,7)):
-                       suite_i = random.randint(RO_min,RO_max)
-                       suite_name = lr.RELEASES_ORDER[suite_i]
-                       suites.append(suite_name)
-                       releases.append([rnd_string(1,12), {'suite': suite_name}])
-               suites.sort(key=lambda suite: int(lr.RELEASES_ORDER.index(suite)),reverse=True)
-               if sys.version_info[0] == '2':
-                       suites_from_releases     = [x[1]['suite'] for x in sorted(releases,lr.compare_release)]
-                       self.assertEqual(suites,suites_from_releases)
-               suites_from_releases_new = [x[1]['suite'] for x in sorted(releases,key=lr.release_index)]
-               self.assertEqual(suites,suites_from_releases_new)
-
        def test_compare_release(self):
                # Test that equal suite strings lead to 0
                fake_release_equal = rnd_string(1,25)
@@ -159,14 +127,6 @@ class TestLSBRelease(unittest.TestCase):
                self.assertEqual(lr.compare_release(x,y),
                                 supposed_output,
                                 'compare_release(' + x[1]['suite'] + ',' + y[1]['suite'] + ') =? ' + str(supposed_output))
-               
-               # Test that sequences not in RELEASES_ORDER lead to reliable output
-               x[1]['suite'] = rnd_string(1,12)
-               y[1]['suite'] = rnd_string(1,12)
-               supposed_output = (x[1]['suite'] > y[1]['suite']) - (x[1]['suite'] < y[1]['suite'])
-               self.assertEqual(lr.compare_release(x,y),
-                                supposed_output,
-                                'compare_release(' + x[1]['suite'] + ',' + y[1]['suite'] + ') =? ' + str(supposed_output))
 
        def test_parse_apt_policy(self):
                # Test almost-empty apt-cache policy