]> Sergey Matveev's repositories - public-inbox.git/commitdiff
solvergit: allow shorter-than-necessary OIDs from user
authorEric Wong <e@80x24.org>
Thu, 31 Jan 2019 02:46:13 +0000 (02:46 +0000)
committerEric Wong <e@80x24.org>
Thu, 31 Jan 2019 02:46:13 +0000 (02:46 +0000)
We can rely on git to disambiguate, here; because sometimes
shorter OIDs can be unambiguous even if we only resolved the
longer one.

lib/PublicInbox/SolverGit.pm

index 97da7956a26d2c37cdf5e2a23067e30ae800e5bc..a13ae9e51fba3d1ddfa13ced17806eb809234f21 100644 (file)
@@ -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
                }