lsb 3.1-21 Debian release.
authorChris Lawrence <lawrencc@debian.org>
Sun, 19 Nov 2006 08:12:34 +0000 (02:12 -0600)
committerDidier Raboud <odyx@debian.org>
Sun, 19 Nov 2006 08:12:34 +0000 (02:12 -0600)
debian/changelog
lsb_release

index 6ee659d6100d02c8790d83d57569ecc605817701..2c966a51ba75e504e279b41a7d0d29ff104d820f 100644 (file)
@@ -1,3 +1,10 @@
+lsb (3.1-21) unstable; urgency=low
+
+  * lsb_release changes: Improve parsing of apt-cache policy output to be
+    more flexible; deal with stable revisions in the codename lookup.
+
+ -- Chris Lawrence <lawrencc@debian.org>  Sun, 19 Nov 2006 02:12:34 -0600
+
 lsb (3.1-20) unstable; urgency=low
 
   * The "hopefully we can push this into testing now that the bugs are all
index ff75a6aa8a6888148fb6100a8892996f72239d85..45d0de4b7793cbfe68a21f377fff92fc3eaef6bd 100755 (executable)
@@ -24,6 +24,8 @@ import os
 import re
 
 # 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',
@@ -38,6 +40,14 @@ RELEASE_CODENAME_LOOKUP = {
 
 TESTING_CODENAME = 'etch'
 
+def lookup_codename(release):
+    m = re.match(r'(\d+)\.(\d+)(r(\d+))?', release)
+    if not m:
+        return None
+
+    shortrelease = '%s.%s' % m.group(1,2)
+    return RELEASE_CODENAME_LOOKUP.get(shortrelease, None)
+
 # LSB compliance packages... may grow eventually
 PACKAGES = 'lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-qt4'
 
@@ -90,32 +100,54 @@ priorityre = re.compile(r'\s+(\d+)\s+')
 versionre = re.compile(r'release v=([\d.+]+),o=Debian,a=([^,]+).*c=main')
 releasere = re.compile(r'release o=Debian,a=([^,]+).*c=main')
 
-def guess_release_from_apt():
-    releases = []
-
-    priority = None
+longnames = {'v' : 'version', 'o': 'origin', 'a': 'suite',
+             'c' : 'component', 'l': 'label'}
+
+def parse_policy_line(data):
+    retval = {}
+    bits = data.split(',')
+    for bit in bits:
+        kv = bit.split('=', 1)
+        if len(kv) > 1:
+            k, v = kv[:2]
+            if k in longnames:
+                retval[longnames[k]] = v
+    return retval
+
+def parse_apt_policy():
+    data = []
+    
     policy = commands.getoutput('apt-cache policy 2>/dev/null')
     for line in policy.split('\n'):
-        m = priorityre.match(line)
+        line = line.strip()
+        m = re.match(r'(\d+)', line)
         if m:
             priority = int(m.group(1))
-        
-        m = versionre.search(line)
-        if m and priority is not None:
-            releases.append((priority, m.group(1)))
+        if line.startswith('release'):
+            bits = line.split(' ', 1)
+            if len(bits) > 1:
+                data.append( (priority, parse_policy_line(bits[1])) )
 
-        m = releasere.search(line)
-        if m and priority is not None:
-            releases.append((priority, m.group(1)))
+    return data
+
+def guess_release_from_apt(origin='Debian', component='main',
+                           ignoresuites=('experimental')):
+    releases = parse_apt_policy()
 
     if not releases:
         return None
 
+    # We only care about the specified origin and component
+    releases = [x for x in releases if (
+        x[1].get('origin', '') == origin and
+        x[1].get('component', '') == component)]
+    
     releases.sort()
     releases.reverse()
-    for (pri, release) in releases:
-        if release != 'experimental':
-            return release
+
+    for (pri, rinfo) in releases:
+        if rinfo.get('suite', '') not in ignoresuites:
+            return rinfo
 
     return None
 
@@ -132,10 +164,13 @@ def guess_debian_release():
 
     distinfo['DESCRIPTION'] = '%(ID)s %(OS)s' % distinfo
 
-    release = guess_release_from_apt()
-    if release:
-        codename = RELEASE_CODENAME_LOOKUP.get(release)
-        if not codename:
+    rinfo = guess_release_from_apt()
+    if rinfo:
+        release = rinfo.get('version')
+        if release:
+            codename = lookup_codename(release) or 'unknown'
+        else:
+            release = rinfo.get('suite', 'unstable')
             if release == 'testing':
                 codename = TESTING_CODENAME
             else: