]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LEI.pm
lei mail-diff: support more inputs, split newlines
[public-inbox.git] / lib / PublicInbox / LEI.pm
index 5b726f71382e8732b43fae61bfcb6149e874a8a0..96f7c5e315a9d4b8b182953cd0a6269db880ca66 100644 (file)
@@ -19,7 +19,7 @@ use IO::Handle ();
 use Fcntl qw(SEEK_SET);
 use PublicInbox::Config;
 use PublicInbox::Syscall qw(EPOLLIN);
-use PublicInbox::DS qw(now dwaitpid);
+use PublicInbox::DS qw(dwaitpid);
 use PublicInbox::Spawn qw(spawn popen_rd);
 use PublicInbox::Lock;
 use PublicInbox::Eml;
@@ -179,7 +179,7 @@ our %CMD = ( # sorted in order of importance/use:
 
 'up' => [ 'OUTPUT...|--all', 'update saved search',
        qw(jobs|j=s lock=s@ alert=s@ mua=s verbose|v+ exclude=s@
-       remote-fudge-time=s all:s remote! local! external!), @c_opt ],
+       remote-fudge-time=s all:s remote! local! external!), @net_opt, @c_opt ],
 
 'lcat' => [ '--stdin|MSGID_OR_URL...', 'display local copy of message(s)',
        'stdin|', # /|\z/ must be first for lone dash
@@ -202,7 +202,7 @@ our %CMD = ( # sorted in order of importance/use:
 
 'mail-diff' => [ '--stdin|LOCATION...', 'diff the contents of emails',
        'stdin|', # /|\z/ must be first for lone dash
-       qw(verbose|v+ color:s no-color raw-header),
+       qw(verbose|v+ in-format|F=s color:s no-color raw-header),
        @diff_opt, @net_opt, @c_opt ],
 
 'add-external' => [ 'LOCATION',
@@ -215,15 +215,15 @@ our %CMD = ( # sorted in order of importance/use:
 'ls-mail-sync' => [ '[FILTER]', 'list mail sync folders',
                qw(z|0 globoff|g invert-match|v local remote), @c_opt ],
 'ls-mail-source' => [ 'URL', 'list IMAP or NNTP mail source folders',
-               qw(z|0 ascii l pretty url), @c_opt ],
+               qw(z|0 ascii l pretty url), @net_opt, @c_opt ],
 'forget-external' => [ 'LOCATION...|--prune',
        'exclude further results from a publicinbox|extindex',
        qw(prune), @c_opt ],
 
 'ls-search' => [ '[PREFIX]', 'list saved search queries',
                qw(format|f=s pretty l ascii z|0), @c_opt ],
-'forget-search' => [ 'OUTPUT...', 'forget a saved search',
-               qw(verbose|v+), @c_opt ],
+'forget-search' => [ 'OUTPUT...|--prune', 'forget a saved search',
+               qw(verbose|v+ prune:s), @c_opt ],
 'edit-search' => [ 'OUTPUT', "edit saved search via `git config --edit'",
                        @c_opt ],
 'rm' => [ '--stdin|LOCATION...',
@@ -265,7 +265,8 @@ our %CMD = ( # sorted in order of importance/use:
 'forget-mail-sync' => [ 'LOCATION...',
        'forget sync information for a mail folder', @c_opt ],
 'refresh-mail-sync' => [ 'LOCATION...|--all',
-       'prune dangling sync data for a mail folder', 'all:s', @c_opt ],
+       'prune dangling sync data for a mail folder', 'all:s',
+               @net_opt, @c_opt ],
 'export-kw' => [ 'LOCATION...|--all',
        'one-time export of keywords of sync sources',
        qw(all:s mode=s), @net_opt, @c_opt ],
@@ -273,9 +274,9 @@ our %CMD = ( # sorted in order of importance/use:
        'one-time conversion from URL or filesystem to another format',
        qw(stdin| in-format|F=s out-format|f=s output|mfolder|o=s lock=s@ kw!),
        @net_opt, @c_opt ],
-'p2q' => [ 'FILE|COMMIT_OID|--stdin',
+'p2q' => [ 'LOCATION_OR_COMMIT...|--stdin',
        "use a patch to generate a query for `lei q --stdin'",
-       qw(stdin| want|w=s@ uri debug), @c_opt ],
+       qw(stdin| in-format|F=s want|w=s@ uri debug), @net_opt, @c_opt ],
 'config' => [ '[...]', sub {
                'git-config(1) wrapper for '._config_path($_[0]);
        }, qw(config-file|system|global|file|f=s), # for conflict detection
@@ -353,6 +354,7 @@ my %OPTDESC = (
 
 'want|w=s@' => [ 'PREFIX|dfpost|dfn', # common ones in help...
                'search prefixes to extract (default: dfpost7)' ],
+'uri   p2q' => [ 'URI escape output' ],
 
 'alert=s@' => ['CMD,:WINCH,:bell,<any command>',
        'run command(s) or perform ops when done writing to output ' .
@@ -1129,6 +1131,7 @@ sub event_step {
                if (scalar(@fds) == 1 && !defined($fds[0])) {
                        return if $! == EAGAIN;
                        die "recvmsg: $!" if $! != ECONNRESET;
+                       @fds = (); # for open loop below:
                }
                for (@fds) { open my $rfh, '+<&=', $_ }
                if ($buf eq '') {
@@ -1198,7 +1201,7 @@ sub dir_idle_handler ($) { # PublicInbox::DirIdle callback
        my $fn = $ev->fullname;
        if ($fn =~ m!\A(.+)/(new|cur)/([^/]+)\z!) { # Maildir file
                my ($mdir, $nc, $bn) = ($1, $2, $3);
-               $nc = '' if $ev->IN_DELETE;
+               $nc = '' if $ev->IN_DELETE || $ev->IN_MOVED_FROM;
                for my $f (keys %{$MDIR2CFGPATH->{$mdir} // {}}) {
                        my $cfg = $PATH2CFG{$f} // next;
                        eval {
@@ -1315,11 +1318,10 @@ sub lazy_start {
                        $quit->();
                }
                return 1 if defined($path);
-               my $now = now();
                my $n = 0;
                for my $s (values %$dmap) {
                        $s->can('busy') or next;
-                       if ($s->busy($now)) {
+                       if ($s->busy) {
                                ++$n;
                        } else {
                                $s->close;