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-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 73FC71FA01 for ; Sun, 28 Mar 2021 09:01:25 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 04/12] lei blob: support --no-mail switch Date: Sun, 28 Mar 2021 09:01:16 +0000 Message-Id: <20210328090124.3541-5-e@80x24.org> In-Reply-To: <20210328090124.3541-1-e@80x24.org> References: <20210328090124.3541-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: It's possible for a abbreviated OID to be resolved unambiguously to an email before we attempt to look at externals via xsearch; so provide a way for a user to force searching coderepos. If hints (--oid-a, --path-a, --path-b) are present, we'll assume --no-mail by default, otherwise we'll assume the user wants to look through mail for a matching blob. --- lib/PublicInbox/LEI.pm | 4 ++-- lib/PublicInbox/LeiBlob.pm | 23 +++++++++++++---------- t/solver_git.t | 3 +++ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index fdb0bbcf..bad7fad9 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -136,8 +136,8 @@ our %CMD = ( # sorted in order of importance/use: import-before! lock=s@ rsyncable alert=s@ mua=s verbose|v+), @c_opt, opt_dash('limit|n=i', '[0-9]+') ], -'blob' => [ 'OID', 'display a git blob object, solving if necessary', - qw(git-dir=s@ cwd! verbose|v+ oid-a|A=s path-a|a=s path-b|b=s), +'blob' => [ 'OID', 'show a git blob, reconstructing from mail if necessary', + qw(git-dir=s@ cwd! verbose|v+ mail! oid-a|A=s path-a|a=s path-b|b=s), @lxs_opt, @c_opt ], 'add-external' => [ 'LOCATION', diff --git a/lib/PublicInbox/LeiBlob.pm b/lib/PublicInbox/LeiBlob.pm index 9b4c4f30..4bd86253 100644 --- a/lib/PublicInbox/LeiBlob.pm +++ b/lib/PublicInbox/LeiBlob.pm @@ -8,7 +8,6 @@ use v5.10.1; use parent qw(PublicInbox::IPC); use PublicInbox::Spawn qw(spawn popen_rd); use PublicInbox::DS; -use PublicInbox::Eml; sub sol_done_wait { # dwaitpid callback my ($arg, $pid) = @_; @@ -85,18 +84,22 @@ sub do_solve_blob { # via wq_do sub lei_blob { my ($lei, $blob) = @_; $lei->start_pager if -t $lei->{1}; + my $opt = $lei->{opt}; + my $has_hints = grep(defined, @$opt{qw(oid-a path-a path-b)}); - # first, see if it's a blob returned by "lei q" JSON output: - my $rdr = { 1 => $lei->{1} }; - open $rdr->{2}, '>', '/dev/null' or die "open: $!"; - my $cmd = [ 'git', '--git-dir='.$lei->ale->git->{git_dir}, - 'cat-file', 'blob', $blob ]; - waitpid(spawn($cmd, $lei->{env}, $rdr), 0); - return if $? == 0; + # first, see if it's a blob returned by "lei q" JSON output:k + if ($opt->{mail} // ($has_hints ? 0 : 1)) { + my $rdr = { 1 => $lei->{1} }; + open $rdr->{2}, '>', '/dev/null' or die "open: $!"; + my $cmd = [ 'git', '--git-dir='.$lei->ale->git->{git_dir}, + 'cat-file', 'blob', $blob ]; + waitpid(spawn($cmd, $lei->{env}, $rdr), 0); + return if $? == 0; + } # maybe it's a non-email (code) blob from a coderepo - my $git_dirs = $lei->{opt}->{'git-dir'} //= []; - if ($lei->{opt}->{'cwd'} //= 1) { + my $git_dirs = $opt->{'git-dir'} //= []; + if ($opt->{'cwd'} // 1) { my $cgd = get_git_dir('.'); unshift(@$git_dirs, $cgd) if defined $cgd; } diff --git a/t/solver_git.t b/t/solver_git.t index 22714ae5..7bf3ba21 100644 --- a/t/solver_git.t +++ b/t/solver_git.t @@ -34,6 +34,9 @@ test_lei({tmpdir => $tmpdir}, sub { lei_ok('blob', '69df7d5', '-I', $ibx->{inboxdir}); is(sha1_hex("blob ".length($lei_out)."\0".$lei_out), $expect, 'blob contents output'); + my $prev = $lei_out; + lei_ok(qw(blob --no-mail 69df7d5 -I), $ibx->{inboxdir}); + is($lei_out, $prev, '--no-mail works'); # fallbacks lei_ok('blob', $v1_0_0_tag, '-I', $ibx->{inboxdir});