On Fri, Mar 16, 2012 at 6:59 PM, Tim Henigan <tim.henigan@xxxxxxxxx> 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? > > Signed-off-by: Tim Henigan <tim.henigan@xxxxxxxxx> > --- > 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html