about summary refs log tree commit homepage
path: root/script/repobrowse-index
diff options
context:
space:
mode:
Diffstat (limited to 'script/repobrowse-index')
-rwxr-xr-xscript/repobrowse-index68
1 files changed, 68 insertions, 0 deletions
diff --git a/script/repobrowse-index b/script/repobrowse-index
new file mode 100755
index 00000000..6e939fd5
--- /dev/null
+++ b/script/repobrowse-index
@@ -0,0 +1,68 @@
+#!/usr/bin/perl -w
+# Copyright (C) 2017 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+# Basic tool to create a Xapian search index for any git repository
+# Usage with libeatmydata <https://www.flamingspork.com/projects/libeatmydata/>
+# highly recommended: eatmydata repobrowse-index GIT_DIR
+use strict;
+use warnings;
+use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev);
+use Cwd 'abs_path';
+my $usage = "repobrowse-index GIT_DIR";
+
+eval { require PublicInbox::RepoGitSearchIdx };
+if ($@) {
+        print STDERR "Search::Xapian required for $0\n";
+        exit 1;
+}
+
+my $reindex;
+my %opts = ( '--reindex' => \$reindex );
+GetOptions(%opts) or die "bad command-line args\n$usage";
+
+my @dirs;
+sub resolve_git_dir {
+        my ($cd) = @_;
+        my @cmd = qw(git rev-parse --git-dir);
+        my $cmd = join(' ', @cmd);
+        my $pid = open my $fh, '-|';
+        defined $pid or die "forking $cmd failed: $!\n";
+        if ($pid == 0) {
+                if (defined $cd) {
+                        chdir $cd or die "chdir $cd failed: $!\n";
+                }
+                exec @cmd;
+                die "Failed to exec $cmd: $!\n";
+        } else {
+                my $dir = eval {
+                        local $/;
+                        <$fh>;
+                };
+                close $fh or die "error in $cmd: $!\n";
+                chomp $dir;
+                return abs_path($cd) if ($dir eq '.' && defined $cd);
+                abs_path($dir);
+        }
+}
+
+if (@ARGV) {
+        @dirs = map { resolve_git_dir($_) } @ARGV;
+} else {
+        @dirs = (resolve_git_dir());
+}
+
+sub usage { print STDERR "Usage: $usage\n"; exit 1 }
+usage() unless @dirs;
+
+foreach my $dir (@dirs) {
+        index_dir($dir);
+}
+
+sub index_dir {
+        my ($git_dir) = @_;
+        if (!ref $git_dir && ! -d $git_dir) {
+                die "$git_dir does not appear to be a git repository\n";
+        }
+        my $s = PublicInbox::RepoGitSearchIdx->new($git_dir);
+        $s->index_sync({ reindex => $reindex, progress => \*STDERR });
+}