diff options
| author | Shawn O. Pearce <spearce@spearce.org> | 2008-01-20 14:46:59 -0500 |
|---|---|---|
| committer | Shawn O. Pearce <spearce@spearce.org> | 2008-01-20 22:45:38 -0500 |
| commit | ed76cb70f47225fc1a2ba4209b38b89be71adeb6 (patch) | |
| tree | 7d0c27745553bff1005741b9b40749cfb093f49c /git-gui.sh | |
| parent | c87238e19de70c1066e606df53f4f20f19621acd (diff) | |
| download | git-ed76cb70f47225fc1a2ba4209b38b89be71adeb6.tar.gz | |
git-gui: Consolidate hook execution code into a single function
The code we use to test if a hook is executable or not differs on
Cygwin from the normal POSIX case. Rather then repeating that for
all three hooks we call in our commit code path we can place the
common logic into a global procedure and invoke it when necessary.
This also lets us get rid of the ugly "|& cat" we were using before
as we can now rely on the Tcl 8.4 feature of "2>@1" or fallback to
the "|& cat" when necessary.
The post-commit hook is now run through the same API, but its outcome
does not influence the commit status. As a result we now show any of
the errors from the post-commit hook in a dialog window, instead of on
the user's tty that was used to launch git-gui. This resolves a long
standing bug related to not getting errors out of the post-commit hook
when launched under git-gui.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'git-gui.sh')
| -rwxr-xr-x | git-gui.sh | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/git-gui.sh b/git-gui.sh index fcb2ab2fb7..f42e461fd4 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -438,6 +438,34 @@ proc git_write {args} { return [open [concat $opt $cmdp $args] w] } +proc githook_read {hook_name args} { + set pchook [gitdir hooks $hook_name] + lappend args 2>@1 + + # On Cygwin [file executable] might lie so we need to ask + # the shell if the hook is executable. Yes that's annoying. + # + if {[is_Cygwin]} { + upvar #0 _sh interp + if {![info exists interp]} { + set interp [_which sh] + } + if {$interp eq {}} { + error "hook execution requires sh (not in PATH)" + } + + set scr {if test -x "$1";then exec "$@";fi} + set sh_c [list | $interp -c $scr $interp $pchook] + return [_open_stdout_stderr [concat $sh_c $args]] + } + + if {[file executable $pchook]} { + return [_open_stdout_stderr [concat [list | $pchook] $args]] + } + + return {} +} + proc sq {value} { regsub -all ' $value "'\\''" value return "'$value'" |
