my ($self, $mid) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare_cached(<<'');
-INSERT OR IGNORE INTO msgmap (mid) VALUES (?)
+INSERT INTO msgmap (mid) VALUES (?)
- return if $sth->execute($mid) == 0;
+ return unless eval { $sth->execute($mid) };
my $num = $dbh->last_insert_id(undef, undef, 'msgmap', 'num');
$self->num_highwater($num) if defined($num);
$num;
require PublicInbox::Git;
require PublicInbox::SearchThread;
our $LIM = 200;
+my %rmap_inc;
sub noop {}
*noop;
}
+# shorten "/full/path/to/Foo/Bar.pm" to "Foo/Bar.pm" so error
+# messages don't reveal FS layout info in case people use non-standard
+# installation paths
+sub path2inc ($) {
+ my $full = $_[0];
+ if (my $short = $rmap_inc{$full}) {
+ return $short;
+ } elsif (!scalar(keys %rmap_inc) && -e $full) {
+ %rmap_inc = map {; "$INC{$_}" => $_ } keys %INC;
+ # fall back to basename as last resort
+ $rmap_inc{$full} // (split('/', $full))[-1];
+ } else {
+ $full;
+ }
+}
+
sub err_txt {
my ($ctx, $err) = @_;
my $u = $ctx->{-inbox}->base_url($ctx->{env}) . '_/text/help/';
$err =~ s/^\s*Exception:\s*//; # bad word to show users :P
+ $err =~ s!(\S+)!path2inc($1)!sge;
$err = ascii_html($err);
"\nBad query: <b>$err</b>\n" .
qq{See <a\nhref="$u">$u</a> for help on using search};
$dig->hexdigest;
}
-sub manifest_add ($$;$) {
- my ($manifest, $ibx, $epoch) = @_;
+sub manifest_add ($$;$$) {
+ my ($manifest, $ibx, $epoch, $default_desc) = @_;
my $url_path = "/$ibx->{name}";
my $git_dir = $ibx->{mainrepo};
if (defined $epoch) {
$owner = undef if $owner eq '';
$desc = 'Unnamed repository' if $desc eq '';
+ # templates/hooks--update.sample and git-multimail in git.git
+ # only match "Unnamed repository", not the full contents of
+ # templates/this--description in git.git
+ if ($desc =~ /\AUnnamed repository/) {
+ $desc = "$default_desc [epoch $epoch]" if defined($epoch);
+ }
+
my $reference;
chomp(my $alt = try_cat("$git_dir/objects/info/alternates"));
if ($alt) {
my $manifest = { -abs2urlpath => {}, -mtime => 0 };
for my $ibx (@$list) {
if (defined(my $max = $ibx->max_git_epoch)) {
+ my $desc = $ibx->description;
for my $epoch (0..$max) {
- manifest_add($manifest, $ibx, $epoch);
+ manifest_add($manifest, $ibx, $epoch, $desc);
}
} else {
manifest_add($manifest, $ibx);
my $ret = $d->mid_insert('a@b');
is($ret, undef, 'duplicate mid_insert in undef result');
is($d->num_for('a@b'), $mid2num{'a@b'}, 'existing number not clobbered');
+my $next = (sort(keys %num2mid))[-1];
+is($d->mid_insert('ok@unique'), $next + 1,
+ 'got expected num after failing mid_insert');
foreach my $n (keys %num2mid) {
is($d->mid_for($n), $num2mid{$n}, "num:$n maps correctly");
$mime->header_set('References', '<zz-mid@b>');
ok($im->add($mime), 'message with multiple Message-ID');
$im->done;
+ my ($total, undef) = $ibx->over->recent;
+ is($ibx->mm->num_highwater, $total, 'got expected highwater value');
my $srch = $ibx->search;
my $mset1 = $srch->reopen->query('m:abcde@1', { mset => 1 });
is($mset1->size, 1, 'message found by first MID');
$res->{headers}->{'last-modified'},
'modified field and Last-Modified header match');
- ok($manifest->{'/v2/git/0.git'}, 'v2 epoch appeared');
+ ok(my $v2epoch0 = $manifest->{'/v2/git/0.git'}, 'v2 epoch 0 appeared');
+ like($v2epoch0->{description}, qr/ \[epoch 0\]\z/,
+ 'epoch 0 in description');
+ ok(my $v2epoch1 = $manifest->{'/v2/git/1.git'}, 'v2 epoch 1 appeared');
+ like($v2epoch1->{description}, qr/ \[epoch 1\]\z/,
+ 'epoch 1 in description');
}
my $pid;