about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-09-15 01:08:01 +0000
committerEric Wong <e@80x24.org>2015-09-15 01:09:56 +0000
commit4c4ced89c5542886bd63c3d886d2a6f7ac84e394 (patch)
tree1e1bf35d8d7c2e1f984d6258de91ca2fa8c8702c /lib
parenta94b930f4804cd2019b69e1371753810e6e97ff8 (diff)
downloadpublic-inbox-4c4ced89c5542886bd63c3d886d2a6f7ac84e394.tar.gz
We'll be reusing this for loading msgmap.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/SearchIdx.pm55
1 files changed, 29 insertions, 26 deletions
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index c61e1616..44f6bc17 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -275,42 +275,45 @@ sub index_sync {
         $self->with_umask(sub { $self->_index_sync($head) });
 }
 
-# indexes all unindexed messages
-sub _index_sync {
-        my ($self, $head) = @_;
-        require PublicInbox::GitCatFile;
-        my $db = $self->{xdb};
+sub rlog {
+        my ($self, $range, $add_cb, $del_cb) = @_;
         my $hex = '[a-f0-9]';
         my $h40 = $hex .'{40}';
         my $addmsg = qr!^:000000 100644 \S+ ($h40) A\t${hex}{2}/${hex}{38}$!;
         my $delmsg = qr!^:100644 000000 ($h40) \S+ D\t${hex}{2}/${hex}{38}$!;
+        my $git_dir = $self->{git_dir};
+        require PublicInbox::GitCatFile;
+        my $git = PublicInbox::GitCatFile->new($git_dir);
+        my @cmd = ('git', "--git-dir=$git_dir", "log",
+                    qw/--reverse --no-notes --no-color --raw -r --no-abbrev/,
+                    $range);
+        my $latest;
+        my $pid = open(my $log, '-|', @cmd) or
+                die('open` '.join(' ', @cmd) . " pipe failed: $!\n");
+        while (my $line = <$log>) {
+                if ($line =~ /$addmsg/o) {
+                        $add_cb->($self, $git, $1);
+                } elsif ($line =~ /$delmsg/o) {
+                        $del_cb->($self, $git, $1);
+                } elsif ($line =~ /^commit ($h40)/o) {
+                        $latest = $1;
+                }
+        }
+        close $log;
+        $latest;
+}
+
+# indexes all unindexed messages
+sub _index_sync {
+        my ($self, $head) = @_;
+        my $db = $self->{xdb};
         $head ||= 'HEAD';
 
         $db->begin_transaction;
         eval {
-                my $git = PublicInbox::GitCatFile->new($self->{git_dir});
-
                 my $latest = $db->get_metadata('last_commit');
                 my $range = $latest eq '' ? $head : "$latest..$head";
-                $latest = undef;
-
-                # get indexed messages
-                my @cmd = ('git', "--git-dir=$self->{git_dir}", "log",
-                            qw/--reverse --no-notes --no-color --raw -r
-                               --no-abbrev/, $range);
-                my $pid = open(my $log, '-|', @cmd) or
-                        die('open` '.join(' ', @cmd) . " pipe failed: $!\n");
-
-                while (my $line = <$log>) {
-                        if ($line =~ /$addmsg/o) {
-                                $self->index_blob($git, $1);
-                        } elsif ($line =~ /$delmsg/o) {
-                                $self->unindex_blob($git, $1);
-                        } elsif ($line =~ /^commit ($h40)/o) {
-                                $latest = $1;
-                        }
-                }
-                close $log;
+                $latest = $self->rlog($range, *index_blob, *unindex_blob);
                 $db->set_metadata('last_commit', $latest) if defined $latest;
         };
         if ($@) {