Re: [PATCH/RFC] git-grep: correct exit code with --quiet and -L

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ah yes, I didn't intend to include the first hunk (forgot to amend it
out when formatting the patch).

I think git's exit codes for -L actually make more sense than the GNU
exit codes (especially when comparing with `grep` vs `grep -v`) --
that is, produce `0` when the search is successful (producing
*something* on stdout) and `1` when the search fails.

Shall I create a new mail with the adjusted patch as suggested above?
(I'm not familiar with the expected workflow).

Anthony

On Tue, Aug 15, 2017 at 2:33 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote:
> Anthony Sottile <asottile@xxxxxxxxx> writes:
>
>> The handling of `status_only` no longer interferes with the handling of
>> `unmatch_name_only`.  `--quiet` no longer affects the exit code when using
>> `-L`/`--files-without-match`.
>
> I agree with the above statement of yours that --quiet should not
> affect what the exit status is.
>
> But I am not sure what the exit code from these commands _should_
> be:
>
>     $ git grep -L qfwfq \*.h    ;# no file matches
>     $ git grep -L \# \*.h       ;# some but not all files match
>     $ git grep -L . \*.h        ;# all files match
>
> with or without --quiet.  I seem to get 0, 0, 1, which I am not sure
> is correct.  I do recall writing "git grep" _without_ thinking what
> the exit code should be when we added --files-without-match, so the
> exit status the current code gives out may be just a random garbage.
>
> Asking GNU grep (because --files-without-match is not a POSIX thing):
>
>     $ grep -L qfwfq *.h          ;# no file matches
>     $ grep -L \# *.h             ;# some but not all files match
>     $ grep -L . *.h              ;# all files match
>
> I seem to get 1, 0, 0.  So the exit status should reflect if there
> was _any_ hit from any file that were inspected.
>
>> @@ -1755,7 +1755,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
>>               }
>>               if (hit) {
>>                       count++;
>> -                     if (opt->status_only)
>> +                     if (!opt->unmatch_name_only && opt->status_only)
>>                               return 1;
>>                       if (opt->name_only) {
>>                               show_name(opt, gs->name);
>
> Does the change in this hunk have any effect?
>
> Just before this hunk there is this code:
>
>                 /* "grep -v -e foo -e bla" should list lines
>                  * that do not have either, so inversion should
>                  * be done outside.
>                  */
>                 if (opt->invert)
>                         hit = !hit;
>                 if (opt->unmatch_name_only) {
>                         if (hit)
>                                 return 0;
>                         goto next_line;
>
> If (opt->unmatch_name_only && hit) then the function would have
> already returned and the control wouldn't have reached here.
>
> Which would mean that when the control reaches the line this hunk
> touches, either one of these must be false, and because we are
> inside "if (hit)", opt->unmatch_name_only must be false.
>
>> @@ -1820,13 +1820,14 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
>>       if (collect_hits)
>>               return 0;
>>
>> -     if (opt->status_only)
>> -             return 0;
>>       if (opt->unmatch_name_only) {
>>               /* We did not see any hit, so we want to show this */
>> -             show_name(opt, gs->name);
>> +             if (!opt->status_only)
>> +                     show_name(opt, gs->name);
>>               return 1;
>>       }
>> +     if (opt->status_only)
>> +             return 0;
>
> This hunk makes sense to me (provided if the semantics we want out
> of --files-without-match is sensible, which is dubious), even though
> I would have limited the change to just a single line, i.e.
>
>         if (opt->status_only)
> -               return 0;
> +               return opt->unmatch_name_only;
>         if (opt->unmatch_name_only) {
>                 /* We did not see any hit, ... */
>
> But I suspect we want to fix the exit code not to be affected by
> the "--files-without-match" option in the first place, so all the
> code changes we see in this patch might be moot X-<.
>
>



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux