about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-09-11 07:26:39 +0000
committerEric Wong <e@80x24.org>2023-09-11 18:51:02 +0000
commit22c5b815cc4105228fd34cdaa2826dca70552a3e (patch)
treefb5fc859c7c18729d817a1664921db7b40917558
parentbdf6cb8ca93a6aec7065b4ba8f3f4b1f58f427b4 (diff)
downloadpublic-inbox-22c5b815cc4105228fd34cdaa2826dca70552a3e.tar.gz
The Xapian SWIG bindings are favored by Xapian upstream for
ease-of-maintenance compared to the XS version.  While Debian
lags on this front, the SWIG bindings are widely available
on all *BSDs.
-rw-r--r--Documentation/design_www.txt2
-rw-r--r--Documentation/public-inbox-config.pod4
-rw-r--r--Documentation/public-inbox-extindex.pod2
-rw-r--r--Documentation/public-inbox-index.pod4
-rw-r--r--Documentation/public-inbox-overview.pod2
-rw-r--r--Documentation/technical/data_structures.txt2
-rw-r--r--INSTALL4
-rwxr-xr-xci/deps.perl5
-rwxr-xr-xci/profiles.perl6
-rw-r--r--lib/PublicInbox/Admin.pm8
-rw-r--r--lib/PublicInbox/AdminEdit.pm4
-rw-r--r--lib/PublicInbox/Feed.pm2
-rw-r--r--lib/PublicInbox/Search.pm11
-rw-r--r--lib/PublicInbox/TestCommon.pm4
-rwxr-xr-xscript/public-inbox-cindex2
-rwxr-xr-xscript/public-inbox-index3
-rw-r--r--t/altid.t2
-rw-r--r--t/altid_v2.t2
-rw-r--r--t/cindex.t2
-rw-r--r--t/convert-compact.t2
-rw-r--r--t/extindex-psgi.t2
-rw-r--r--t/extsearch.t2
-rw-r--r--t/imapd.t2
-rw-r--r--t/index-git-times.t2
-rw-r--r--t/indexlevels-mirror.t2
-rw-r--r--t/init.t2
-rw-r--r--t/lei-externals.t2
-rw-r--r--t/lei-import-nntp.t2
-rw-r--r--t/lei-p2q.t2
-rw-r--r--t/lei-q-thread.t2
-rw-r--r--t/lei-tag.t2
-rw-r--r--t/lei_overview.t2
-rw-r--r--t/lei_store.t2
-rw-r--r--t/lei_xsearch.t2
-rw-r--r--t/mda_filter_rubylang.t2
-rw-r--r--t/miscsearch.t2
-rw-r--r--t/net_reader-imap.t2
-rw-r--r--t/nntpd.t12
-rw-r--r--t/psgi_mount.t2
-rw-r--r--t/psgi_multipart_not.t2
-rw-r--r--t/psgi_search.t2
-rw-r--r--t/psgi_v2.t2
-rw-r--r--t/replace.t2
-rw-r--r--t/search-thr-index.t2
-rw-r--r--t/search.t2
-rw-r--r--t/solver_git.t2
-rw-r--r--t/v1-add-remove-add.t2
-rw-r--r--t/v1reindex.t2
-rw-r--r--t/v2-add-remove-add.t2
-rw-r--r--t/v2mda.t2
-rw-r--r--t/v2mirror.t2
-rw-r--r--t/v2reindex.t2
-rw-r--r--t/v2writable.t2
-rw-r--r--t/watch_filter_rubylang.t2
-rw-r--r--t/watch_maildir_v2.t2
-rw-r--r--t/watch_multiple_headers.t2
-rw-r--r--t/xap_helper.t2
-rw-r--r--t/xcpdb-reshard.t2
-rw-r--r--xt/create-many-inboxes.t2
-rw-r--r--xt/solver.t2
60 files changed, 81 insertions, 82 deletions
diff --git a/Documentation/design_www.txt b/Documentation/design_www.txt
index 68488b1f..a0003f99 100644
--- a/Documentation/design_www.txt
+++ b/Documentation/design_www.txt
@@ -7,7 +7,7 @@ URL and anchor naming
 /$INBOX/?r=$GIT_COMMIT                 -> HTML only
 /$INBOX/new.atom                       -> Atom feed
 
-#### Optional, relies on Search::Xapian (or Xapian SWIG binding)
+#### Optional, relies on Xapian
 /$INBOX/$MESSAGE_ID/t/                 -> HTML content of thread (nested)
 /$INBOX/$MESSAGE_ID/T/                 -> HTML content of thread (flat)
         anchors:
diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod
index d2389abc..871ac6c5 100644
--- a/Documentation/public-inbox-config.pod
+++ b/Documentation/public-inbox-config.pod
@@ -125,8 +125,8 @@ C<basic> only requires L<DBD::SQLite(3pm)> and provides all
 NNTP functionality along with thread-awareness in the WWW
 interface.
 
-C<medium> requires L<Search::Xapian(3pm)> to provide full-text
-term search functionality in the WWW UI.
+C<medium> requires L<Xapian(3pm)> or L<Search::Xapian(3pm)> to provide
+full-text term search functionality in the WWW UI.
 
 C<full> also includes positional information used by Xapian to
 allow for searching for phrases using quoted text.
diff --git a/Documentation/public-inbox-extindex.pod b/Documentation/public-inbox-extindex.pod
index a5f699c5..fbb12fe9 100644
--- a/Documentation/public-inbox-extindex.pod
+++ b/Documentation/public-inbox-extindex.pod
@@ -13,7 +13,7 @@ public-inbox-extindex [OPTIONS] [EXTINDEX_DIR] --all
 public-inbox-extindex creates and updates an external search and
 overview database used by the read-only public-inbox PSGI (HTTP),
 NNTP, and IMAP interfaces.  This requires either the
