[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug in auto-closing of bugs through changelog entries

Currently I have a script that works for me, it is attached.
It works on Debian-format changelogs, and .changes files.

Brief usage guide:
changelogcloses package_1.2-3_i386.changes
 will print a list of bugs closed in that changes file, what
 package each belongs to, and whether that package is one
 that is relevant to the changes file (i.e., if there is a
 Binary: or Source: package that matches the bug's package).

changelogcloses -h
 will print usage information.

I can't currently implement LDAP querying because I don't
have access to the server (Awaiting DAM Approval (tm)).
Using the -i /path/to/index.db option will greatly improve
the speed of access, by eliminating the BTS query.  On
master, use
-i /debian2/org/bugs.debian.org/debbugs/spool/index.db

Where should this check go?  In lintian?  In katie?  In
both?  Away?

If nobody comments on it, I'll package it separately, and
write a lintian check for it if I get time to figure out
the interface before Shaleh feature-freezes 1.20.

Thomas Smith <tgs@finbar.dyndns.org>
gpg key id 1024D/ACABA81E, fingerprint:
3A47 CFA5 0E5D CF4A 5B22  12D3 FF1B 84FE ACAB A81E

#!/usr/bin/perl -w
# This is free software.
# You may distribute it under the terms of the GNU
# Lesser GPL, any version.

# Copyright 2001 by Thomas Smith <chihuahua@tmbg.org>
my $version = '$Id: changelogcloses,v 1.2 2001/02/18 00:05:35 tgs Exp $';

use strict;
use Getopt::Std;
use LWP::Simple;
use URI;
my (%opt, %index);
getopts("i:hVp", \%opt);

if ($opt{'h'}) {
	print "Usage:\n",
	      " $0 [-i /path/to/index.db] [-hVp] <changes-file>\n",
	      " -i <file>\n",
	      "  Use <file> as an index, greatly reducing load on the BTS,\n",
	      "  and greatly increasing the speed of processing.\n",
	      " -h\n",
	      "  Print this usage message, then exit.\n",
	      " -V\n",
	      "  Print the CVS id (Version) and exit.\n",
	      " -p\n",
	      "  Before the list of bugs, print a space-separated list of\n",
	      "  binary and source packages that belong to the package\n",
	      "  that <changes-file> belongs to.\n",
	      " <changes-file>\n",
	      "  A .changes file, or a changelog in Debian format.  A\n",
	      "  .changes file works better for multi-binary packages.\n",
	      " Outputs lines of the following form:\n",
	      "<bug-number> <package> <bit>\n",
	      " where <bug-number> is a bug number, as used in the BTS,\n",
	      " <package> is the package to which the bug ``belongs'', or\n",
	      " `[unknown-package]' if the bug does not have a package.\n",
	      " <bit> is 1 if <package> is one of the packages to which\n",
	      " the changes file belongs, or 0 otherwise.\n";
	exit 0;

if ($opt{'V'}) {
	print $version, "\n";
	exit 0;

if ($opt{'i'}) {
	local *INDEXDB;
	open(INDEXDB, "<", $opt{'i'}) or die "$! in index making";
	while (<INDEXDB>) {
		m/^(\S+) (\d+)/;
		$index{$2} = $1;
	close(INDEXDB) or warn "$! in index making";

sub findpkg {
	my $bugid = shift;
	$bugid =~ s/\D//g;
	if (defined($index{$bugid})) {
		return $index{$bugid};
	} else {
		my $buguri =
		my $bughtml = get($buguri);
		if (!defined($bughtml)) { # error in fetching, or server error
			return undef;
		} elsif ($bughtml =~ m/^<HTML><HEAD><TITLE>Error/) { # error in bts
			return undef;
		} else {
			$bughtml =~ m/^.*?Package: <A.*?>(.*?)<\/A>/s;
			return $1;

my (%pkg, $changes);
while (<>) {
	$changes .= $_;

while ($changes =~ m/^(?:Source|Binary)\s*:\s*(.*)/mg) {
	foreach (split(/\s+/, $1)) {
		$pkg{$_} = 1;

while ($changes =~ m/^([a-zA-Z0-9\-]+)\s+\(/mg) {
	foreach (split(/\s+/, $1)) {
		$pkg{$_} = 1;

(print join(" ", keys %pkg), "\n") if ($opt{'p'});
my (@bugid);
while ($changes =~ m/closes:\s*(?:bug)?\#\s*(\d+(?:,\s*(?:bug)?\#\s*\d+)*)/ig) {
		# regex is stolen from Developer's Reference, sec. 10.4,
		# current as of 14 Feb 2001.  slightly modified.
	my $buglist = $1;
	push(@bugid, split(/\D+/, $buglist));

if ($opt{'t'}) {
	#t is for test
	print join(" ", @bugid), "\n";
	exit 0;
} else {
	foreach (@bugid) {
		my $bugpkg = findpkg($_);
		if (defined($bugpkg)) {
			print join(" ", $_, $bugpkg,
				(exists($pkg{$bugpkg})) || "0"), "\n";
		} else {
			print "$_ [unknown-package] 0\n";

Attachment: pgpS20KFamwNs.pgp
Description: PGP signature

Reply to: