qw(maybelink htmlize_addresslinks htmlize_maintlinks),
],
util => [qw(cgi_parameters quitcgi),
- qw(getpseudodesc)
],
misc => [qw(maint_decode)],
#status => [qw(getbugstatus)],
our $_maintainer;
our $_maintainer_rev;
-our $_pseudodesc;
-sub getpseudodesc {
- return $_pseudodesc if $_pseudodesc;
- my %pseudodesc;
-
- my $pseudo = new IO::File $config{pseudo_desc_file},'r'
- or &quitcgi("Unable to open $config{pseudo_desc_file}: $!");
- while(<$pseudo>) {
- next unless m/^(\S+)\s+(\S.*\S)\s*$/;
- $pseudodesc{lc $1} = $2;
- }
- close($pseudo);
- $_pseudodesc = \%pseudodesc;
- return $_pseudodesc;
-}
-
-
=head2 bug_links
bug_links($one_bug);
@EXPORT = ();
%EXPORT_TAGS = (util => [qw(getbugcomponent getbuglocation getlocationpath get_hashname),
qw(appendfile buglog getparsedaddrs getmaintainers),
- qw(getmaintainers_reverse)
+ qw(getmaintainers_reverse),
+ qw(getpseudodesc),
],
misc => [qw(make_list)],
date => [qw(secs_to_english)],
return () unless defined $addr;
return wantarray?@{$_parsedaddrs{$addr}}:$_parsedaddrs{$addr}[0]
if exists $_parsedaddrs{$addr};
- @{$_parsedaddrs{$addr}} = Mail::Address->parse($addr);
+ {
+ no warnings;
+ @{$_parsedaddrs{$addr}} = Mail::Address->parse($addr);
+ }
return wantarray?@{$_parsedaddrs{$addr}}:$_parsedaddrs{$addr}[0];
}
return $_maintainer if $_maintainer;
my %maintainer;
my %maintainer_rev;
- for my $file (@config{qw(maintainer_file maintainer_file_override)}) {
+ for my $file (@config{qw(maintainer_file maintainer_file_override pseduo_maint_file)}) {
next unless defined $file;
my $maintfile = new IO::File $file,'r' or
&quitcgi("Unable to open $file: $!");
return $_maintainer_rev;
}
+=head2 getpseudodesc
+
+ my $pseudopkgdesc = getpseudodesc(...);
+
+Returns the entry for a pseudo package from the
+$config{pseudo_desc_file}. In cases where pseudo_desc_file is not
+defined, returns an empty arrayref.
+
+This function can be used to see if a particular package is a
+pseudopackage or not.
+
+=cut
+
+our $_pseudodesc;
+sub getpseudodesc {
+ return $_pseudodesc if $_pseudodesc;
+ my %pseudodesc;
+
+ if (not defined $config{pseudo_desc_file}) {
+ $_pseudodesc = {};
+ return $_pseudodesc;
+ }
+ my $pseudo = IO::File->new($config{pseudo_desc_file},'r')
+ or die "Unable to open $config{pseudo_desc_file}: $!";
+ while(<$pseudo>) {
+ next unless m/^(\S+)\s+(\S.*\S)\s*$/;
+ $pseudodesc{lc $1} = $2;
+ }
+ close($pseudo);
+ $_pseudodesc = \%pseudodesc;
+ return $_pseudodesc;
+}
+
+
=head1 DATE
my $english = secs_to_english($seconds);
qw($gBugs $gRemoveAge $gSaveOldBugs $gDefaultSeverity),
qw($gShowSeverities $gBounceFroms $gConfigDir $gSpoolDir),
qw($gIncomingDir $gWebDir $gDocDir $gMaintainerFile),
- qw($gMaintainerFileOverride $gPseudoDescFile $gPackageSource),
+ qw($gMaintainerFileOverride $gPseudoMaintFile $gPseudoDescFile $gPackageSource),
qw($gVersionPackagesDir $gVersionIndex $gBinarySourceMap $gSourceBinaryMap),
qw($gVersionTimeIndex),
qw($gSendmail $gLibPath $gSpamScan @gExcludeFromControl),
set_default(\%config,'maintainer_file',$config{config_dir}.'/Maintainers');
set_default(\%config,'maintainer_file_override',$config{config_dir}.'/Maintainers.override');
+set_default(\%config,'pseudo_maint_file',$config{config_dir}.'/pseudo-packages.maint');
set_default(\%config,'pseudo_desc_file',$config{config_dir}.'/pseudo-packages.description');
set_default(\%config,'package_source',$config{config_dir}.'/indices/sources');
sub bug_archive {
my %param = validate_with(params => \@_,
spec => {bug => {type => SCALAR,
- regex => qr/^\d+/,
+ regex => qr/^\d+$/,
},
check_archiveable => {type => BOOLEAN,
default => 1,
my $f_ver = $ver;
if ($param{source}) {
($f_ver) = makesourceversions($package,$arch,$ver);
+ next unless defined $f_ver;
}
if ($param{time}) {
$versions{$f_ver} = max($versions{$f_ver}||0,$version->{$dist}{$arch}{$ver});
return $cannot_archive if not defined $status->{done} or not length $status->{done};
# If we just are checking if the bug can be archived, we'll not even bother
# checking the versioning information if the bug has been -done for less than 28 days.
+ my $log_file = getbugcomponent($param{bug},'log');
+ if (not defined $log_file) {
+ print STDERR "Cannot archive $param{bug} because the log doesn't exists\n" if $DEBUG;
+ }
if (not $param{days_until} and not $param{ignore_time}
and $config{remove_age} >
- -M getbugcomponent($param{bug},'log')
+ -M $log_file
) {
+ print STDERR "Cannot archive $param{bug} because of time\n" if $DEBUG;
return $cannot_archive;
}
# At this point, we have to get the versioning information for this bug.
version_cache => $version_cache,
package => $status->{package},
)) {
+ print STDERR "Cannot archive $param{bug} because it's found\n" if $DEBUG;
return $cannot_archive;
}
# Since the bug has at least been fixed in the architectures
return $param{days_until}?0:1;
}
# 6. at least 28 days have passed since the last action has occured or the bug was closed
- my $age = ceil(max(map {$config{remove_age} - -M getbugcomponent($_,'log')}
+ my $age = ceil(max(map {$config{remove_age} - -M $log_file}
$param{bug}, split / /, $status->{mergedwith}
)
);
}
my @sourceversions;
+ my $pseudo_desc = getpseudodesc();
if (not exists $param{sourceversions}) {
my %sourceversions;
- if (defined $param{version}) {
+ # pseudopackages do not have source versions by definition.
+ if (exists $pseudo_desc->{$status{package}}) {
+ # do nothing.
+ }
+ elsif (defined $param{version}) {
foreach my $arch (make_list($param{arch})) {
for my $package (split /\s*,\s*/, $status{package}) {
my @temp = makesourceversions($package,
# TODO: This should probably be handled further out for efficiency and
# for more ease of distinguishing between pkg= and src= queries.
+ # DLA: src= queries should just pass arch=source, and they'll be happy.
@sourceversions = keys %sourceversions;
}
else {
);
}
if ($param{version} !~ m{/}) {
- $param{version} = makesourceversions($param{package},undef,
- $param{version}
- );
+ my ($version) = makesourceversions($param{package},undef,
+ $param{version}
+ );
+ $param{version} = $version if defined $version;
}
# Figure out which source packages we need
my %sources;
@sources{map {m{(.+)/}; $1} @found} = (1) x @found;
@sources{map {m{(.+)/}; $1} @fixed} = (1) x @fixed;
- @sources{map {m{(.+)/}; $1} $param{version}} = 1;
+ @sources{map {m{(.+)/}; $1} $param{version}} = 1 if
+ $param{version} =~ m{/};
my $version;
if (not defined $param{version_cache} or
not exists $param{version_cache}{join(',',sort keys %sources)}) {
$version = Debbugs::Versions->new(\&Debbugs::Versions::Dpkg::vercmp);
foreach my $source (keys %sources) {
my $srchash = substr $source, 0, 1;
- my $version_fh = IO::File->new("$config{version_packages_dir}/$srchash/$source", 'r') or
- warn "Unable to open $config{version_packages_dir}/$srchash/$source: $!" and next;
+ my $version_fh = IO::File->new("$config{version_packages_dir}/$srchash/$source", 'r');
+ if (not defined $version_fh) {
+ # We only want to warn if it's a package which actually has a maintainer
+ my $maints = getmaintainers();
+ next if not exists $maints->{$source};
+ warn "Unable to open $config{version_packages_dir}/$srchash/$source: $!";
+ next;
+ }
$version->load($version_fh);
}
if (defined $param{version_cache}) {
use Debbugs::Config qw(:globals :text :config);
use Debbugs::User;
use Debbugs::CGI qw(version_url maint_decode);
-use Debbugs::Common qw(getparsedaddrs :date make_list getmaintainers);
+use Debbugs::Common qw(getparsedaddrs :date make_list getmaintainers getpseudodesc);
use Debbugs::Bugs qw(get_bugs bug_filter newest_bug);
use Debbugs::Packages qw(getsrcpkgs getpkgsrc get_versions);
use Debbugs::Status qw(:status);
html_escape("http://${debbugs::gWebDomain}/Reporting${debbugs::gHTMLSuffix}");
}
if (not $maint and not @bugs) {
- print "<p>There is no record of the " .
- ($srcorbin eq 'binary' ? html_escape($package) . " package"
- : html_escape($src) . " source package").
+ print "<p>There is no record of the " . html_escape($package) .
+ ($srcorbin eq 'binary' ? " package" : " source package") .
", and no bugs have been filed against it.</p>";
$showresult = 0;
}
}
}
} elsif (m{^found\s+\#?(-?\d+)
- (?:\s+(?:$config{package_name_re}\/)?
- ($config{package_version_re}))?$}ix) {
+ (?:\s+((?:$config{package_name_re}\/)?
+ $config{package_version_re}))?$}ix) {
$ok++;
$ref= $1;
$version= $2;
map {s{.+/}{}; $_;} @{$data->{fixed_versions}};
if (not @fixed_order or (Debbugs::Versions::Dpkg::vercmp($version_only,$fixed_order[-1]) >= 0)) {
$data->{done} = '';
+ $action = "$gBug marked as found in version $version and reopened.";
}
} else {
# Versionless found; assume old-style "not fixed at
} while (&getnextbug);
}
}
- } elsif (m/^notfound\s+\#?(-?\d+)\s+(\d.*)$/i) {
+ } elsif (m[^notfound\s+\#?(-?\d+)
+ (?:\s+(?:$config{package_name_re}\/)?
+ ($config{package_version_re}))$]ix) {
$ok++;
$ref= $1;
$version= $2;