--no-import-before skips importing entire messages, not just keywords, so it can cause permanent data loss if -o is pointed to precious data. --- Documentation/lei-q.pod | 5 +++-- lib/PublicInbox/LEI.pm | 1 + t/lei-q-kw.t | 19 ++++++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/Documentation/lei-q.pod b/Documentation/lei-q.pod index 4862ce78..95f3f702 100644 --- a/Documentation/lei-q.pod +++ b/Documentation/lei-q.pod @@ -108,8 +108,9 @@ Augment output destination instead of clobbering it. =item --no-import-before -Do not import keywords before writing to an existing output -destination. +Do not import messages before writing to an existing output destination. +Be certain you do not need existing data in your output before using +this, it permanently erases data unless C<--augment> is used. =item --threads diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 86b71fcd..a89bdc51 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -353,6 +353,7 @@ my %OPTDESC = ( 'no-torsocks' => 'alias for --torsocks=no', 'save!' => "do not save a search for `lei up'", 'import-remote!' => 'do not memoize remote messages into local store', +'import-before!' => 'do not import before writing to output (DANGEROUS)', 'type=s' => [ 'any|mid|git', 'disambiguate type' ], diff --git a/t/lei-q-kw.t b/t/lei-q-kw.t index 06e1df6c..63e46037 100644 --- a/t/lei-q-kw.t +++ b/t/lei-q-kw.t @@ -9,6 +9,8 @@ use IO::Compress::Gzip qw(gzip); use PublicInbox::MboxReader; use PublicInbox::LeiToMail; use PublicInbox::Spawn qw(popen_rd); +use File::Path qw(make_path); +use PublicInbox::IO qw(write_file); my $exp = { '<q...@example.com>' => eml_load('t/plack-qp.eml'), '<testmess...@example.com>' => eml_load('t/utf8.eml'), @@ -42,6 +44,19 @@ lei_ok(qw(q -o), "maildir:$o", qw(m:q...@example.com)); @fn = glob("$o/cur/*:2,S"); is(scalar(@fn), 1, "`seen' flag (but not `replied') set on Maildir file"); +{ + $o = "$ENV{HOME}/dst-existing"; + make_path(map { "$o/$_" } qw(new cur tmp)); + my $bp = eml_load('t/data/binary.patch'); + write_file '>', "$o/cur/binary-patch:2,S", $bp->as_string; + lei_ok qw(q --no-import-before m:q...@example.com -o), $o; + my @g = glob("$o/*/*"); + is scalar(@g), 1, 'only newly imported message left'; + is eml_load($g[0])->header_raw('Message-ID'), '<q...@example.com>'; + lei qw(q m:binary-patch-test@example); + is $lei_out, "[null]\n", 'old message not imported'; +} + SKIP: { $o = "$ENV{HOME}/fifo"; mkfifo($o, 0600) or skip("mkfifo not supported: $!", 1); @@ -80,9 +95,7 @@ my $write_file = sub { if ($_[0] =~ /\.gz\z/) { gzip(\($_[1]), $_[0]) or BAIL_OUT 'gzip'; } else { - open my $fh, '>', $_[0] or BAIL_OUT $!; - print $fh $_[1] or BAIL_OUT $!; - close $fh or BAIL_OUT; + write_file '>', $_[0], $_[1]; } };