-# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# Writes PublicInbox::Eml objects atomically to a mbox variant or Maildir
use Symbol qw(gensym);
use IO::Handle; # ->autoflush
use Fcntl qw(SEEK_SET SEEK_END O_CREAT O_EXCL O_WRONLY);
-use Errno qw(EEXIST ESPIPE);
+use Errno qw(EEXIST ESPIPE ENOENT);
my %kw2char = ( # Maildir characters
draft => 'D',
# XXX should we support /dev/stdout.gz ?
if ($dst eq '/dev/stdout') {
$out = $lei->{1};
- } else { # TODO: mbox locking
- open $out, '+>>', $dst or die "open $dst: $!";
+ } else { # TODO: mbox locking (but mairix doesn't...)
+ my $mode = -p $dst ? '>' : '+>>';
+ if (-f _ && !$lei->{opt}->{augment} and !unlink($dst)) {
+ die "unlink $dst: $!" if $! != ENOENT;
+ }
+ open $out, $mode, $dst or die "open $dst: $!";
# Perl does SEEK_END even with O_APPEND :<
$seekable = seek($out, 0, SEEK_SET);
die "seek $dst: $!\n" if !$seekable && $! != ESPIPE;
# maybe some systems don't honor O_APPEND, Perl does this:
seek($out, 0, SEEK_END) or die "seek $dst: $!";
$dedupe->pause_dedupe if $jobs; # are we forking?
- } elsif ($seekable) {
- truncate($out, 0) or die "truncate $dst: $!";
}
$dedupe->prepare_dedupe if !$jobs;
($out, $pipe_lk) = compress_dst($out, $zsfx, $lei) if $zsfx;