Package: reportbug
Version: 3.20
Severity: wishlist
Tags: patch

Hi,

I'd like the check_available function also look at the NEW queue for new
package versions. The attached patch works for me with the 'tellico'
package which has a new 1.1.6 version in the queue.
I had to add a new function get_source_name, since the NEW queue only
lists source packages, not binary packages.


Regards,
  Bastian

-- Package-specific info:
** Environment settings:
EDITOR="fte"
DEBEMAIL="[EMAIL PROTECTED]"

** /home/calvin/.reportbugrc:
reportbug_version "3.11"
mode advanced
ui text
realname "Bastian Kleineidam"
email "[EMAIL PROTECTED]"

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.16-treasure17
Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (charmap=ISO-8859-15)

Versions of packages reportbug depends on:
ii  python2.3                     2.3.5-9.1  An interactive high-level object-o

Versions of packages reportbug recommends:
ii  python2.3-iconvcodec          1.1.2-2.2  Python universal Unicode codec, us

-- no debconf information
--- checkversions.py_   2006-06-05 10:51:03.234708065 +0200
+++ checkversions.py    2006-06-05 11:48:22.125105750 +0200
@@ -30,18 +30,14 @@
 
 PACKAGES_URL = 'http://packages.debian.org/%s'
 INCOMING_URL = 'http://incoming.debian.org/'
+NEWQUEUE_URL = 'http://ftp-master.debian.org/new.html'
 
 # The format is an unordered list
 
-class PackagesParser(sgmllib.SGMLParser):
-    def __init__(self, arch='i386'):
+class BaseParser(sgmllib.SGMLParser):
+    def __init__(self,):
         sgmllib.SGMLParser.__init__(self)
-        self.versions = {}
         self.savedata = None
-        self.row = None
-        arch = r'\s(all|'+re.escape(arch)+r')\b'
-        self.arch = re.compile(arch)
-        self.dist = None
 
     # --- Formatter interface, taking care of 'savedata' mode;
     # shouldn't need to be overridden
@@ -60,6 +56,15 @@
         if not mode and data is not None: data = ' '.join(data.split())
         return data
 
+class PackagesParser(BaseParser):
+    def __init__(self, arch='i386'):
+        BaseParser.__init__(self)
+        self.versions = {}
+        self.row = None
+        arch = r'\s(all|'+re.escape(arch)+r')\b'
+        self.arch = re.compile(arch)
+        self.dist = None
+
     def start_li(self, attrs):
         if self.row is not None:
             self.end_li()
@@ -106,6 +111,54 @@
             if mob:
                 self.found.append(mob.group(1))
 
+class NewQueueParser(BaseParser):
+    def __init__(self, package, arch='i386'):
+        BaseParser.__init__(self)
+        self.package = package
+        self.row = None
+        arch = r'\s(all|'+re.escape(arch)+r')\b'
+        self.arch = re.compile(arch)
+        self.versions = {}
+
+    def start_tr (self, attrs):
+        for name, value in attrs:
+            if name == 'class' and value in ("odd", "even"):
+                self.row = []
+
+    def end_tr (self):
+        if self.row is not None:
+            # row (name, versions, architectures, distribution)
+            dist = "%s (new queue)" % self.row[3]
+            for version in self.row[1].split():
+                self.versions[dist] = version
+            self.row = None
+
+    def start_td (self, attrs):
+        if self.row is None:
+            return
+        self.save_bgn()
+
+    def end_td (self):
+        if self.row is None:
+            return
+        data = self.save_end()
+        l = len(self.row)
+        if l == 0:
+            # package name
+            if self.package == data:
+                # found package name
+                self.row.append(data)
+            else:
+                self.row = None
+        elif l == 2:
+            # architecture
+            if self.arch.search(data):
+                self.row.append(data)
+            else:
+                self.row = None
+        else:
+            self.row.append(data)
+
 def compare_versions(current, upstream):
     """Return 1 if upstream is newer than current, -1 if current is
     newer than upstream, and 0 if the same."""
@@ -150,6 +203,30 @@
 
     return versions
 
+def get_newqueue_available(package, dists=None, http_proxy=None, arch='i386'):
+    if dists is None:
+        dists = ('unstable (new queue)', )
+    try:
+        page = open_url(NEWQUEUE_URL, http_proxy)
+    except NoNetwork:
+        return {}
+    except urllib2.HTTPError, x:
+        print >> sys.stderr, "Warning:", x
+        return {}
+    if not page:
+        return {}
+    parser = NewQueueParser(package, arch)
+    parser.feed(page.read())
+    parser.close()
+    page.close()
+
+    versions = {}
+    for dist in dists:
+        if dist in parser.versions:
+            versions[dist] = parser.versions[dist]
+
+    return versions
+
 def get_incoming_version(package, http_proxy=None, arch='i386'):
     try:
         page = open_url(INCOMING_URL, http_proxy)
@@ -172,6 +249,7 @@
     return None
 
 def check_available(package, version, dists=None, check_incoming=True,
+                    check_newqueue=True,
                     http_proxy=None, arch='i386'):
     avail = {}
 
@@ -179,8 +257,13 @@
         iv = get_incoming_version(package, http_proxy, arch)
         if iv:
             avail['incoming'] = iv
-
     avail.update(get_versions_available(package, dists, http_proxy, arch))
+    if check_newqueue:
+        import reportbug
+        srcpackage = reportbug.get_source_name(package)
+       if srcpackage is None:
+           srcpackage = package
+        avail.update(get_newqueue_available(srcpackage, dists, http_proxy, 
arch))
 
     new = {}
     newer = 0
@@ -197,9 +280,8 @@
             new[dist] = avail[dist]
         elif comparison < 0:
             newer += 1
-    if newer and newer == len(avail):
-        return new, True
-    return new, False
+    too_new = (newer and newer == len(avail))
+    return new, too_new
 
 if __name__=='__main__':
     #print check_available('mozilla-browser', '2:1.5-3', arch='s390')
--- reportbug.py_       2006-06-05 11:17:09.411787940 +0200
+++ reportbug.py        2006-06-05 11:41:46.005533743 +0200
@@ -388,6 +388,22 @@
     packages.sort()
     return packages
 
+def get_source_name(package):
+    """Return source package name for given package or None."""
+    packinfo = get_avail_database()
+    has_source = re.compile(r'^Source: %s$' % re.escape(package), 
re.MULTILINE).search
+    get_source = re.compile(r'^Source: (?P<pkg>.*)$', re.MULTILINE).search
+    has_package = re.compile(r'^Package: %s$' % re.escape(package), 
re.MULTILINE).search
+    for p in packinfo:
+        match = has_source(p)
+        if match:
+            return package
+       if has_package(p):
+           match = get_source(p)
+           if match:
+               return match.group('pkg')
+    return None
+
 def get_package_info(packages):
     if not packages:
         return []
--- /usr/bin/reportbug_ 2006-06-05 11:23:01.737040765 +0200
+++ /usr/bin/reportbug  2006-06-05 11:51:33.486913529 +0200
@@ -1204,8 +1204,10 @@
           and bts=='debian'):
         ewrite('Checking for newer versions at packages.debian.org...\n')
         arch = reportbug.get_arch()
+        check_more = (mode > MODE_STANDARD)
         (avail, toonew) = checkversions.check_available(
-            package, pkgversion, check_incoming=(mode > MODE_STANDARD),
+            package, pkgversion, check_incoming=check_more,
+           check_newqueue=check_more,
             http_proxy=options.http_proxy, arch=arch)
         if toonew:
             if not ui.yes_no(

Reply via email to