chiark / gitweb /
f1e75a88fa14320ae047fbba03f8e83f8fa78769
[dgit.git] / dpkg-parsechangelog
1 #!/usr/bin/perl -w
2 #
3 # In an example:
4 #
5 # $ time dpkg-parsechangelog >/dev/null
6 #
7 # real    0m0.712s
8 # user    0m0.656s
9 # sys     0m0.048s
10 # $ time ~/things/Dgit/dgit/tests/tstunt/dpkg-parsechangelog >/dev/null
11 #
12 # real    0m0.016s
13 # user    0m0.000s
14 # sys     0m0.012s
15 # $
16
17 $SIG{__WARN__} = sub { die $_[0]; }; # no use of system, so we avoid #793471
18
19 my $infile = "debian/changelog";
20
21 if (@ARGV && $ARGV[0] =~ s/^-l//) {
22     $infile = shift @ARGV;
23 }
24
25 die if @ARGV;
26
27 use strict;
28 open C, $infile or die $!;
29
30 $!=0; $_ = <C>;
31 m/^(\S+) \(([^()]+)\) (\S+)\; urgency=(\S+)$/ or die "$!, $_ ?";
32 print <<END or die $!;
33 Source: $1
34 Version: $2
35 Distribution: $3
36 Urgency: $4
37 Changes: 
38  $&
39 END
40
41 my $blanks = 0;
42 for (;;) {
43     $!=0; $_ = <C>;
44     if (m/^ -- ([^<>]+\<\S+\>)  (\w[^<>]+\w)$/) {
45         print <<END or die $!;
46 Maintainer: $1
47 Date: $2
48 END
49         last;
50     } elsif (m/^ --\s*$/) {
51         last;
52     } elsif (!m/\S/) {
53         $blanks++;
54     } elsif (m/^  .*\n/) {
55         print " .\n" x $blanks or die $!;
56         $blanks=0;
57         print " $_" or die $!;
58     } else {
59         die "$!, $_ ?";
60     }
61 }