chiark / gitweb /
Test suite: unset empty redacted paths
[dgit.git] / tests / tstunt / 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 my @orgargv = @ARGV;
22
23 if (@ARGV && $ARGV[0] =~ s/^-l//) {
24     $infile = shift @ARGV;
25 }
26
27 if (@ARGV) {
28     my $strip = $0;
29     $strip =~ s#/[^/]+$## or die "$0 ?";
30     foreach my $k (qw(PATH PERLLIB)) {
31         my @opath = defined $ENV{$k} ? split /\:/, $ENV{$k} : ();
32         my @npath = grep { $_ ne $strip } @opath;
33         @npath != @opath  or die "$0 $k ".($ENV{$k}//"(undef)")." ?";
34         $ENV{$k} = join ':', @npath;
35         delete $ENV{$k} if !@npath;
36     }
37     die if $ENV{'DGIT_NO_TSTUNT_CLPARSE'}++;
38     exec 'dpkg-parsechangelog', @orgargv;
39 }
40
41 use strict;
42 open C, $infile or die $!;
43
44 $!=0; $_ = <C>;
45 m/^(\S+) \(([^()]+)\) (\S+)\; urgency=(\S+)$/ or die "$!, $_ ?";
46 print <<END or die $!;
47 Source: $1
48 Version: $2
49 Distribution: $3
50 Urgency: $4
51 Changes: 
52  $&
53 END
54
55 my $blanks = 0;
56 for (;;) {
57     $!=0; $_ = <C>;
58     if (m/^ -- ([^<>]+\<\S+\>)  (\w[^<>]+\w)$/) {
59         print <<END or die $!;
60 Maintainer: $1
61 Date: $2
62 END
63         last;
64     } elsif (m/^ --\s*$/) {
65         last;
66     } elsif (!m/\S/) {
67         $blanks++;
68     } elsif (m/^  .*\n/) {
69         print " .\n" x $blanks or die $!;
70         $blanks=0;
71         print " $_" or die $!;
72     } else {
73         die "$!, $_ ?";
74     }
75 }