user/dev discussion of public-inbox itself
 help / color / Atom feed
e25b827f7cfa3f71012d82e99eaa962441440abe blob 3831 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
# Copyright (C) 2019 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use warnings;
use Test::More;
use PublicInbox::MIME;
use PublicInbox::Inbox;
use File::Temp qw/tempdir/;
require './t/common.perl';
require_git(2.6);
my $this = (split('/', __FILE__))[-1];

# TODO: remove Search::Xapian as a requirement for basic
foreach my $mod (qw(DBD::SQLite Search::Xapian)) {
	eval "require $mod";
	plan skip_all => "$mod missing for $this" if $@;
}

my $path = 'blib/script';
my $index = "$path/public-inbox-index";

my $mime = PublicInbox::MIME->create(
	header => [
		From => 'a@example.com',
		To => 'test@example.com',
		Subject => 'this is a subject',
		Date => 'Fri, 02 Oct 1993 00:00:00 +0000',
	],
	body => "hello world\n",
);

sub import_index_incremental {
	my ($v, $level) = @_;
	my $tmpdir = tempdir("pi-$this-tmp-XXXXXX", TMPDIR => 1, CLEANUP => 1);
	my $ibx = PublicInbox::Inbox->new({
		mainrepo => "$tmpdir/testbox",
		name => "$this-$v",
		version => $v,
		-primary_address => 'test@example.com',
		indexlevel => $level,
	});
	my $cls = "PublicInbox::V${v}Writable";
	use_ok $cls;
	my $im = $cls->new($ibx, {nproc=>1});
	$mime->header_set('Message-ID', '<m@1>');
	ok($im->add($mime), 'first message added');
	$im->done;

	# index master (required for v1)
	is(system($index, $ibx->{mainrepo}), 0, 'index master OK');
	my $ro_master = PublicInbox::Inbox->new({mainrepo => $ibx->{mainrepo}});
	my ($nr, $msgs) = $ro_master->recent;
	is($nr, 1, 'only one message in master, so far');
	is($msgs->[0]->{mid}, 'm@1', 'first message in master indexed');

	# clone
	my @cmd = (qw(git clone --mirror -q));
	my $mirror = "$tmpdir/mirror-$v";
	if ($v == 1) {
		push @cmd, $ibx->{mainrepo}, $mirror;
	} else {
		push @cmd, "$ibx->{mainrepo}/git/0.git", "$mirror/git/0.git";
	}
	my $fetch_dir = $cmd[-1];
	is(system(@cmd), 0, "v$v clone OK");

	# inbox init
	local $ENV{PI_CONFIG} = "$tmpdir/.picfg";
	@cmd = ("$path/public-inbox-init", '-L', $level,
		'mirror', $mirror, '//example.com/test', 'test@example.com');
	push @cmd, '-V2' if $v == 2;
	is(system(@cmd), 0, "v$v init OK");

	# index mirror
	is(system($index, $mirror), 0, "v$v index mirror OK");

	# read-only access
	my $ro_mirror = PublicInbox::Inbox->new({mainrepo => $mirror});
	($nr, $msgs) = $ro_mirror->recent;
	is($nr, 1, 'only one message, so far');
	is($msgs->[0]->{mid}, 'm@1', 'read first message');

	# update master
	$mime->header_set('Message-ID', '<m@2>');
	ok($im->add($mime), '2nd message added');
	$im->done;

	# mirror updates
	is(system('git', "--git-dir=$fetch_dir", qw(fetch -q)), 0, 'fetch OK');
	is(system($index, $mirror), 0, "v$v index mirror again OK");
	($nr, $msgs) = $ro_mirror->recent;
	is($nr, 2, '2nd message seen in mirror');
	is_deeply([sort { $a cmp $b } map { $_->{mid} } @$msgs],
		['m@1','m@2'], 'got both messages in mirror');

	# incremental index master (required for v1)
	is(system($index, $ibx->{mainrepo}), 0, 'index master OK');
	($nr, $msgs) = $ro_master->recent;
	is($nr, 2, '2nd message seen in master');
	is_deeply([sort { $a cmp $b } map { $_->{mid} } @$msgs],
		['m@1','m@2'], 'got both messages in master');

	# remove message from master
	ok($im->remove($mime), '2nd message removed');
	$im->done;

	# sync the mirror
	is(system('git', "--git-dir=$fetch_dir", qw(fetch -q)), 0, 'fetch OK');
	is(system($index, $mirror), 0, "v$v index mirror again OK");
	($nr, $msgs) = $ro_mirror->recent;
	is($nr, 1, '2nd message gone from mirror');
	is_deeply([map { $_->{mid} } @$msgs], ['m@1'],
		'message unavailable in mirror');
}

# we can probably cull some other tests and put full/medium tests, here
for my $level (qw(basic)) {
	for my $v (1..2) {
		subtest("v$v indexlevel=$level" => sub {
			import_index_incremental($v, $level);
		})
	}
}

done_testing();
debug log:

solving e25b827 ...
found e25b827 in https://80x24.org/public-inbox.git

user/dev discussion of public-inbox itself

Archives are clonable:
	git clone --mirror https://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta
	nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.org/gmane.mail.public-inbox.general

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox