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)
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):
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
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)
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