-L<Search::Xapian> XS bindings OR the L<Xapian> SWIG bindings,
+L<Xapian> SWIG bindings OR or L<Search::Xapian> XS bindings
 along with L<DBD::SQLite> and L<DBI> Perl modules.
 
 =head1 OPTIONS
diff --git a/Documentation/public-inbox-index.pod b/Documentation/public-inbox-index.pod
index 11108f78..14f157a5 100644
--- a/Documentation/public-inbox-index.pod
+++ b/Documentation/public-inbox-index.pod
@@ -13,8 +13,8 @@ public-inbox-index [OPTIONS] --all
 public-inbox-index creates and updates the search, overview and
 NNTP article number database used by the read-only public-inbox
 HTTP and NNTP interfaces.  Currently, this requires
-L<DBD::SQLite> and L<DBI> Perl modules.  L<Search::Xapian>
-is optional, only to support the PSGI search interface.
+L<DBD::SQLite> and L<DBI> Perl modules.  L<Xapian> (or L<Search::Xapian>)
+are optional, only to support the PSGI search interface.
 
 Once the initial indices are created by public-inbox-index,
 L<public-inbox-mda(1)> and L<public-inbox-watch(1)> will
diff --git a/Documentation/public-inbox-overview.pod b/Documentation/public-inbox-overview.pod
index d4318576..35917ccc 100644
--- a/Documentation/public-inbox-overview.pod
+++ b/Documentation/public-inbox-overview.pod
@@ -48,7 +48,7 @@ that inbox.  The instructions are roughly:
 
   # Optional but strongly recommended for hosting HTTP
   # (and required for NNTP)
-  # enable overview (requires DBD::SQLite) and, if Search::Xapian is
+  # enable overview (requires DBD::SQLite) and, if Xapian is
   # available, search:
   public-inbox-index INBOX_DIR
 
diff --git a/Documentation/technical/data_structures.txt b/Documentation/technical/data_structures.txt
index 5ed21882..11f78041 100644
--- a/Documentation/technical/data_structures.txt
+++ b/Documentation/technical/data_structures.txt
@@ -117,7 +117,7 @@ Per-inbox classes
 
 * PublicInbox::Search - Xapian read-only interface
   Common abbreviation: $srch, $ibx->search
-  Used everywhere if Search::Xapian (or Xapian.pm) is available.
+  Used everywhere if Xapian is available.
 
   Each indexed inbox has one of these, see
   public-inbox-v1-format(5) and public-inbox-v2-format(5)
diff --git a/INSTALL b/INSTALL
index 617801cc..13a1bdc6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -67,8 +67,8 @@ Numerous optional modules are likely to be useful as well:
                                    rpm: perl-DBD-SQLite
                                    (for v2, IMAP, NNTP, or gzipped mboxes)
 
-- Search::Xapian or Xapian(.pm)    deb: libsearch-xapian-perl
-                                   pkg: p5-Search-Xapian OR p5-Xapian (FreeBSD)
+- Xapian(.pm) (or Search::Xapian)  deb: libsearch-xapian-perl
+                                   pkg: p5-Xapian (FreeBSD, NetBSD)
                                         xapian-bindings-perl (OpenBSD)
                                    rpm: perl-Search-Xapian
                                    (HTTP and IMAP search)
