Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
a4ecf6d
package indexing: try to avoid partial updates
rjbs Apr 29, 2023
0283479
PAUSE::Indexer::Context: a (currently zero-value) object for context
rjbs Apr 29, 2023
dc1264c
Indexer context: move indexing warnings to context
rjbs Apr 29, 2023
9fafeea
Indexer context: move alerts to context
rjbs Apr 29, 2023
c298e3d
indexer: make more dist indexing steps check for skip
rjbs Apr 29, 2023
7d93865
indexer: add Abort and Errors to control indexing
rjbs Apr 29, 2023
ec64c11
indexer: a big refactor to change how we abort indexing
rjbs Apr 30, 2023
415fc4b
indexer constants: remove a bunch of dead constants
rjbs Apr 29, 2023
f177b3f
support v5.16: stop using indented heredocs
rjbs Apr 30, 2023
f35ccc3
support v5.16: remove postfix deref
rjbs Apr 30, 2023
186ee6b
indexer context: call a method instead of copypasting
rjbs Apr 30, 2023
d5bb3a3
indexer: improve the no_distname_permissions error
rjbs Apr 30, 2023
2876386
indexer: restructure the try/catch for dist indexing
rjbs Apr 30, 2023
a2a4d15
indexer: drop old warning code, use the new code
rjbs Apr 30, 2023
54efa06
no_index rules: simplify code while refactoring
rjbs Apr 30, 2023
28ff4b6
indexer: turn Abort into Abort::Dist
rjbs Apr 30, 2023
0096a18
indexer: gather packages, then index them
rjbs Apr 30, 2023
4905131
indexer: introduce an Abort::Package catch loop
rjbs Apr 30, 2023
8dda205
indexer: factor our part of the package indexer
rjbs Apr 30, 2023
c01d16d
indexer: try to use "return early" instead of $ok more
rjbs Apr 30, 2023
0ce0d54
indexer context: add package-level indexing status
rjbs May 3, 2023
584c086
indexer: clean up a weirdly-formatted comment
rjbs May 3, 2023
4d13f49
indexer: use ->abort_indexing_package
rjbs May 3, 2023
24a2a61
replace use of index_status with context in reporting
rjbs May 3, 2023
39bb0b5
indexer: reintroduce parameters to package-level errors
rjbs May 3, 2023
5325b8d
indexer: improve what we provide as overall status
rjbs May 3, 2023
e97b634
indexer: word wrap the "nothing updated" text
rjbs May 3, 2023
ce6d391
PAUSE::Indexer::Errors: make sure Carp is loaded, we use it!
rjbs May 7, 2024
05a0bef
PAUSE::Package: pass older_isa_regular_perl along
rjbs May 8, 2024
46dad7b
PAUSE::Indexer::Context: make alert and error methods look the same
rjbs May 8, 2024
1f56eb6
PAUSE::Indexer::Context: log package errors when setting them
rjbs May 11, 2024
826ab37
PAUSE::package: remove dead, commented-out code
rjbs May 11, 2024
9d94118
Mock::Dist: remove this unused code
rjbs May 12, 2024
7996eec
PAUSE::Indexer::Errors: fix keys from $old
rjbs Jun 22, 2024
8c9c5c0
PAUSE::Indexer::Context: make add_dist_error only accept refs
rjbs Jun 22, 2024
393a5ea
PAUSE::Indexer::Context: pass hashrefs to abort_indexing_dist
rjbs Jun 22, 2024
6758a60
PAUSE::dist: do not include private errors in report
rjbs Jun 22, 2024
4662714
PAUSE::DBError: use block-style package
rjbs Jun 22, 2024
344f6a0
PAUSE.pm: move email sending into PAUSE.pm
rjbs Jun 22, 2024
fac7463
PAUSE.pm: add "write mail to mbox" facility
rjbs Jun 22, 2024
a6e19d1
indexer: add tests for "nothing to index" email
rjbs Jun 22, 2024
3fbb036
indexer: be more precise in "nothing to index" email text
rjbs Jun 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 30 additions & 7 deletions lib/PAUSE.pm
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use File::Basename ();
use Compress::Zlib ();
use Cwd ();
use DBI ();
use Email::Sender::Simple ();
use Exporter;
use Fcntl qw(:flock);
my $HAVE_RECENTFILE = eval {require File::Rsync::Mirror::Recentfile; 1;};
Expand Down Expand Up @@ -559,16 +560,38 @@ sub may_overwrite_file {
return;
}

