]> Sergey Matveev's repositories - public-inbox.git/commitdiff
solvergit: allow searching on longer-than-needed OIDs
authorEric Wong <e@80x24.org>
Thu, 31 Jan 2019 01:41:15 +0000 (01:41 +0000)
committerEric Wong <e@80x24.org>
Thu, 31 Jan 2019 01:41:15 +0000 (01:41 +0000)
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
t/solver_git.t

index c5025269187b0fe6b61122e96bcba2f517679201..97da7956a26d2c37cdf5e2a23067e30ae800e5bc 100644 (file)
@@ -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 $@;
index 197a003a8191dfa77a82bb75be1567edc18ce84d..66e63176161ccee64223cdf85b247b25235ec339 100644 (file)
@@ -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};