diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Dpkg/Changelog.pm | 192 | ||||
-rw-r--r-- | scripts/Dpkg/Changelog/Parse.pm | 4 | ||||
-rwxr-xr-x | scripts/changelog/debian.pl | 9 | ||||
-rw-r--r-- | scripts/t/Dpkg_Changelog.t | 16 |
4 files changed, 143 insertions, 78 deletions
diff --git a/scripts/Dpkg/Changelog.pm b/scripts/Dpkg/Changelog.pm index e2eff1cfb..2065d429d 100644 --- a/scripts/Dpkg/Changelog.pm +++ b/scripts/Dpkg/Changelog.pm @@ -34,7 +34,9 @@ package Dpkg::Changelog; use strict; use warnings; -our $VERSION = '1.00'; +our $VERSION = '1.01'; + +use Carp; use Dpkg::Gettext; use Dpkg::ErrorHandling qw(:DEFAULT report REPORT_WARN); @@ -473,52 +475,6 @@ sub output { return $str; } -=item $control = $c->dpkg($range) - -Returns a Dpkg::Control::Changelog object representing the entries selected -by the optional range specifier (see L<"RANGE SELECTION"> for details). -Returns undef in no entries are matched. - -The following fields are contained in the object: - -=over 4 - -=item Source - -package name (in the first entry) - -=item Version - -packages' version (from first entry) - -=item Distribution - -target distribution (from first entry) - -=item Urgency - -urgency (highest of all printed entries) - -=item Maintainer - -person that created the (first) entry - -=item Date - -date of the (first) entry - -=item Closes - -bugs closed by the entry/entries, sorted by bug number - -=item Changes - -content of the the entry/entries - -=back - -=cut - our ( @URGENCIES, %URGENCIES ); BEGIN { @URGENCIES = qw(low medium high critical emergency); @@ -526,7 +482,7 @@ BEGIN { %URGENCIES = map { $_ => $i++ } @URGENCIES; } -sub dpkg { +sub _format_dpkg { my ($self, $range) = @_; my @data = $self->get_range($range) or return; @@ -580,21 +536,11 @@ sub dpkg { return $f; } -=item @controls = $c->rfc822($range) - -Returns a Dpkg::Index containing Dpkg::Control::Changelog objects where -each object represents one entry in the changelog that is part of the -range requested (see L<"RANGE SELECTION"> for details). For the format of -such an object see the description of the L<"dpkg"> method (while ignoring -the remarks about which values are taken from the first entry). - -=cut - -sub rfc822 { +sub _format_rfc822 { my ($self, $range) = @_; my @data = $self->get_range($range) or return; - my $index = Dpkg::Index->new(type => CTRL_CHANGELOG); + my @ctrl; foreach my $entry (@data) { my $f = Dpkg::Control::Changelog->new(); @@ -614,9 +560,125 @@ sub rfc822 { run_vendor_hook('post-process-changelog-entry', $f); - $index->add($f); + push @ctrl, $f; + } + + return @ctrl; +} + +=item $control = $c->format_range($format, $range) + +Formats the changelog into Dpkg::Control::Changelog objects representing the +entries selected by the optional range specifier (see L<"RANGE SELECTION"> +for details). In scalar context returns a Dpkg::Index object containing the +selected entries, in list context returns an array of Dpkg::Control::Changelog +objects. + +With format B<dpkg> the returned Dpkg::Control::Changelog object is coalesced +from the entries in the changelog that are part of the range requested, +with the fields described below, but considering that "selected entry" +means the first entry of the selected range. + +With format B<rfc822> each returned Dpkg::Control::Changelog objects +represents one entry in the changelog that is part of the range requested, +with the fields described below, but considering that "selected entry" +means for each entry. + +The different formats return undef if no entries are matched. The following +fields are contained in the object(s) returned: + +=over 4 + +=item Source + +package name (selected entry) + +=item Version + +packages' version (selected entry) + +=item Distribution + +target distribution (selected entry) + +=item Urgency + +urgency (highest of all entries in range) + +=item Maintainer + +person that created the (selected) entry + +=item Date + +date of the (selected) entry + +=item Closes + +bugs closed by the (selected) entry/entries, sorted by bug number + +=item Changes + +content of the the (selected) entry/entries + +=back + +=cut + +sub format_range { + my ($self, $format, $range) = @_; + + my @ctrl; + + if ($format eq 'dpkg') { + @ctrl = $self->_format_dpkg($range); + } elsif ($format eq 'rfc822') { + @ctrl = $self->_format_rfc822($range); + } else { + croak "unknown changelog output format $format"; + } + + if (wantarray) { + return @ctrl; + } else { + my $index = Dpkg::Index->new(type => CTRL_CHANGELOG); + + foreach my $f (@ctrl) { + $index->add($f); + } + + return $index; } - return $index; +} + +=item $control = $c->dpkg($range) + +This is a deprecated alias for $c->format_range('dpkg', $range). + +=cut + +sub dpkg { + my ($self, $range) = @_; + + warnings::warnif('deprecated', + 'deprecated method, please use format_range("dpkg", $range) instead'); + + return $self->format_range('dpkg', $range); +} + +=item @controls = $c->rfc822($range) + +This is a deprecated alias for C<scalar c->format_range('rfc822', $range)>. + +=cut + +sub rfc822 { + my ($self, $range) = @_; + + warnings::warnif('deprecated', + 'deprecated method, please use format_range("rfc822", $range) instead'); + + return scalar $self->format_range('rfc822', $range); } =back @@ -698,6 +760,12 @@ with only one of the options specified. =head1 CHANGES +=head2 Version 1.01 (dpkg 1.18.8) + +New method: $c->format_range(). + +Deprecated methods: $c->dpkg(), $c->rfc822(). + =head2 Version 1.00 (dpkg 1.15.6) Mark the module as public. diff --git a/scripts/Dpkg/Changelog/Parse.pm b/scripts/Dpkg/Changelog/Parse.pm index 51c20b302..9f3d36c81 100644 --- a/scripts/Dpkg/Changelog/Parse.pm +++ b/scripts/Dpkg/Changelog/Parse.pm @@ -95,9 +95,9 @@ sub changelog_parse_debian { # Get the output into several Dpkg::Control objects. my @res; if ($options{format} eq 'dpkg') { - push @res, $changes->dpkg($range); + push @res, $changes->format_range('dpkg', $range); } elsif ($options{format} eq 'rfc822') { - push @res, $changes->rfc822($range)->get(); + push @res, $changes->format_range('rfc822', $range); } else { error(g_('unknown output format %s'), $options{format}); } diff --git a/scripts/changelog/debian.pl b/scripts/changelog/debian.pl index ad05170fc..0f422bdb6 100755 --- a/scripts/changelog/debian.pl +++ b/scripts/changelog/debian.pl @@ -134,10 +134,5 @@ my $changes = Dpkg::Changelog::Debian->new(reportfile => $label, range => $range $changes->load($file) or error(g_('fatal error occurred while parsing %s'), $file); -eval qq{ - my \$output = \$changes->$format(\$range); - print \$output if defined \$output; -}; -if ($@) { - error('%s', $@); -} +my $entries = $changes->format_range($format, $range); +print $entries if defined $entries; diff --git a/scripts/t/Dpkg_Changelog.t b/scripts/t/Dpkg_Changelog.t index c66f40af8..c095692d0 100644 --- a/scripts/t/Dpkg_Changelog.t +++ b/scripts/t/Dpkg_Changelog.t @@ -166,7 +166,7 @@ foreach my $file ("$datadir/countme", "$datadir/shadow", "$datadir/fields", #TODO: test combinations } if ($file eq "$datadir/fields") { - my $str = $changes->dpkg({ all => 1 }); + my $str = $changes->format_range('dpkg', { all => 1 }); my $expected = 'Source: fields Version: 2.0-0etch1 Distribution: stable @@ -201,13 +201,14 @@ Changes: * First upload (Closes: #1000000) Xb-Userfield2: foobar Xc-Userfield: foobar + '; if ($vendor eq 'Ubuntu') { $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 54321 424242 2424242/m; } cmp_ok($str, 'eq', $expected, 'fields handling'); - $str = $changes->dpkg({ offset => 1, count => 2 }); + $str = $changes->format_range('dpkg', { offset => 1, count => 2 }); $expected = 'Source: fields Version: 2.0-1 Distribution: unstable frozen @@ -232,13 +233,14 @@ Changes: . * Beta Xc-Userfield: foobar + '; if ($vendor eq 'Ubuntu') { $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 424242/m; } cmp_ok($str, 'eq', $expected, 'fields handling 2'); - $str = $changes->rfc822({ offset => 2, count => 2 }); + $str = $changes->format_range('rfc822', { offset => 2, count => 2 }); $expected = 'Source: fields Version: 2.0~b1-1 Distribution: unstable @@ -297,7 +299,7 @@ Xb-Userfield2: foobar 'get date w/ DoW, and zero timezone offset'); } if ($file eq "$datadir/regressions") { - my $f = $changes->dpkg(); + my $f = ($changes->format_range('dpkg'))[0]; is("$f->{Version}", '0', 'version 0 correctly parsed'); } @@ -306,13 +308,13 @@ Xb-Userfield2: foobar if @data == 1; my $oldest_version = $data[-1]->{Version}; - $str = $changes->dpkg({ since => $oldest_version }); + $str = $changes->format_range('dpkg', { since => $oldest_version }); - $str = $changes->rfc822(); + $str = $changes->format_range('rfc822'); ok(1, 'TODO check rfc822 output'); - $str = $changes->rfc822({ since => $oldest_version }); + $str = $changes->format_range('rfc822', { since => $oldest_version }); ok(1, 'TODO check rfc822 output with ranges'); } |