1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#!/usr/bin/perl
#
# Options:
# -v<version>
# changes since <version>
$dpkglibdir= ".";
$version= '1.3.0'; # This line modified by Makefile
$controlfile= 'debian/control';
$changelogfile= 'debian/changelog';
$fileslistfile= 'debian/files';
$varlistfile= 'debian/substvars';
push(@INC,$dpkglibdir);
require 'controllib.pl';
$progname= "parsechangelog/$progname";
$since='';
sub usageversion {
print STDERR
"Debian $progname $version. Copyright (C) 1996
Ian Jackson. This is free software; see the GNU General Public Licence
version 2 or later for copying conditions. There is NO warranty.
Usage: $progname [-v<versionsince>] | -h
";
}
while (@ARGV) {
$_=shift(@ARGV);
if (m/^-v(.+)$/) {
$since= $1;
} elsif (m/^-h$/) {
&usageversion; exit(0);
} else {
&usageerr("unknown option or argument \`$_'");
}
}
%mapkv=(); # for future use
$i=100;grep($fieldimps{$_}=$i--,
qw(Source Version Distribution Urgency Maintainer Date Closes
Changes));
$i=1;grep($urgencies{$_}=$i++,
qw(low medium high critical emergency));
$expect='first heading';
while (<STDIN>) {
s/\s*\n$//;
# printf(STDERR "%-39.39s %-39.39s\n",$expect,$_);
if (m/^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)((\s+[-0-9a-z]+)+)\;/i) {
if ($expect eq 'first heading') {
$f{'Source'}= $1;
$f{'Version'}= $2;
$f{'Distribution'}= $3;
&error("-v<since> option specifies most recent version") if
$2 eq $since;
$f{'Distribution'} =~ s/^\s+//;
} elsif ($expect eq 'next heading or eof') {
last if $2 eq $since;
$f{'Changes'}.= " .\n";
} else {
&clerror("found start of entry where expected $expect");
}
$rhs= $'; $rhs =~ s/^\s+//;
undef %kvdone;
for $kv (split(/\s*,\s*/,$rhs)) {
$kv =~ m/^([-0-9a-z]+)\=\s*(.*\S)$/i ||
&clerror("bad key-value after \`;': \`$kv'");
$k=(uc substr($1,0,1)).(lc substr($1,1)); $v=$2;
$kvdone{$k}++ && &clwarn("repeated key-value $k");
if ($k eq 'Urgency') {
$v =~ m/^([-0-9a-z]+)((\s+.*)?)$/i ||
&clerror("badly formatted urgency value, at changelog ");
$newurg= lc $1;
$newurgn= $urgencies{lc $1}; $newcomment= $2;
$newurgn ||
&clwarn("unknown urgency value $newurg - comparing very low");
if (defined($f{'Urgency'})) {
$f{'Urgency'} =~ m/^([-0-9a-z]+)((\s+.*)?)$/i ||
&internerr("urgency >$f{'Urgency'}<");
$oldurg= lc $1;
$oldurgn= $urgencies{lc $1}; $oldcomment= $2;
} else {
$oldurgn= -1;
$oldcomment= '';
}
$f{'Urgency'}=
(($newurgn > $oldurgn ? $newurg : $oldurg).
$oldcomment.
$newcomment);
} elsif (defined($mapkv{$k})) {
$f{$mapkv{$k}}= $v;
} elsif ($k =~ m/^X[BCS]+-/i) {
# Extensions - XB for putting in Binary,
# XC for putting in Control, XS for putting in Source
$f{$k}= $v;
} else {
&clwarn("unknown key-value key $k - copying to XS-$k");
$f{"XS-$k"}= $v;
}
}
$expect= 'start of change data'; $blanklines=0;
$f{'Changes'}.= " $_\n .\n";
} elsif (m/^\S/) {
&clerror("badly formatted heading line");
} elsif (m/^ \-\- (.*) <(.*)> ((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}(\s+\([^\\\(\)]\))?)$/) {
$expect eq 'more change data or trailer' ||
&clerror("found trailer where expected $expect");
$f{'Maintainer'}= "$1 <$2>" unless defined($f{'Maintainer'});
$f{'Date'}= $3 unless defined($f{'Date'});
# $f{'Changes'}.= " .\n $_\n";
$expect= 'next heading or eof';
last if $since eq '';
} elsif (m/^ \-\-/) {
&clerror("badly formatted trailer line");
} elsif (m/^\s{2,}\S/) {
$expect eq 'start of change data' || $expect eq 'more change data or trailer' ||
&clerror("found change data where expected $expect");
$f{'Changes'}.= (" .\n"x$blanklines)." $_\n"; $blanklines=0;
$expect= 'more change data or trailer';
} elsif (!m/\S/) {
next if $expect eq 'start of change data' || $expect eq 'next heading or eof';
$expect eq 'more change data or trailer' ||
&clerror("found blank line where expected $expect");
$blanklines++;
} else {
&clerror("unrecognised line");
}
}
$expect eq 'next heading or eof' || die "found eof where expected $expect";
$f{'Changes'} =~ s/\n$//;
$f{'Changes'} =~ s/^/\n/;
while ($f{'Changes'} =~ /closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*/ig) {
push(@closes, $& =~ /\#?\s?(\d+)/g);
}
$f{'Closes'} = join(' ',sort { $a <=> $b} @closes);
&outputclose(0);
sub clerror { &error("$_[0], at changelog line $."); }
sub clwarn { &warn("$_[0], at changelog line $."); }
|