about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-01-31 02:46:13 +0000
committerEric Wong <e@80x24.org>2019-01-31 02:46:13 +0000
commit1664112a5d2db906bdb89e4a64b02155183eda05 (patch)
tree4cb50a3031ef70efdff38e6d0d8215e2d83ea574 /lib
parentcdbcf648ed1c28cc5774416f7868d78b4e0e2dba (diff)
downloadpublic-inbox-1664112a5d2db906bdb89e4a64b02155183eda05.tar.gz
We can rely on git to disambiguate, here; because sometimes
shorter OIDs can be unambiguous even if we only resolved the
longer one.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/SolverGit.pm24
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm
index 97da7956..a13ae9e5 100644
--- a/lib/PublicInbox/SolverGit.pm
+++ b/lib/PublicInbox/SolverGit.pm
@@ -302,6 +302,26 @@ sub extract_old_mode ($) {
         '100644';
 }
 
+sub do_finish ($$) {
+        my ($self, $user_cb) = @_;
+        my $found = $self->{found};
+        my $oid_want = $self->{oid_want};
+        if (my $exists = $found->{$oid_want}) {
+                return $user_cb->($exists);
+        }
+
+        # let git disambiguate if oid_want was too short,
+        # but long enough to be unambiguous:
+        my $tmp_git = $self->{tmp_git};
+        if (my @res = $tmp_git->check($oid_want)) {
+                return $user_cb->($found->{$res[0]});
+        }
+        if (my $err = $tmp_git->last_check_err) {
+                dbg($self, $err);
+        }
+        $user_cb->(undef);
+}
+
 sub do_step ($) {
         my ($self) = @_;
         eval {
@@ -323,8 +343,8 @@ sub do_step ($) {
                 # our result: (which may be undef)
                 # Other steps may call user_cb to terminate prematurely
                 # on error
-                } elsif (my $ucb = delete($self->{user_cb})) {
-                        $ucb->($self->{found}->{$self->{oid_want}});
+                } elsif (my $user_cb = delete($self->{user_cb})) {
+                        do_finish($self, $user_cb);
                 } else {
                         die 'about to call user_cb twice'; # Oops :x
                 }