package PAUSE::DBError;
sub sendmail {
my ($self, $email) = @_;

sub new {
my ($class, $msg) = @_;
return bless \$msg, $class;
if ($ENV{PAUSE_TEST_MAIL_MBOX}) {
# This is here for extra testing. If you set this to a filename, every
# email will be written to this mbox. Make sure it's an *absolute* path,
# because the tests change directory. -- rjbs, 2024-06-22

require Email::Sender::Transport::Mbox;
state $mbox = Email::Sender::Transport::Mbox->new({
filename => $ENV{PAUSE_TEST_MAIL_MBOX},
});

$mbox->send_email(Email::Abstract->new($email), {
from => 'test-system',
to => 'test-system',
});
}

Email::Sender::Simple->send($email);
}

use overload (
'""' => sub { ${$_[0]} }
);
package PAUSE::DBError {
sub new {
my ($class, $msg) = @_;
return bless \$msg, $class;
}

use overload (
'""' => sub { ${$_[0]} }
);
}

1;

Expand Down
16 changes: 16 additions & 0 deletions lib/PAUSE/Indexer/Abort/Dist.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package PAUSE::Indexer::Abort::Dist;
use v5.12.0;
use Moo;

has public => (
is => 'ro',
default => 0,
);

has message => (
is => 'ro',
required => 1,
);

no Moo;
1;
16 changes: 16 additions & 0 deletions lib/PAUSE/Indexer/Abort/Package.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package PAUSE::Indexer::Abort::Package;
use v5.12.0;
use Moo;

has public => (
is => 'ro',
default => 0,
);

has message => (
is => 'ro',
required => 1,
);

no Moo;
1;
174 changes: 174 additions & 0 deletions lib/PAUSE/Indexer/Context.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
package PAUSE::Indexer::Context;
use v5.12.0;
use Moo;

use PAUSE::Indexer::Abort::Dist;
use PAUSE::Indexer::Abort::Package;
use PAUSE::Indexer::Errors;
use PAUSE::Logger '$Logger';

has package_warnings => (
is => 'bare',
reader => '_package_warnings',
default => sub { {} },
);

sub add_package_warning {
my ($self, $package_obj, $warning) = @_;

my $package = $package_obj->{PACKAGE};
my $pmfile = $package_obj->pmfile->{PMFILE};

my $key = "$package\0$pmfile";

my $list = ($self->_package_warnings->{$key} //= []);
push @$list, {
package => $package,
pmfile => $pmfile,
text => $warning,
};

$Logger->log([
"adding package warning to %s: %s",
$package_obj->{PACKAGE},
$list->[-1],
]);

return;
}

has package_status => (
is => 'bare',
reader => '_package_status',
default => sub { {} },
);

sub _set_package_error {
my ($self, $package_obj, $status) = @_;

$self->_package_status->{ $package_obj->{PACKAGE} } = {
is_success => 0,
filename => $package_obj->{PP}{infile},
version => $package_obj->{PP}{version},
header => $status->{header},
body => $status->{body},
package => $package_obj->{PACKAGE},
};

$Logger->log([
"set error status for %s to %s",
$package_obj->{PACKAGE},
$status,
]);

return;
}

sub record_package_indexing {
my ($self, $package_obj) = @_;

$self->_package_status->{ $package_obj->{PACKAGE} } = {
is_success => 1,
filename => $package_obj->{PP}{infile},
version => $package_obj->{PP}{version},
header => "Indexed successfully",
body => "The package was indexed successfully.",
package => $package_obj->{PACKAGE},
};

$Logger->log([
"set OK status for %s",
$package_obj->{PACKAGE},
]);

return;
}

sub package_statuses {
my ($self) = @_;

my %stash = %{ $self->_package_status };
return @stash{ sort keys %stash };
}

sub abort_indexing_package {
my ($self, $package_obj, $error) = @_;

$Logger->log("abort indexing $package_obj->{PACKAGE}");

$self->_set_package_error($package_obj, $error);

die PAUSE::Indexer::Abort::Package->new({
message => $error->{header},
public => 1,
});
}

sub warnings_for_all_packages {
my ($self) = @_;

return map {; @$_ } values %{ $self->_package_warnings };
}

sub warnings_for_package {
my ($self, $package_name) = @_;

return grep {; $_->{package} eq $package_name }
$self->warnings_for_all_packages;
}

has alerts => (
is => 'bare',
reader => '_alerts',
default => sub { [] },
);

sub add_alert {
my ($self, $alert) = @_;
$alert =~ s/\v+\z//;

push @{ $self->_alerts }, $alert;
return;
}

sub all_alerts {
my ($self) = @_;
return @{ $self->_alerts };
}

has dist_errors => (
is => 'bare',
reader => '_dist_errors',
default => sub { [] },
);

sub add_dist_error {
my ($self, $error) = @_;

$Logger->log_fatal([ "add_dist_error got bogus input: %s", $error ])
unless ref $error and $error->{header};

$Logger->log([ "adding dist error: %s", $error->{header} ]);
push @{ $self->_dist_errors }, $error;

return;
}

sub all_dist_errors {
my ($self) = @_;
return @{ $self->_dist_errors };
}

sub abort_indexing_dist {
my ($self, $error) = @_;

$self->add_dist_error($error);

die PAUSE::Indexer::Abort::Dist->new({
message => $error->{header},
public => $error->{public},
});
}

no Moo;
1;
Loading