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

Re: [PATCH 6/9] difftool: replace system call with Git::command_noisy

From
David Aguilar <davvid@gmail.com>
Date
Mar 17, 2012, 02:48 UTC
Message-ID
<CAJDDKr4+0iWoZhxo6kMVa0YUtDzmrH=XTZnDqQdbnM6TJ41UDg@mail.gmail.com>
In-Reply-To
<1331949557-15146-1-git-send-email-tim.henigan@gmail.com>
On Fri, Mar 16, 2012 at 6:59 PM, Tim Henigan <tim.henigan@gmail.com> wrote:
> The Git.pm module includes functions intended to standardize working
> with Git repositories in Perl scripts. This commit teaches difftool
> to use Git::command_noisy rather than a system call to run the diff
> command.

Git::command_noisy() calls _cmd_exec() which calls _execv_git_cmd() which does a fork() + exec('git', @_) + waitpid();

We were avoiding exec() for portability reasons, as Alex explained in 677fbff88f368ed6ac52438ddbb530166ec1d5d1:

# ActiveState Perl for Win32 does not implement POSIX semantics of # exec* system call. It just spawns the given executable and finishes # the starting program, exiting with code 0. # system will at least catch the errors returned by git diff, # allowing the caller of git difftool better handling of failures.

Is this no longer a concern?  Does Git.pm need a similar portability
caveat, or  does it avoid the problem altogether since it uses fork()
+ exec() + waitpid()?  (if this is true then it implies that this
change is fine).

I have not read the rest of this series yet, so apologies if these questions were answered elsewhere.

In general, I am a little nervous about having difftool copy worktree content somewhere temporary only to copy it back in later. Is there some way to make the diff machinery reuse the worktree? I was under the impression that we could do some GIT_INDEX tricks to do it, though I will admit that I did not read that suggestion in depth, nor did I grasp whether this was the problem it was meant to address.

Thoughts?
Show 27 quoted lines
>
> Signed-off-by: Tim Henigan <tim.henigan@gmail.com>
> ---
>  git-difftool.perl |   10 +---------
>  1 file changed, 1 insertion(+), 9 deletions(-)
>
> diff --git a/git-difftool.perl b/git-difftool.perl
> index 9495f14..8498089 100755
> --- a/git-difftool.perl
> +++ b/git-difftool.perl
> @@ -72,12 +72,4 @@ elsif (defined($no_prompt)) {
>
>  $ENV{GIT_PAGER} = '';
>  $ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper';
> -my @command = ('git', 'diff', @ARGV);
> -
> -# ActiveState Perl for Win32 does not implement POSIX semantics of
> -# exec* system call. It just spawns the given executable and finishes
> -# the starting program, exiting with code 0.
> -# system will at least catch the errors returned by git diff,
> -# allowing the caller of git difftool better handling of failures.
> -my $rc = system(@command);
> -exit($rc | ($rc >> 8));
> +git_cmd_try { Git::command_noisy(('diff', @ARGV)) } 'exit code %d';
> --
> 1.7.9.1.290.gbd444
>
-- 
David
Previous: Tim HeniganNext: Alex Riesen
Message 2 of 6 in “difftool: replace system call with Git::command_noisy”
  1. 6/9 difftool: replace system call with Git::command_noisyTim Henigan, Mar 17, 2012
  2. David AguilarMar 17, 2012
  3. Alex RiesenMar 17, 2012
  4. Tim HeniganMar 17, 2012
  5. Alex RiesenMar 17, 2012
  6. Tim HeniganMar 18, 2012

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.