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

Re: [PATCH/RFC] notice error exit from pager

From
Johannes Sixt <j6t@kdbg.org>
Date
Jul 27, 2011, 19:36 UTC
Message-ID
<4E3068D4.4050006@kdbg.org>
In-Reply-To
<20110726210401.GA25207@toss.lan>
Am 26.07.2011 23:04, schrieb Clemens Buchacher:
Show 11 quoted lines
> If the pager fails to run, git produces no output, e.g.:
> 
>  $ GIT_PAGER=not-a-command git log
> 
> The error reporting fails for two reasons:
> 
>  (1) start_command: There is a mechanism that detects errors during
>      execvp introduced in 2b541bf8 (start_command: detect execvp
>      failures early). ... This mechanism is
>      incompatible with the workaround introduced in 35ce8622
>      (pager: Work around window resizing bug in 'less')

You analysis is correct. I think the bug in less was fixed shortly after this workaround was introduced. I would like to remove this workaround for a different reason, but it seems there are people who are quite fond of it ;)

Show 23 quoted lines
> diff --git a/run-command.c b/run-command.c
> index 70e8a24..944a882 100644
> --- a/run-command.c
> +++ b/run-command.c
> @@ -127,9 +127,6 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure)
>  		if (code == 127) {
>  			code = -1;
>  			failed_errno = ENOENT;
> -			if (!silent_exec_failure)
> -				error("cannot run %s: %s", argv0,
> -					strerror(ENOENT));
>  		}
>  	} else {
>  		error("waitpid is confused (%s)", argv0);
> @@ -287,10 +284,14 @@ fail_pipe:
>  		 * Do not check for cmd->silent_exec_failure; the parent
>  		 * process will check it when it sees this exit code.
>  		 */
> -		if (errno == ENOENT)
> +		if (errno == ENOENT) {
> +			if (!cmd->silent_exec_failure)
> +				error("cannot run %s: %s", cmd->argv[0],
> +					strerror(ENOENT));

This change is not good enough: There is no guarantee that this message goes to the right channel (stderr in the child can be redirected). Look carefully: We set a special die routine in the forked child that ensures that the die() messages are written to the right channel; we do not have a similar facility for error() messages (or do we?).

Show 8 quoted lines
>  			exit(127);
> -		else
> +		} else {
>  			die_errno("cannot exec '%s'", cmd->argv[0]);
> +		}
>  	}
>  	if (cmd->pid < 0)
>  		error("cannot fork() for %s: %s", cmd->argv[0],
-- Hannes
Previous: Linus TorvaldsNext: Clemens Buchacher
Message 3 of 7 in “notice error exit from pager”
  1. notice error exit from pagerClemens Buchacher, Jul 26, 2011
  2. Linus TorvaldsJul 26, 2011
  3. Johannes SixtJul 27, 2011
  4. error_routine: use parent's stderr if exec failsClemens Buchacher, Jul 27, 2011
  5. notice error exit from pagerClemens Buchacher, Aug 1, 2011
  6. Junio C HamanoAug 1, 2011
  7. Clemens BuchacherAug 1, 2011

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.