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(