$m0 = eval {
PublicInbox::LeiMirror::decode_manifest($fh, $mf, $mf)
};
- $lei->err($@) if $@;
+ warn($@) if $@;
}
my ($bn) = ($fn =~ m!/([^/]+)\z!);
my $curl_cmd = $lei->{curl}->for_uri($lei, $muri, qw(-R -o), $bn);
# pronounced "exit": x_it(1 << 8) => exit(1); x_it(13) => SIGPIPE
sub x_it ($$) {
my ($self, $code) = @_;
+ local $current_lei = $self;
# make sure client sees stdout before exit
$self->{1}->autoflush(1) if $self->{1};
stop_pager($self);
sub fail_handler ($;$$) {
my ($lei, $code, $io) = @_;
+ local $current_lei = $lei;
close($io) if $io; # needed to avoid warnings on SIGPIPE
_drop_wq($lei);
x_it($lei, $code // (1 << 8));
sub fail ($$;$) {
my ($self, $buf, $exit_code) = @_;
+ local $current_lei = $self;
$self->{failed}++;
warn($buf, "\n") if defined $buf;
$self->{pkt_op_p}->pkt_do('fail_handler') if $self->{pkt_op_p};
sub child_error { # passes non-fatal curl exit codes to user
my ($self, $child_error, $msg) = @_; # child_error is $?
+ local $current_lei = $self;
$child_error ||= 1 << 8;
warn($msg, "\n") if defined $msg;
if ($self->{pkt_op_p}) { # to top lei-daemon
$cmd = [ Text::ParseWords::shellwords($cmd) ];
send($sock, exec_buf($cmd, {}), MSG_EOR) if $sock;
} else {
- err($self, "W: unsupported --alert=$op"); # non-fatal
+ warn("W: unsupported --alert=$op\n"); # non-fatal
}
}
}
# display a message for user before spawning full-screen $VISUAL
sub pgr_err {
my ($self, @msg) = @_;
- return $self->err(@msg) unless $self->{sock} && -t $self->{2};
+ return warn(@msg) unless $self->{sock} && -t $self->{2};
start_pager($self, { LESS => 'RX' }); # no 'F' so we prompt
print { $self->{2} } @msg;
$self->{2}->autoflush(1);
sub dclose {
my ($self) = @_;
+ local $current_lei = $self;
delete $self->{-progress};
_drop_wq($self) if $self->{failed};
$self->close if $self->{-event_init_done}; # PublicInbox::DS::close
sub wq_done_wait { # dwaitpid callback
my ($arg, $pid) = @_;
my ($wq, $lei) = @$arg;
+ local $current_lei = $lei;
my $err_type = $lei->{-err_type};
$? and $lei->child_error($?,
$err_type ? "$err_type errors during $lei->{cmd}" : ());
sub wq_eof { # EOF callback for main daemon
my ($lei) = @_;
+ local $current_lei = $lei;
my $wq1 = delete $lei->{wq1} // return $lei->fail; # already failed
$wq1->wq_wait_old($wq1->can('_wq_done_wait') // \&wq_done_wait, $lei);
}
$seen{$url} = undef;
my $state = $cfg->get_1("watch.$url.state");
if (!watch_state_ok($state)) {
- $lei->err("watch.$url.state=$state not supported");
+ warn("watch.$url.state=$state not supported\n");
next;
}
if ($url =~ /\Amaildir:(.+)/i) {
sub sto_done_request {
my ($lei, $sock) = @_;
+ local $current_lei = $lei;
eval {
if ($sock //= $lei->{sock}) { # issue, async wait
$lei->{sto}->wq_io_do('done', [ $sock ]);
my $wait = $lei->{sto}->wq_do('done');
}
};
- $lei->err($@) if $@;
+ warn($@) if $@;
}
sub cfg_dump ($$) {
my ($lei, $f) = @_;
my $ret = eval { PublicInbox::Config->git_config_dump($f, $lei->{2}) };
return $ret if !$@;
- $lei->err($@);
+ warn($@);
undef;
}
# don't try to support all the git-show(1) options for non-blob,
# this is just a convenience:
$type ne 'blob' and
- $lei->err("# $oid is a $type of $size bytes in:\n#\t$gd");
+ warn "# $oid is a $type of $size bytes in:\n#\t$gd\n";
my $cmd = [ 'git', "--git-dir=$gd", 'show', $oid ];
my $rdr = { 1 => $lei->{1}, 2 => $lei->{2} };
delete $lei->{1};
delete $self->{wcb}; # commit
my $nr = delete($lei->{-nr_write}) // 0;
- $lei->err("# converted $nr messages") if $lei->{opt}->{verbose};
+ $lei->qerr("# converted $nr messages");
}
sub lei_convert { # the main "lei convert" method
if ($? == 0) {
$lei->qerr("# $l forgotten ");
} elsif (($? >> 8) == 5) {
- $lei->err("# $l not found");
+ warn("# $l not found\n");
} else {
- $lei->err("# --unset $key error");
- return $lei->x_it($?);
+ $lei->child_error($?, "# --unset $key error");
}
}
}
my $lse = $self->{lse} //= $self->{lei}->{sto}->search;
my $lms = $self->{-lms_ro} //= $self->{lei}->lms; # may be 0 or undef
my @oidbin = $lms ? $lms->name_oidbin($folder, $bn) : ();
- @oidbin > 1 and $self->{lei}->err("W: $folder/*/$$bn not unique:\n",
+ @oidbin > 1 and warn("W: $folder/*/$$bn not unique:\n",
map { "\t".unpack('H*', $_)."\n" } @oidbin);
my %seen;
my @docids = sort { $a <=> $b } grep { !$seen{$_}++ }
my $nproc = $self->detect_nproc;
$j = $nproc if $j > $nproc;
}
- if ($lei->{opt}->{'new-only'} && (!$net || !$net->{imap_order})) {
- $lei->err('# --new-only is only for IMAP');
- }
+ ($lei->{opt}->{'new-only'} && (!$net || !$net->{imap_order})) and
+ warn "# --new-only is only for IMAP\n";
my $ops = {};
$lei->{auth}->op_merge($ops, $self) if $lei->{auth};
$lei->{-eml_noisy} = 1;
my ($self, $url, $uid, $kw) = @_;
my @oidbin = $self->{-lms_ro}->num_oidbin($url, $uid);
my $uid_url = "$url/;UID=$uid";
- @oidbin > 1 and $self->{lei}->err("W: $uid_url not unique:\n",
+ @oidbin > 1 and warn("W: $uid_url not unique:\n",
map { "\t".unpack('H*', $_)."\n" } @oidbin);
my %seen;
my @docids = sort { $a <=> $b } grep { !$seen{$_}++ }
--mail-sync specified but no inputs support it
# non-fatal if some inputs support support sync
- $lei->err("# --mail-sync will only be used for @{$sync->{ok}}");
- $lei->err("# --mail-sync is not supported for: @{$sync->{no}}");
+ warn("# --mail-sync will only be used for @{$sync->{ok}}\n");
+ warn("# --mail-sync is not supported for: @{$sync->{no}}\n");
}
if ($net) {
$net->{-can_die} = 1;
# using `$res' instead of `$orig'
EOM
} else {
- $lei->err($res) if defined $res;
+ warn($res, "\n") if defined $res;
push @no, $orig;
}
} elsif (m!\A(?:nntps?|s?news)://!i) {
# using `$res' instead of `$orig'
EOM
} else {
- $lei->err($res) if defined $res;
+ warn($res, "\n") if defined $res;
push @no, $orig;
}
} else {
if ($?) {
$lei->child_error($?);
} elsif (!unlink($f)) {
- $lei->err("unlink($f): $!") unless $!{ENOENT};
+ warn("unlink($f): $!\n") unless $!{ENOENT};
} else {
if ($lei->{cmd} ne 'public-inbox-clone') {
$lei->lazy_cb('add-external', '_finish_'
-d $dst or die "mkpath($dst): $!\n";
}
my $err = _get_txt($self, qw(_/text/config/raw inbox.config.example));
- return $self->{lei}->err($err) if $err;
+ return warn($err, "\n") if $err;
my $f = "$self->{dst}/inbox.config.example";
chmod((stat($f))[2] & 0444, $f) or die "chmod(a-w, $f): $!";
my $cfg = PublicInbox::Config->git_config_dump($f, $self->{lei}->{2});
my ($self, $iv) = @_;
my $lei = $self->{lei};
my $err = _get_txt($self, qw(description description));
- $lei->err($err) if $err; # non fatal
+ warn($err, "\n") if $err; # non fatal
eval { set_description($self) };
warn $@ if $@;
my ($path_pfx, $v1_path, @v2_epochs) = deduce_epochs($m, $path);
if (@v2_epochs) {
# It may be possible to have v1 + v2 in parallel someday:
- $lei->err(<<EOM) if defined $v1_path;
+ warn(<<EOM) if defined $v1_path;
# `$v1_path' appears to be a v1 inbox while v2 epochs exist:
# @v2_epochs
# ignoring $v1_path (use --inbox-version=1 to force v1 instead)
if ($lei->{opt}->{debug}) {
my $json = ref(PublicInbox::Config->json)->new;
$json->utf8->canonical->pretty;
- $lei->err($json->encode($lei->{qterms}));
+ print { $lei->{2} } $json->encode($lei->{qterms});
}
my (@q, %seen);
for my $pfx (@want) {
# don't try to support all the git-show(1) options for non-blob,
# this is just a convenience:
- $type ne 'blob' and return $lei->err(<<EOF);
+ $type ne 'blob' and return warn(<<EOF);
# $oid is a $type of $size bytes in:
# $git->{git_dir} (wanted: $oid_want)
EOF
if (my $bref = $self->{lei}->ale->git->cat_file($smsg->{blob})) {
return PublicInbox::Eml->new($bref);
}
- $self->{lei}->err("E: $self->{uri} $smsg->{blob} gone <$smsg->{mid}>");
+ warn("E: $self->{uri} $smsg->{blob} gone <$smsg->{mid}>\n");
undef;
}
my $cfg = PublicInbox::Config::config_fh_parse($r, "\0", "\n");
waitpid($pid, 0);
if ($?) {
- $lei->err("# git-config failed, no color (non-fatal)");
+ warn "# git-config failed, no color (non-fatal)\n";
return $self;
}
$self->{-colored} = \&my_colored;
use PublicInbox::MID qw(mids);
use PublicInbox::Smsg;
use PublicInbox::Eml;
+use PublicInbox::LEI;
use Fcntl qw(SEEK_SET F_SETFL O_APPEND O_RDWR);
use PublicInbox::ContentHash qw(git_sha);
use POSIX qw(strftime);
$err = '';
if (-s $cerr) {
seek($cerr, 0, SEEK_SET) or
- $lei->err("seek($cmd stderr): $!");
+ warn "seek($cmd stderr): $!";
$err = do { local $/; <$cerr> } //
- "read($cmd stderr): $!";
+ warn "read($cmd stderr): $!";
truncate($cerr, 0) or
- $lei->err("truncate($cmd stderr): $!");
+ warn "truncate($cmd stderr): $!";
}
next if (($? >> 8) == 22 && $err =~ /\b404\b/);
$uri->query_form(q => $qstr);
sub query_done { # EOF callback for main daemon
my ($lei) = @_;
+ local $PublicInbox::LEI::current_lei = $lei;
my $l2m = delete $lei->{l2m};
$l2m->wq_wait_old(\&xsearch_done_wait, $lei) if $l2m;
if (my $lxs = delete $lei->{lxs}) {
sub do_post_augment {
my ($lei) = @_;
+ local $PublicInbox::LEI::current_lei = $lei;
my $l2m = $lei->{l2m} or return; # client disconnected
$lei->fchdir or return;
my $err;
$nl + $nr;
}
-sub start_query ($;$) { # always runs in main (lei-daemon) process
- my ($self, $l2m) = @_;
- if ($self->{opt_threads} || ($l2m && !$self->{opt_sort})) {
+sub start_query ($$) { # always runs in main (lei-daemon) process
+ my ($self, $lei) = @_;
+ local $PublicInbox::LEI::current_lei = $lei;
+ if ($self->{opt_threads} || ($lei->{l2m} && !$self->{opt_sort})) {
for my $ibxish (locals($self)) {
$self->wq_io_do('query_one_mset', [], $ibxish);
}
}
sub incr_start_query { # called whenever an l2m shard starts do_post_auth
- my ($self, $l2m) = @_;
+ my ($self, $lei) = @_;
+ my $l2m = $lei->{l2m};
return if ++$self->{nr_start_query} != $l2m->{-wq_nr_workers};
- start_query($self, $l2m);
+ start_query($self, $lei);
}
sub ipc_atfork_child {
'l2m_progress' => [ \&l2m_progress, $lei ],
'x_it' => [ $lei ],
'child_error' => [ $lei ],
- 'incr_start_query' => [ $self, $l2m ],
+ 'incr_start_query' => [ $self, $lei ],
};
$lei->{auth}->op_merge($ops, $l2m) if $l2m && $lei->{auth};
my $end = $lei->pkt_op_pair;
if ($l2m) {
$l2m->net_merge_all_done($lei) unless $lei->{auth};
} else {
- start_query($self);
+ start_query($self, $lei);
}
$lei->event_step_init; # wait for shutdowns
$lei->wait_wq_events($op_c, $ops);