diff --git a/ci/deps.perl b/ci/deps.perl
index 6bc38735..3fa8f642 100755
--- a/ci/deps.perl
+++ b/ci/deps.perl
@@ -39,7 +39,7 @@ my $profiles = {
                 Plack
                 Plack::Test
                 Plack::Middleware::ReverseProxy
-                Search::Xapian
+                Xapian
                 Socket6
                 highlight.pm
                 xapian-tools
@@ -85,7 +85,8 @@ my $non_auto = {
                 deb => 'libplack-perl',
                 pkg => 'p5-Plack',
         },
-        'Search::Xapian' => {
+        'Xapian' => {
+                deb => 'libsearch-xapian-perl',
                 pkg => [qw(xapian-core p5-Xapian)],
                 pkg_add => [qw(xapian-core xapian-bindings-perl)],
                 pkgin => [qw(xapian p5-Xapian)],
diff --git a/ci/profiles.perl b/ci/profiles.perl
index 720cd24e..e18f01fa 100755
--- a/ci/profiles.perl
+++ b/ci/profiles.perl
@@ -70,7 +70,7 @@ my $PKG_FMT = do {
 # these package group names and '-' syntax are passed to ci/deps.perl
 my $TASKS = do {
         if ($ID =~ /\A(?:free|net|open)bsd\z/) { <<EOM
-all devtest Search::Xapian-
+all devtest Xapian-
 all devtest IO::KQueue-
 all devtest IO::KQueue
 all devtest Inline::C-
@@ -78,7 +78,7 @@ all devtest Inline::C
 EOM
         } elsif ($ID eq 'debian') { <<EOM
 all devtest
-all devtest Search::Xapian-
+all devtest Xapian-
 all devtest-
 v2essential
 essential
@@ -87,7 +87,7 @@ EOM
         } elsif ($ID eq 'centos') { <<EOM
 v2essential devtest
 essential devtest
-all Search::Xapian-
+all Xapian-
 EOM
         } else { die "TODO: support ID=$ID VERSION_ID=$VERSION_ID" }
 };
diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm
index 72ac9420..3140afad 100644
--- a/lib/PublicInbox/Admin.pm
+++ b/lib/PublicInbox/Admin.pm
@@ -185,13 +185,13 @@ my @over_mod = qw(DBD::SQLite DBI);
 my %mod_groups = (
         -index => [ @base_mod, @over_mod ],
         -base => \@base_mod,
-        -search => [ @base_mod, @over_mod, 'Search::Xapian' ],
+        -search => [ @base_mod, @over_mod, 'Xapian' ],
 );
 
 sub scan_ibx_modules ($$) {
         my ($mods, $ibx) = @_;
         if (!$ibx->{indexlevel} || $ibx->{indexlevel} ne 'basic') {
-                $mods->{'Search::Xapian'} = 1;
+                $mods->{'Xapian'} = 1;
         } else {
                 $mods->{$_} = 1 foreach @over_mod;
         }
@@ -203,10 +203,10 @@ sub check_require {
         while (my $mod = shift @mods) {
                 if (my $groups = $mod_groups{$mod}) {
                         push @mods, @$groups;
-                } elsif ($mod eq 'Search::Xapian') {
+                } elsif ($mod eq 'Xapian') {
                         require PublicInbox::Search;
                         PublicInbox::Search::load_xapian() or
-                                $err->{'Search::Xapian || Xapian'} = $@;
+                                $err->{'Xapian || Search::Xapian'} = $@;
                 } else {
                         eval "require $mod";
                         $err->{$mod} = $@ if $@;
diff --git a/lib/PublicInbox/AdminEdit.pm b/lib/PublicInbox/AdminEdit.pm
index c8c3d3e8..654141a7 100644
--- a/lib/PublicInbox/AdminEdit.pm
+++ b/lib/PublicInbox/AdminEdit.pm
@@ -19,11 +19,11 @@ sub check_editable ($) {
                 }
 
                 # Undefined indexlevel, so `full'...
-                # Search::Xapian exists and the DB can be read, at least, fine
+                # Xapian exists and the DB can be read, at least, fine
                 $ibx->search and next;
 
                 # it's possible for a Xapian directory to exist,
-                # but Search::Xapian to go missing/broken.
+                # but Xapian to go missing/broken.
                 # Make sure it's purged in that case:
                 $ibx->over or die "no over.sqlite3 in $ibx->{inboxdir}\n";
 
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm
index 69a92f8b..225565f4 100644
--- a/lib/PublicInbox/Feed.pm
+++ b/lib/PublicInbox/Feed.pm
@@ -7,7 +7,7 @@ use strict;
 use v5.10.1;
 use PublicInbox::View;
 use PublicInbox::WwwAtomStream;
-use PublicInbox::Smsg; # this loads w/o Search::Xapian
+use PublicInbox::Smsg; # this loads w/o Xapian
 
 sub generate_i {
         my ($ctx) = @_;
diff --git a/lib/PublicInbox/Search.pm b/lib/PublicInbox/Search.pm
index 2e784646..d7a6f9d7 100644
--- a/lib/PublicInbox/Search.pm
+++ b/lib/PublicInbox/Search.pm
@@ -59,7 +59,7 @@ use PublicInbox::Smsg;
 use PublicInbox::Over;
 our $QP_FLAGS;
 our %X = map { $_ => 0 } qw(BoolWeight Database Enquire QueryParser Stem Query);
-our $Xap; # 'Search::Xapian' or 'Xapian'
+our $Xap; # 'Xapian' or 'Search::Xapian'
 our $NVRP; # '$Xap::'.('NumberValueRangeProcessor' or 'NumberRangeProcessor')
 
 # ENQ_DESCENDING and ENQ_ASCENDING weren't in SWIG Xapian.pm prior to 1.4.16,
@@ -78,10 +78,8 @@ our @MAIL_NRP;
 
 sub load_xapian () {
         return 1 if defined $Xap;
-        # n.b. PI_XAPIAN is intended for development use only.  We still
-        # favor Search::Xapian since that's what's available in current
-        # Debian stable (10.x) and derived distros.
-        for my $x (($ENV{PI_XAPIAN} // 'Search::Xapian'), 'Xapian') {
+        # n.b. PI_XAPIAN is intended for development use only
+        for my $x (($ENV{PI_XAPIAN} // 'Xapian'), 'Search::Xapian') {
                 eval "require $x";
                 next if $@;
 
@@ -94,8 +92,7 @@ sub load_xapian () {
 
                 # NumberRangeProcessor was added in Xapian 1.3.6,
                 # NumberValueRangeProcessor was removed for 1.5.0+,
-                # favor the older /Value/ variant since that's what our
-                # (currently) preferred Search::Xapian supports
+                # continue with the older /Value/ variant for now...
                 $NVRP = $x.'::'.($x eq 'Xapian' && $xver ge v1.5 ?
                         'NumberRangeProcessor' : 'NumberValueRangeProcessor');
                 $X{$_} = $Xap.'::'.$_ for (keys %X);
diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm
index b2774f58..ec300b3f 100644
--- a/lib/PublicInbox/TestCommon.pm
+++ b/lib/PublicInbox/TestCommon.pm
@@ -134,7 +134,7 @@ sub require_mods {
         while (my $mod = shift(@mods)) {
                 if ($mod eq 'lei') {
                         require_git(2.6, $maybe ? $maybe : ());
-                        push @mods, qw(DBD::SQLite Search::Xapian +SCM_RIGHTS);
+                        push @mods, qw(DBD::SQLite Xapian +SCM_RIGHTS);
                         $mod = 'json'; # fall-through
                 }
                 if ($mod eq 'json') {
@@ -150,7 +150,7 @@ sub require_mods {
                         push @mods, qw(DBD::SQLite);
                         next;
                 }
-                if ($mod eq 'Search::Xapian') {
+                if ($mod eq 'Xapian') {
                         if (eval { require PublicInbox::Search } &&
                                 PublicInbox::Search::load_xapian()) {
                                 next;
diff --git a/script/public-inbox-cindex b/script/public-inbox-cindex
index 0526434c..b5fe9cf8 100755
--- a/script/public-inbox-cindex
+++ b/script/public-inbox-cindex
@@ -46,7 +46,7 @@ require PublicInbox::Admin;
 PublicInbox::Admin::do_chdir(delete $opt->{C});
 my $cfg = PublicInbox::Config->new;
 my $cidx_dir = $opt->{d};
-PublicInbox::Admin::require_or_die('Search::Xapian');
+PublicInbox::Admin::require_or_die('Xapian');
 PublicInbox::Admin::progress_prepare($opt);
 my $env = PublicInbox::Admin::index_prepare($opt, $cfg);
 %ENV = (%ENV, %$env) if $env;
diff --git a/script/public-inbox-index b/script/public-inbox-index
index f29e7c3c..74232ebf 100755
--- a/script/public-inbox-index
+++ b/script/public-inbox-index
@@ -113,8 +113,7 @@ The following inboxes are unconfigured and will not be updated in
 @$update_extindex:\n@eidx_unconfigured
 EOF
 
-# "Search::Xapian" includes SWIG "Xapian", too:
-$opt->{compact} = 0 if !$mods->{'Search::Xapian'};
+$opt->{compact} = 0 if !$mods->{'Xapian'}; # (or old Search::Xapian)
 
 PublicInbox::Admin::require_or_die(keys %$mods);
 my $env = PublicInbox::Admin::index_prepare($opt, $cfg);
diff --git a/t/altid.t b/t/altid.t
index 3ce08a6a..2692029e 100644
--- a/t/altid.t
+++ b/t/altid.t
@@ -5,7 +5,7 @@ use strict;
 use v5.10.1;
 use PublicInbox::TestCommon;
 use PublicInbox::Eml;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::Msgmap';
 use_ok 'PublicInbox::SearchIdx';
 my ($tmpdir, $for_destroy) = tmpdir();
diff --git a/t/altid_v2.t b/t/altid_v2.t
index c62252c1..6bc90453 100644
--- a/t/altid_v2.t
+++ b/t/altid_v2.t
@@ -6,7 +6,7 @@ use v5.10.1;
 use PublicInbox::TestCommon;
 use PublicInbox::Eml;
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require PublicInbox::Msgmap;
 my $another = 'another-nntp.sqlite3';
 my $altid = [ "serial:gmane:file=$another" ];
diff --git a/t/cindex.t b/t/cindex.t
index 9f57bd83..dbbccbb0 100644
--- a/t/cindex.t
+++ b/t/cindex.t
@@ -5,7 +5,7 @@ use v5.12;
 use PublicInbox::TestCommon;
 use Cwd qw(getcwd abs_path);
 use List::Util qw(sum);
-require_mods(qw(json Search::Xapian));
+require_mods(qw(json Xapian));
 use_ok 'PublicInbox::CodeSearchIdx';
 require PublicInbox::Import;
 my ($tmp, $for_destroy) = tmpdir();
diff --git a/t/convert-compact.t b/t/convert-compact.t
index bad6560e..1ac3517d 100644
--- a/t/convert-compact.t
+++ b/t/convert-compact.t
@@ -7,7 +7,7 @@ use PublicInbox::Eml;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 have_xapian_compact;
 my ($tmpdir, $for_destroy) = tmpdir();
 my $ibx = create_inbox 'v1', indexlevel => 'medium', tmpdir => "$tmpdir/v1",
diff --git a/t/extindex-psgi.t b/t/extindex-psgi.t
index f10ffbb6..f71210a5 100644
--- a/t/extindex-psgi.t
+++ b/t/extindex-psgi.t
@@ -8,7 +8,7 @@ use PublicInbox::Config;
 use File::Copy qw(cp);
 use IO::Handle ();
 require_git(2.6);
-require_mods(qw(json DBD::SQLite Search::Xapian
+require_mods(qw(json DBD::SQLite Xapian
                 HTTP::Request::Common Plack::Test URI::Escape Plack::Builder));
 use_ok($_) for (qw(HTTP::Request::Common Plack::Test));
 use IO::Uncompress::Gunzip qw(gunzip);
diff --git a/t/extsearch.t b/t/extsearch.t
index 8cbd26f0..545330aa 100644
--- a/t/extsearch.t
+++ b/t/extsearch.t
@@ -7,7 +7,7 @@ use PublicInbox::Config;
 use PublicInbox::InboxWritable;
 use Fcntl qw(:seek);
 require_git(2.6);
-require_mods(qw(json DBD::SQLite Search::Xapian));
+require_mods(qw(json DBD::SQLite Xapian));
 require PublicInbox::Search;
 use_ok 'PublicInbox::ExtSearch';
 use_ok 'PublicInbox::ExtSearchIdx';
diff --git a/t/imapd.t b/t/imapd.t
index 98de40d4..9606291e 100644
--- a/t/imapd.t
+++ b/t/imapd.t
@@ -21,7 +21,7 @@ my $first_range = '0';
 
 my $level = 'basic';
 SKIP: {
-        require_mods('Search::Xapian', 1);
+        require_mods('Xapian', 1);
         $level = 'medium';
 };
 
diff --git a/t/index-git-times.t b/t/index-git-times.t
index 96886c5e..eac2d650 100644
--- a/t/index-git-times.t
+++ b/t/index-git-times.t
@@ -10,7 +10,7 @@ use PublicInbox::Import;
 use File::Path qw(remove_tree);
 require PublicInbox::InboxWritable;
 
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::Over';
 
 my ($tmpdir, $for_destroy) = tmpdir();
diff --git a/t/indexlevels-mirror.t b/t/indexlevels-mirror.t
index 62411671..c852f72c 100644
--- a/t/indexlevels-mirror.t
+++ b/t/indexlevels-mirror.t
@@ -168,7 +168,7 @@ my $import_index_incremental = sub {
 $import_index_incremental->($PI_TEST_VERSION, 'basic', $mime);
 
 SKIP: {
-        require_mods(qw(Search::Xapian), 2);
+        require_mods(qw(Xapian), 2);
         foreach my $l (qw(medium full)) {
                 $import_index_incremental->($PI_TEST_VERSION, $l, $mime);
         }
diff --git a/t/init.t b/t/init.t
index 82a2a443..abe3a372 100644
--- a/t/init.t
+++ b/t/init.t
@@ -121,7 +121,7 @@ sub quiet_fail {
 }
 
 SKIP: {
-        require_mods(qw(DBD::SQLite Search::Xapian), 2);
+        require_mods(qw(DBD::SQLite Xapian), 2);
         require_git(2.6, 2);
         use_ok 'PublicInbox::Msgmap';
         local $ENV{PI_DIR} = "$tmpdir/.public-inbox/";
diff --git a/t/lei-externals.t b/t/lei-externals.t
index 284be1b9..aeaf8ee4 100644
--- a/t/lei-externals.t
+++ b/t/lei-externals.t
@@ -4,7 +4,7 @@
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 use Fcntl qw(SEEK_SET);
 require_git 2.6;
-require_mods(qw(json DBD::SQLite Search::Xapian));
+require_mods(qw(json DBD::SQLite Xapian));
 use POSIX qw(WTERMSIG WIFSIGNALED SIGPIPE);
 
 my @onions = map { "http://$_.onion/meta/" } qw(
diff --git a/t/lei-import-nntp.t b/t/lei-import-nntp.t
index c3ee06a2..14c644e0 100644
--- a/t/lei-import-nntp.t
+++ b/t/lei-import-nntp.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 require_git 2.6;
-require_mods(qw(lei json DBD::SQLite Search::Xapian Net::NNTP));
+require_mods(qw(lei json DBD::SQLite Xapian Net::NNTP));
 my ($ro_home, $cfg_path) = setup_public_inboxes;
 my ($tmpdir, $for_destroy) = tmpdir;
 my $sock = tcp_server;
diff --git a/t/lei-p2q.t b/t/lei-p2q.t
index bf40a43b..44f37d19 100644
--- a/t/lei-p2q.t
+++ b/t/lei-p2q.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 require_git 2.6;
-require_mods(qw(json DBD::SQLite Search::Xapian));
+require_mods(qw(json DBD::SQLite Xapian));
 
 test_lei(sub {
         ok(!lei(qw(p2q this-better-cause-format-patch-to-fail)),
diff --git a/t/lei-q-thread.t b/t/lei-q-thread.t
index 26d06eec..72d3a565 100644
--- a/t/lei-q-thread.t
+++ b/t/lei-q-thread.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 require_git 2.6;
-require_mods(qw(json DBD::SQLite Search::Xapian));
+require_mods(qw(json DBD::SQLite Xapian));
 use PublicInbox::LeiToMail;
 my ($ro_home, $cfg_path) = setup_public_inboxes;
 test_lei(sub {
diff --git a/t/lei-tag.t b/t/lei-tag.t
index 5941cd0f..822677a7 100644
--- a/t/lei-tag.t
+++ b/t/lei-tag.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 require_git 2.6;
-require_mods(qw(json DBD::SQLite Search::Xapian));
+require_mods(qw(json DBD::SQLite Xapian));
 my ($ro_home, $cfg_path) = setup_public_inboxes;
 my $check_kw = sub {
         my ($exp, %opt) = @_;
diff --git a/t/lei_overview.t b/t/lei_overview.t
index dd9e2cad..b4181ffd 100644
--- a/t/lei_overview.t
+++ b/t/lei_overview.t
@@ -6,7 +6,7 @@ use v5.10.1;
 use Test::More;
 use PublicInbox::TestCommon;
 use POSIX qw(_exit);
-require_mods(qw(Search::Xapian DBD::SQLite));
+require_mods(qw(Xapian DBD::SQLite));
 require_ok 'PublicInbox::LeiOverview';
 
 my $ovv = bless {}, 'PublicInbox::LeiOverview';
diff --git a/t/lei_store.t b/t/lei_store.t
index 5a5e5de0..17ee0729 100644
--- a/t/lei_store.t
+++ b/t/lei_store.t
@@ -5,7 +5,7 @@ use strict;
 use v5.10.1;
 use Test::More;
 use PublicInbox::TestCommon;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require_git 2.6;
 require_ok 'PublicInbox::LeiStore';
 require_ok 'PublicInbox::ExtSearch';
diff --git a/t/lei_xsearch.t b/t/lei_xsearch.t
index fabceb41..977fb1e9 100644
--- a/t/lei_xsearch.t
+++ b/t/lei_xsearch.t
@@ -6,7 +6,7 @@ use v5.10.1;
 use List::Util qw(shuffle);
 use PublicInbox::TestCommon;
 use PublicInbox::Eml;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require PublicInbox::ExtSearchIdx;
 require_git 2.6;
 require_ok 'PublicInbox::LeiXSearch';
diff --git a/t/mda_filter_rubylang.t b/t/mda_filter_rubylang.t
index d05eec25..42fa6101 100644
--- a/t/mda_filter_rubylang.t
+++ b/t/mda_filter_rubylang.t
@@ -7,7 +7,7 @@ use PublicInbox::Eml;
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::V2Writable';
 my ($tmpdir, $for_destroy) = tmpdir();
 my $pi_config = "$tmpdir/pi_config";
diff --git a/t/miscsearch.t b/t/miscsearch.t
index 307812a4..ec837153 100644
--- a/t/miscsearch.t
+++ b/t/miscsearch.t
@@ -5,7 +5,7 @@ use strict;
 use v5.10.1;
 use Test::More;
 use PublicInbox::TestCommon;
-require_mods(qw(Search::Xapian DBD::SQLite));
+require_mods(qw(Xapian DBD::SQLite));
 use_ok 'PublicInbox::MiscSearch';
 use_ok 'PublicInbox::MiscIdx';
 
diff --git a/t/net_reader-imap.t b/t/net_reader-imap.t
index 5de8f92b..7b7f5cbe 100644
--- a/t/net_reader-imap.t
+++ b/t/net_reader-imap.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict; use v5.10.1; use PublicInbox::TestCommon;
 require_git 2.6;
-require_mods(qw(-imapd Search::Xapian Mail::IMAPClient));
+require_mods(qw(-imapd Xapian Mail::IMAPClient));
 use PublicInbox::Config;
 my ($tmpdir, $for_destroy) = tmpdir;
 my ($ro_home, $cfg_path) = setup_public_inboxes;
diff --git a/t/nntpd.t b/t/nntpd.t
index 80df4dc5..f98d638e 100644
--- a/t/nntpd.t
+++ b/t/nntpd.t
@@ -328,18 +328,20 @@ Date: Fri, 02 Oct 1993 00:00:00 +0000
         }
         my $noerr = { 2 => \(my $null) };
         SKIP: {
-                if ($INC{'Search/Xapian.pm'} && ($ENV{TEST_RUN_MODE}//2)) {
-                        skip 'Search/Xapian.pm pre-loaded (by t/run.perl?)', 1;
+                if ($INC{'Search/Xapian.pm'} || $INC{'Xapian.pm'} &&
+                                ($ENV{TEST_RUN_MODE} // 2)) {
+                        skip 'Xapian.pm pre-loaded (by t/run.perl?)', 1;
                 }
                 $lsof or skip 'lsof missing', 1;
                 my @of = xqx([$lsof, '-p', $td->{pid}], undef, $noerr);
                 skip('lsof broken', 1) if (!scalar(@of) || $?);
-                my @xap = grep m!Search/Xapian!, @of;
-                is_deeply(\@xap, [], 'Xapian not loaded in nntpd');
+                my @xap = grep m!\bXapian\b!, @of;
+                is_deeply(\@xap, [], 'Xapian not loaded in nntpd') or
+                        diag explain(\@of);
         }
         # -compact requires Xapian
         SKIP: {
-                require_mods('Search::Xapian', 2);
+                require_mods('Xapian', 2);
                 have_xapian_compact or skip 'xapian-compact missing', 2;
                 is(xsys(qw(git config), "--file=$home/.public-inbox/config",
                                 "publicinbox.$group.indexlevel", 'medium'),
diff --git a/t/psgi_mount.t b/t/psgi_mount.t
index 7c5487f3..28689f11 100644
--- a/t/psgi_mount.t
+++ b/t/psgi_mount.t
@@ -69,7 +69,7 @@ test_psgi($app, sub {
 });
 
 SKIP: {
-        require_mods(qw(DBD::SQLite Search::Xapian IO::Uncompress::Gunzip), 3);
+        require_mods(qw(DBD::SQLite Xapian IO::Uncompress::Gunzip), 3);
         require_ok 'PublicInbox::SearchIdx';
         PublicInbox::SearchIdx->new($ibx, 1)->index_sync;
         test_psgi($app, sub {
diff --git a/t/psgi_multipart_not.t b/t/psgi_multipart_not.t
index 5f4c06b7..96be1716 100644
--- a/t/psgi_multipart_not.t
+++ b/t/psgi_multipart_not.t
@@ -7,7 +7,7 @@ use PublicInbox::TestCommon;
 use PublicInbox::Eml;
 use PublicInbox::Config;
 require_git 2.6;
-my @mods = qw(DBD::SQLite Search::Xapian HTTP::Request::Common
+my @mods = qw(DBD::SQLite Xapian HTTP::Request::Common
               Plack::Test URI::Escape Plack::Builder Plack::Test);
 require_mods(@mods);
 use_ok($_) for (qw(HTTP::Request::Common Plack::Test));
diff --git a/t/psgi_search.t b/t/psgi_search.t
index 27946391..d7c9f183 100644
--- a/t/psgi_search.t
+++ b/t/psgi_search.t
@@ -8,7 +8,7 @@ use IO::Uncompress::Gunzip qw(gunzip);
 use PublicInbox::Eml;
 use PublicInbox::Config;
 use PublicInbox::Inbox;
-my @mods = qw(DBD::SQLite Search::Xapian HTTP::Request::Common Plack::Test
+my @mods = qw(DBD::SQLite Xapian HTTP::Request::Common Plack::Test
                 URI::Escape Plack::Builder);
 require_mods(@mods);
 use_ok($_) for (qw(HTTP::Request::Common Plack::Test));
diff --git a/t/psgi_v2.t b/t/psgi_v2.t
index 0a77adfb..5ccaab19 100644
--- a/t/psgi_v2.t
+++ b/t/psgi_v2.t
@@ -9,7 +9,7 @@ require_git(2.6);
 use PublicInbox::Eml;
 use PublicInbox::Config;
 use PublicInbox::MID qw(mids);
-require_mods(qw(DBD::SQLite Search::Xapian HTTP::Request::Common Plack::Test
+require_mods(qw(DBD::SQLite Xapian HTTP::Request::Common Plack::Test
                 URI::Escape Plack::Builder HTTP::Date));
 use_ok($_) for (qw(HTTP::Request::Common Plack::Test));
 use_ok 'PublicInbox::WWW';
diff --git a/t/replace.t b/t/replace.t
index 0e121399..a61c3ca0 100644
--- a/t/replace.t
+++ b/t/replace.t
@@ -187,7 +187,7 @@ test_replace(2, 'basic', $opt = { %$opt, post => \&pad_msgs });
 test_replace(2, 'basic', $opt = { %$opt, rotate_bytes => 1 });
 
 SKIP: {
-        require_mods(qw(Search::Xapian), 8);
+        require_mods(qw(Xapian), 8);
         for my $l (qw(medium)) {
                 test_replace(2, $l, {});
                 $opt = { pre => \&pad_msgs };
diff --git a/t/search-thr-index.t b/t/search-thr-index.t
index 62745dbc..aecd064f 100644
--- a/t/search-thr-index.t
+++ b/t/search-thr-index.t
@@ -7,7 +7,7 @@ use Test::More;
 use PublicInbox::TestCommon;
 use PublicInbox::MID qw(mids);
 use PublicInbox::Eml;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require PublicInbox::SearchIdx;
 require PublicInbox::Smsg;
 require PublicInbox::Inbox;
diff --git a/t/search.t b/t/search.t
index 8084c41b..636dc5cf 100644
--- a/t/search.t
+++ b/t/search.t
@@ -4,7 +4,7 @@
 use strict;
 use v5.10;
 use PublicInbox::TestCommon;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require PublicInbox::SearchIdx;
 require PublicInbox::Inbox;
 require PublicInbox::InboxWritable;
diff --git a/t/solver_git.t b/t/solver_git.t
index c210c1ee..f8cafa5e 100644
--- a/t/solver_git.t
+++ b/t/solver_git.t
@@ -7,7 +7,7 @@ use Cwd qw(abs_path);
 require_git v2.6;
 use PublicInbox::ContentHash qw(git_sha);
 use PublicInbox::Spawn qw(popen_rd);
-require_mods(qw(DBD::SQLite Search::Xapian URI::Escape));
+require_mods(qw(DBD::SQLite Xapian URI::Escape));
 require PublicInbox::SolverGit;
 my $rdr = { 2 => \(my $null) };
 my $git_dir = xqx([qw(git rev-parse --git-common-dir)], undef, $rdr);
diff --git a/t/v1-add-remove-add.t b/t/v1-add-remove-add.t
index ae045dfa..50ff8143 100644
--- a/t/v1-add-remove-add.t
+++ b/t/v1-add-remove-add.t
@@ -6,7 +6,7 @@ use Test::More;
 use PublicInbox::Import;
 use PublicInbox::TestCommon;
 use PublicInbox::Eml;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require PublicInbox::SearchIdx;
 my ($inboxdir, $for_destroy) = tmpdir();
 my $ibx = {
diff --git a/t/v1reindex.t b/t/v1reindex.t
index f593b323..2d12e3f5 100644
--- a/t/v1reindex.t
+++ b/t/v1reindex.t
@@ -8,7 +8,7 @@ use File::Path qw(remove_tree);
 use PublicInbox::TestCommon;
 use PublicInbox::Eml;
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::SearchIdx';
 use_ok 'PublicInbox::Import';
 use_ok 'PublicInbox::OverIdx';
diff --git a/t/v2-add-remove-add.t b/t/v2-add-remove-add.t
index 6affc830..ddf8d248 100644
--- a/t/v2-add-remove-add.t
+++ b/t/v2-add-remove-add.t
@@ -6,7 +6,7 @@ use Test::More;
 use PublicInbox::Eml;
 use PublicInbox::TestCommon;
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::V2Writable';
 my ($inboxdir, $for_destroy) = tmpdir();
 my $ibx = {
diff --git a/t/v2mda.t b/t/v2mda.t
index 8f2f335d..a49eeb6d 100644
--- a/t/v2mda.t
+++ b/t/v2mda.t
@@ -11,7 +11,7 @@ use PublicInbox::Eml;
 require_git(2.6);
 
 my $V = 2;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::V2Writable';
 my ($tmpdir, $for_destroy) = tmpdir();
 my $ibx = {
diff --git a/t/v2mirror.t b/t/v2mirror.t
index c1c66d45..88b67bc1 100644
--- a/t/v2mirror.t
+++ b/t/v2mirror.t
@@ -14,7 +14,7 @@ use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
 
 # Integration tests for HTTP cloning + mirroring
 require_mods(qw(Plack::Util Plack::Builder
-                HTTP::Date HTTP::Status Search::Xapian DBD::SQLite));
+                HTTP::Date HTTP::Status Xapian DBD::SQLite));
 use_ok 'PublicInbox::V2Writable';
 use PublicInbox::InboxWritable;
 use PublicInbox::Eml;
diff --git a/t/v2reindex.t b/t/v2reindex.t
index cafe8648..406c0517 100644
--- a/t/v2reindex.t
+++ b/t/v2reindex.t
@@ -5,7 +5,7 @@ use PublicInbox::Eml;
 use PublicInbox::ContentHash qw(content_digest);
 use File::Path qw(remove_tree);
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::V2Writable';
 use_ok 'PublicInbox::OverIdx';
 my ($inboxdir, $for_destroy) = tmpdir();
diff --git a/t/v2writable.t b/t/v2writable.t
index 0d102204..1b7e9e7d 100644
--- a/t/v2writable.t
+++ b/t/v2writable.t
@@ -8,7 +8,7 @@ use PublicInbox::ContentHash qw(content_digest content_hash);
 use PublicInbox::TestCommon;
 use Cwd qw(abs_path);
 require_git(2.6);
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 local $ENV{HOME} = abs_path('t');
 use_ok 'PublicInbox::V2Writable';
 umask 007;
diff --git a/t/watch_filter_rubylang.t b/t/watch_filter_rubylang.t
index 643dbb8a..a6153e46 100644
--- a/t/watch_filter_rubylang.t
+++ b/t/watch_filter_rubylang.t
@@ -6,7 +6,7 @@ use PublicInbox::TestCommon;
 use Test::More;
 use PublicInbox::Eml;
 use PublicInbox::Config;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::Watch';
 use_ok 'PublicInbox::Emergency';
 my ($tmpdir, $for_destroy) = tmpdir();
diff --git a/t/watch_maildir_v2.t b/t/watch_maildir_v2.t
index 7b46232b..38679836 100644
--- a/t/watch_maildir_v2.t
+++ b/t/watch_maildir_v2.t
@@ -8,7 +8,7 @@ use PublicInbox::Config;
 use PublicInbox::TestCommon;
 use PublicInbox::Import;
 require_git(2.6);
-require_mods(qw(Search::Xapian DBD::SQLite));
+require_mods(qw(Xapian DBD::SQLite));
 require PublicInbox::V2Writable;
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
diff --git a/t/watch_multiple_headers.t b/t/watch_multiple_headers.t
index 33ed0770..13dd3452 100644
--- a/t/watch_multiple_headers.t
+++ b/t/watch_multiple_headers.t
@@ -5,7 +5,7 @@ use Test::More;
 use PublicInbox::Config;
 use PublicInbox::TestCommon;
 require_git(2.6);
-require_mods(qw(Search::Xapian DBD::SQLite));
+require_mods(qw(Xapian DBD::SQLite));
 my ($tmpdir, $for_destroy) = tmpdir();
 my $inboxdir = "$tmpdir/v2";
 my $maildir = "$tmpdir/md";
diff --git a/t/xap_helper.t b/t/xap_helper.t
index 0a211329..fe5d2d14 100644
--- a/t/xap_helper.t
+++ b/t/xap_helper.t
@@ -3,7 +3,7 @@
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use v5.12;
 use PublicInbox::TestCommon;
-require_mods(qw(DBD::SQLite Search::Xapian +SCM_RIGHTS)); # TODO: FIFO support?
+require_mods(qw(DBD::SQLite Xapian +SCM_RIGHTS)); # TODO: FIFO support?
 use PublicInbox::Spawn qw(spawn);
 use Socket qw(AF_UNIX SOCK_SEQPACKET SOCK_STREAM);
 require PublicInbox::AutoReap;
diff --git a/t/xcpdb-reshard.t b/t/xcpdb-reshard.t
index 8516b907..cde9f151 100644
--- a/t/xcpdb-reshard.t
+++ b/t/xcpdb-reshard.t
@@ -4,7 +4,7 @@
 use strict;
 use v5.10.1;
 use PublicInbox::TestCommon;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 require_git('2.6');
 use PublicInbox::Eml;
 require PublicInbox::Search;
diff --git a/xt/create-many-inboxes.t b/xt/create-many-inboxes.t
index d22803e3..3d8932b7 100644
--- a/xt/create-many-inboxes.t
+++ b/xt/create-many-inboxes.t
@@ -19,7 +19,7 @@ mkpath($many_root);
 $many_root = abs_path($many_root);
 $many_root =~ m!\A\Q$cwd\E/! and BAIL_OUT "$many_root must not be in $cwd";
 require_git 2.6;
-require_mods(qw(DBD::SQLite Search::Xapian));
+require_mods(qw(DBD::SQLite Xapian));
 use_ok 'PublicInbox::V2Writable';
 my $nr_inbox = $ENV{NR_INBOX} // 10;
 my $nproc = $ENV{NPROC} || PublicInbox::IPC::detect_nproc() || 2;
diff --git a/xt/solver.t b/xt/solver.t
index 1f004bf5..06f5a493 100644
--- a/xt/solver.t
+++ b/xt/solver.t
@@ -5,7 +5,7 @@ use v5.12;
 use PublicInbox::TestCommon;
 use PublicInbox::Config; # this relies on PI_CONFIG // ~/.public-inbox/config
 my @psgi = qw(HTTP::Request::Common Plack::Test URI::Escape Plack::Builder);
-require_mods(qw(DBD::SQLite Search::Xapian), @psgi);
+require_mods(qw(DBD::SQLite Xapian), @psgi);
 use_ok($_) for @psgi;
 use_ok 'PublicInbox::WWW';
 my $cfg = PublicInbox::Config->new;