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 BF33F2141C for ; Thu, 31 Jan 2019 04:27:25 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/5] solvergit: allow searching on longer-than-needed OIDs Date: Thu, 31 Jan 2019 04:27:22 +0000 Message-Id: <20190131042724.2675-4-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: public-inbox can only index the abbreviated object_ids in emails, not the full or even longer-than-necessary object_ids. So retry failed object_ids if they're longer than 7 hex characters. --- lib/PublicInbox/SolverGit.pm | 17 ++++++++++++++++- t/solver_git.t | 9 +++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index c502526..97da795 100644 --- a/lib/PublicInbox/SolverGit.pm +++ b/lib/PublicInbox/SolverGit.pm @@ -23,6 +23,7 @@ use URI::Escape qw(uri_escape_utf8); # headroom into this. use POSIX qw(sysconf _SC_ARG_MAX); my $ARG_SIZE_MAX = (sysconf(_SC_ARG_MAX) || 4096) - 2048; +my $OID_MIN = 7; # By default, "git format-patch" generates filenames with a four-digit # prefix, so that means 9999 patch series are OK, right? :> @@ -353,7 +354,13 @@ sub next_step ($) { sub mark_found ($$$) { my ($self, $oid, $found_info) = @_; - $self->{found}->{$oid} = $found_info; + my $found = $self->{found}; + $found->{$oid} = $found_info; + my $oid_cur = $found_info->[1]; + while ($oid_cur ne $oid && length($oid_cur) > $OID_MIN) { + $found->{$oid_cur} = $found_info; + chop($oid_cur); + } } sub parse_ls_files ($$$$) { @@ -485,6 +492,14 @@ sub resolve_patch ($$) { } return next_step($self); # onto the next todo item } + if (length($cur_want) > $OID_MIN) { + chop($cur_want); + dbg($self, "retrying $want->{oid_b} as $cur_want"); + $want->{oid_b} = $cur_want; + push @{$self->{todo}}, $want; + return next_step($self); # retry with shorter abbrev + } + dbg($self, "could not find $cur_want"); eval { delete($self->{user_cb})->(undef) }; # not found! :< die "E: $@" if $@; diff --git a/t/solver_git.t b/t/solver_git.t index 197a003..66e6317 100644 --- a/t/solver_git.t +++ b/t/solver_git.t @@ -64,6 +64,15 @@ if (0) { # TODO: check this? diag $z; } +my $oid = $expect; +for my $i (1..2) { + my $more; + my $s = PublicInbox::SolverGit->new($ibx, sub { $more = $_[0] }); + $s->solve($psgi_env, $log, $oid, {}); + is($more->[1], $expect, 'resolved blob to long OID '.$i); + chop($oid); +} + $solver = undef; $res = undef; my $wt_git_dir = $wt_git->{git_dir}; -- EW