use File::Temp qw/tempdir/;
use IO::Socket;
use POSIX qw(dup2);
-use PublicInbox::V2Writable;
+use_ok 'PublicInbox::V2Writable';
use PublicInbox::MIME;
use PublicInbox::Config;
use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD);
Subject: a
Date: Thu, 01 Jan 1970 00:00:00 +0000
+my $old_rotate_bytes = $v2w->{rotate_bytes};
+$v2w->{rotate_bytes} = 500; # force rotating
for my $i (1..9) {
$mime->header_set('Message-ID', "<$i\@example.com>");
$mime->header_set('Subject', "subject = $i");
ok($v2w->add($mime), "add msg $i OK");
}
-$v2w->barrier;
+
+my $epoch_max = $v2w->{epoch_max};
+ok($epoch_max > 0, "multiple epochs");
+$v2w->done;
my %opts = (
LocalAddr => '127.0.0.1',
my ($host, $port) = ($sock->sockhost, $sock->sockport);
$sock = undef;
-my @cmd = (qw(git clone --mirror -q), "http://$host:$port/v2/0",
- "$tmpdir/m/git/0.git");
+my @cmd;
+foreach my $i (0..$epoch_max) {
+ @cmd = (qw(git clone --mirror -q), "http://$host:$port/v2/$i",
+ "$tmpdir/m/git/$i.git");
-is(system(@cmd), 0, 'cloned OK');
-ok(-d "$tmpdir/m/git/0.git", 'mirror OK');;
+ is(system(@cmd), 0, 'cloned OK');
+ ok(-d "$tmpdir/m/git/$i.git", 'mirror OK');
+}
@cmd = ("$script-init", '-V2', 'm', "$tmpdir/m", 'http://example.com/m',
'alt@example.com');
$mibx = PublicInbox::Inbox->new($mibx);
is_deeply([$mibx->mm->minmax], [$ibx->mm->minmax], 'index synched minmax');
+$v2w->{rotate_bytes} = $old_rotate_bytes;
for my $i (10..15) {
$mime->header_set('Message-ID', "<$i\@example.com>");
$mime->header_set('Subject', "subject = $i");
ok($v2w->add($mime), "add msg $i OK");
}
$v2w->barrier;
-is(system('git', "--git-dir=$tmpdir/m/git/0.git", 'fetch', '-q'), 0,
- 'fetch successful');
+
+sub fetch_each_epoch {
+ foreach my $i (0..$epoch_max) {
+ my $dir = "$tmpdir/m/git/$i.git";
+ is(system('git', "--git-dir=$dir", 'fetch', '-q'), 0,
+ 'fetch successful');
+ }
+}
+
+fetch_each_epoch();
my $mset = $mibx->search->reopen->query('m:15@example.com', {mset => 1});
is(scalar($mset->items), 0, 'new message not found in mirror, yet');
$mset = $ibx->search->reopen->query('m:10@example.com', {mset => 1});
is(scalar($mset->items), 0, 'purged message gone from origin');
-is(system('git', "--git-dir=$tmpdir/m/git/0.git", 'fetch', '-q'), 0,
- 'fetch successful');
+fetch_each_epoch();
{
open my $err, '+>', "$tmpdir/index-err" or die "open: $!";
my $ipid = fork;
is_deeply(\@warn, [], 'no warnings from index_sync after purge');
}
-$v2w->done;
+# deletes happen in a different fetch window
+{
+ $mset = $mibx->search->reopen->query('m:1@example.com', {mset => 1});
+ is(scalar($mset->items), 1, '1@example.com visible in mirror');
+ $mime->header_set('Message-ID', '<1@example.com>');
+ $mime->header_set('Subject', 'subject = 1');
+ ok($v2w->remove($mime), 'removed <1@example.com> from source');
+ $v2w->done;
+ fetch_each_epoch();
+
+ open my $err, '+>', "$tmpdir/index-err" or die "open: $!";
+ my $ipid = fork;
+ if ($ipid == 0) {
+ dup2(fileno($err), 2) or die "dup2 failed: $!";
+ exec("$script-index", "$tmpdir/m");
+ die "exec fail: $!";
+ }
+ ok($ipid, 'running index');
+ is(waitpid($ipid, 0), $ipid, 'index done');
+ is($?, 0, 'no error from index');
+ ok(seek($err, 0, 0), 'rewound stderr');
+ $err = eval { local $/; <$err> };
+ is($err, '', 'no errors reported by index');
+ $mset = $mibx->search->reopen->query('m:1@example.com', {mset => 1});
+ is(scalar($mset->items), 0, '1@example.com no longer visible in mirror');
+}
+
ok(kill('TERM', $pid), 'killed httpd');
$pid = undef;
waitpid(-1, 0);