From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 0568A2141D for ; Thu, 31 Jan 2019 04:27:25 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/5] solvergit: allow shorter-than-necessary OIDs from user Date: Thu, 31 Jan 2019 04:27:23 +0000 Message-Id: <20190131042724.2675-5-e@80x24.org> In-Reply-To: <20190131042724.2675-1-e@80x24.org> References: <20190131042724.2675-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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 | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index 97da795..a13ae9e 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 } -- EW