git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] pager: die when paging to non-existing command

From
Jeff King <peff@peff.net>
Date
Jun 21, 2024, 06:40 UTC
Message-ID
<20240621064020.GB2105230@coredump.intra.peff.net>
In-Reply-To
<f7106878-5ec5-4fe7-940b-2fb1d9707f7d@gmail.com>
On Thu, Jun 20, 2024 at 07:25:43PM +0200, Rubén Justo wrote:
Show 22 quoted lines
> When trying to execute a non-existent program from GIT_PAGER, we display
> an error.  However, we also send the complete text to the terminal
> and return a successful exit code.  This can be confusing for the user
> and the displayed error could easily become obscured by a lengthy
> text.
> 
> For example, here the error message would be very far above after
> sending 50 MB of text:
> 
>     $ GIT_PAGER=non-existent t/test-terminal.perl git log | wc -c
>     error: cannot run non-existent: No such file or directory
>     50314363
> 
> Let's make the error clear by aborting the process and return an error
> so that the user can easily correct their mistake.
> 
> This will be the result of the change:
> 
>     $ GIT_PAGER=non-existent t/test-terminal.perl git log | wc -c
>     error: cannot run non-existent: No such file or directory
>     fatal: unable to start the pager: 'non-existent'
>     0

OK. My initial reaction was "eh, who care? execve() failing is only one error mode, and we might see all kinds of failure modes from a missing or broken pager".

But this:
Show 7 quoted lines
> Finally, it's worth noting that we are not changing the behavior if the
> command specified in GIT_PAGER is a shell command.  In such cases, it
> is:
> 
>     $ GIT_PAGER=:\;non-existent t/test-terminal.perl git log
>     :;non-existent: 1: non-existent: not found
>     died of signal 13 at t/test-terminal.perl line 33.

...shows what happens in those other cases, and you are making things more consistent. So that seems reasonable to me.

Show 10 quoted lines
> The behavior change we're introducing in this commit affects two tests
> in t7006, which is a good sign regarding test coverage and requires us
> to address it.
> 
> The first test is 'git skips paging non-existing command'.  This test
> comes from f7991f01f2 (t7006: clean up SIGPIPE handling in trace2 tests,
> 2021-11-21,) where a modification was made to a test that was originally
> introduced in c24b7f6736 (pager: test for exit code with and without
> SIGPIPE, 2021-02-02).  That original test was, IMHO, in the same
> direction we're going in this commit.

Yeah, the point of f7991f01f2 was just to clean up the tests. The modification was only documenting what Git happened to do for that case now, and not meant as an endorsement of the behavior. ;) So I have no problem changing it.

Show 10 quoted lines
> The second test being affected is: 'non-existent pager doesnt cause
> crash', introduced in f917f57f40 (pager: fix crash when pager program
> doesn't exist, 2021-11-24).  As its name states, it has the intention of
> checking that we don't introduce a regression that produces a crash when
> GIT_PAGER points to a nonexistent program.
> 
> This test could be considered redundant nowadays, due to us already
> having several tests checking implicitly what a non-existent command in
> GIT_PAGER produces.  However, let's maintain a good belt-and-suspenders
> strategy; adapt it to the new world.

OK. I would also be happy to see it go. The crash was about reusing the pager child_process struct, and no we know that cannot happen. Either we run the pager or we immediately bail. I think that the code change in that commit could also be reverted (to always re-init the child process), but it's probably more defensive to keep it.

-Peff
Previous: Junio C HamanoNext: Rubén Justo
Message 12 of 17 in “pager: die when paging to non-existing command”
  1. pager: die when paging to non-existing commandRubén Justo, Jun 20, 2024
  2. Junio C HamanoJun 20, 2024
  3. Rubén JustoJun 20, 2024
  4. Junio C HamanoJun 20, 2024
  5. Johannes SixtJun 20, 2024
  6. Junio C HamanoJun 20, 2024
  7. Jeff KingJun 21, 2024
  8. Dragan SimicJun 21, 2024
  9. Johannes SchindelinJun 24, 2024
  10. Phillip WoodJun 21, 2024
  11. Junio C HamanoJun 21, 2024
  12. Jeff KingJun 21, 2024
  13. Rubén JustoJun 21, 2024
  14. pager: die when paging to non-existing commandRubén Justo, Jun 21, 2024
  15. pager: die when paging to non-existing commandRubén Justo, Jun 21, 2024
  16. Johannes SixtJun 22, 2024
  17. pager: die when paging to non-existing commandRubén Justo, Jun 23, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.