From a13cd11eb235c4ff56a93fdd740cc1d516555ea0 Mon Sep 17 00:00:00 2001 From: Didier Raboud Date: Wed, 12 Aug 2015 12:51:09 +0200 Subject: [PATCH] Rework the releases codename handling: - 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 | 4 ++- lsb_release.py | 57 ++++++++++++++++++++++------------------ test/test_lsb_release.py | 40 ---------------------------- 3 files changed, 34 insertions(+), 67 deletions(-) diff --git a/debian/control b/debian/control index 95e76b8..92436a7 100644 --- a/debian/control +++ b/debian/control @@ -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 diff --git a/lsb_release.py b/lsb_release.py index 94dad4e..9bdd366 100644 --- a/lsb_release.py +++ b/lsb_release.py @@ -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 diff --git a/test/test_lsb_release.py b/test/test_lsb_release.py index 8681bec..94c8dbb 100644 --- a/test/test_lsb_release.py +++ b/test/test_lsb_release.py @@ -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 -- 2.30.2