package PublicInbox::LeiInspect;
use strict;
use v5.10.1;
+use parent qw(PublicInbox::IPC);
use PublicInbox::Config;
+use PublicInbox::MID qw(mids);
+use PublicInbox::NetReader qw(imap_uri nntp_uri);
sub inspect_blob ($$) {
my ($lei, $oidhex) = @_;
my $ent = {};
if (my $lse = $lei->{lse}) {
- my @docids = $lse ? $lse->over->blob_exists($oidhex) : ();
+ my $oidbin = pack('H*', $oidhex);
+ my @docids = $lse ? $lse->over->oidbin_exists($oidbin) : ();
$ent->{'lei/store'} = \@docids if @docids;
- my $lms = $lse->lms;
- if (my $loc = $lms ? $lms->locations_for($oidhex) : undef) {
+ my $lms = $lei->lms;
+ if (my $loc = $lms ? $lms->locations_for($oidbin) : undef) {
$ent->{'mail-sync'} = $loc;
}
}
sub inspect_imap_uid ($$) {
my ($lei, $uid_uri) = @_;
my $ent = {};
- my $lse = $lei->{lse} or return $ent;
- my $lms = $lse->lms or return $ent;
+ my $lms = $lei->lms or return $ent;
my $oidhex = $lms->imap_oid($lei, $uid_uri);
- if (ref(my $err = $oidhex)) { # art2folder error
+ if (ref(my $err = $oidhex)) { # arg2folder error
$lei->qerr(@{$err->{qerr}}) if $err->{qerr};
}
$ent->{$$uid_uri} = $oidhex;
$ent;
}
+sub inspect_nntp_range {
+ my ($lei, $uri) = @_;
+ my ($ng, $beg, $end) = $uri->group;
+ $uri = $uri->clone;
+ $uri->group($ng);
+ my $ent = {};
+ my $ret = { "$uri" => $ent };
+ my $lms = $lei->lms or return $ret;
+ my $err = $lms->arg2folder($lei, my $folders = [ $$uri ]);
+ if ($err) {
+ $lei->qerr(@{$err->{qerr}}) if $err->{qerr};
+ }
+ $end //= $beg;
+ for my $art ($beg..$end) {
+ my $oidbin = $lms->imap_oidbin($folders->[0], $art);
+ $ent->{$art} = $oidbin ? unpack('H*', $oidbin) : undef;
+ }
+ $ret;
+}
+
sub inspect_sync_folder ($$) {
my ($lei, $folder) = @_;
my $ent = {};
- my $lse = $lei->{lse} or return $ent;
- my $lms = $lse->lms or return $ent;
+ my $lms = $lei->lms or return $ent;
my $folders = [ $folder ];
my $err = $lms->arg2folder($lei, $folders);
if ($err) {
my $ent;
if ($item =~ /\Ablob:(.+)/) {
$ent = inspect_blob($lei, $1);
- } elsif ($item =~ m!\Aimaps?://!i) {
- require PublicInbox::URIimap;
- my $uri = PublicInbox::URIimap->new($item);
- if (defined($uri->uid)) {
- $ent = inspect_imap_uid($lei, $uri);
- } else {
- $ent = inspect_sync_folder($lei, $item);
- }
} elsif ($item =~ m!\A(?:maildir|mh):!i || -d $item) {
$ent = inspect_sync_folder($lei, $item);
} elsif ($item =~ m!\Adocid:([0-9]+)\z!) {
$ent = inspect_num($lei, $1 + 0);
} elsif ($item =~ m!\A(?:mid|m):(.+)\z!) {
$ent = inspect_mid($lei, $1);
+ } elsif (my $iuri = imap_uri($item)) {
+ if (defined($iuri->uid)) {
+ $ent = inspect_imap_uid($lei, $iuri);
+ } else {
+ $ent = inspect_sync_folder($lei, $item);
+ }
+ } elsif (my $nuri = nntp_uri($item)) {
+ if (defined(my $mid = $nuri->message)) {
+ $ent = inspect_mid($lei, $mid);
+ } else {
+ my ($group, $beg, $end) = $nuri->group;
+ if (defined($beg)) {
+ $ent = inspect_nntp_range($lei, $nuri);
+ } else {
+ $ent = inspect_sync_folder($lei, $item);
+ }
+ }
} else { # TODO: more things
return $lei->fail("$item not understood");
}
1;
}
+sub inspect_argv { # via wq_do
+ my ($self) = @_;
+ my ($lei, $argv) = delete @$self{qw(lei argv)};
+ my $multi = scalar(@$argv) > 1;
+ $lei->{1}->autoflush(0);
+ $lei->out('[') if $multi;
+ while (defined(my $x = shift @$argv)) {
+ inspect1($lei, $x, scalar(@$argv)) or return;
+ }
+ $lei->out(']') if $multi;
+}
+
+sub inspect_start ($$) {
+ my ($lei, $argv) = @_;
+ my $self = bless { lei => $lei, argv => $argv }, __PACKAGE__;
+ my ($op_c, $ops) = $lei->workers_start($self, 1);
+ $lei->{wq1} = $self;
+ $lei->wait_wq_events($op_c, $ops);
+ $self->wq_do('inspect_argv');
+ $self->wq_close(1);
+}
+
+sub ins_add { # InputPipe->consume callback
+ my ($lei) = @_; # $_[1] = $rbuf
+ if (defined $_[1]) {
+ $_[1] eq '' and return eval {
+ my $str = delete $lei->{istr};
+ $str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s;
+ my $eml = PublicInbox::Eml->new(\$str);
+ inspect_start($lei, [
+ 'blob:'.$lei->git_oid($eml)->hexdigest,
+ map { "mid:$_" } @{mids($eml)} ]);
+ };
+ $lei->{istr} .= $_[1];
+ } else {
+ $lei->fail("error reading stdin: $!");
+ }
+}
+
sub lei_inspect {
my ($lei, @argv) = @_;
$lei->{json} = ref(PublicInbox::Config::json())->new->utf8->canonical;
my $sto = $lei->_lei_store;
$sto ? $sto->search : undef;
} : undef;
- if ($lei->{opt}->{pretty} || -t $lei->{1}) {
- $lei->{json}->pretty(1)->indent(2);
- }
- $lei->start_pager if -t $lei->{1};
- $lei->{1}->autoflush(0);
- my $multi = scalar(@argv) > 1;
- $lei->out('[') if $multi;
- while (defined(my $x = shift @argv)) {
- inspect1($lei, $x, scalar(@argv)) or return;
+ my $isatty = -t $lei->{1};
+ $lei->{json}->pretty(1)->indent(2) if $lei->{opt}->{pretty} || $isatty;
+ $lei->start_pager if $isatty;
+ if ($lei->{opt}->{stdin}) {
+ return $lei->fail(<<'') if @argv;
+no args allowed on command-line with --stdin
+
+ require PublicInbox::InputPipe;
+ PublicInbox::InputPipe::consume($lei->{0}, \&ins_add, $lei);
+ } else {
+ inspect_start($lei, \@argv);
}
- $lei->out(']') if $multi;
}
sub _complete_inspect {
my ($lei, @argv) = @_;
- my $sto = $lei->_lei_store or return;
- my $lms = $sto->search->lms or return;
+ my $lms = $lei->lms or return;
my $match_cb = $lei->complete_url_prepare(\@argv);
map { $match_cb->($_) } $lms->folders;
}