зеркало из https://github.com/microsoft/git.git
git-gui: Teach console widget to use git_read
Now that we are pretty strict about setting up own absolute paths to any git helper (saving a marginal runtime cost to resolve the tool) we can do the same in our console widget by making sure all console execs go through git_read if they are a git subcommand, and if not make sure they at least try to use the Tcl 2>@1 IO redirection if possible, as it should be faster than |& cat. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Родитель
c136f2b8b9
Коммит
74c4763c76
46
git-gui.sh
46
git-gui.sh
|
@ -394,6 +394,29 @@ proc git {args} {
|
||||||
return [eval $opt $cmdp $args]
|
return [eval $opt $cmdp $args]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc _open_stdout_stderr {cmd} {
|
||||||
|
if {[catch {
|
||||||
|
set fd [open $cmd r]
|
||||||
|
} err]} {
|
||||||
|
if { [lindex $cmd end] eq {2>@1}
|
||||||
|
&& $err eq {can not find channel named "1"}
|
||||||
|
} {
|
||||||
|
# Older versions of Tcl 8.4 don't have this 2>@1 IO
|
||||||
|
# redirect operator. Fallback to |& cat for those.
|
||||||
|
# The command was not actually started, so its safe
|
||||||
|
# to try to start it a second time.
|
||||||
|
#
|
||||||
|
set fd [open [concat \
|
||||||
|
[lrange $cmd 0 end-1] \
|
||||||
|
[list |& cat] \
|
||||||
|
] r]
|
||||||
|
} else {
|
||||||
|
error $err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $fd
|
||||||
|
}
|
||||||
|
|
||||||
proc git_read {args} {
|
proc git_read {args} {
|
||||||
set opt [list |]
|
set opt [list |]
|
||||||
|
|
||||||
|
@ -422,28 +445,7 @@ proc git_read {args} {
|
||||||
set cmdp [_git_cmd [lindex $args 0]]
|
set cmdp [_git_cmd [lindex $args 0]]
|
||||||
set args [lrange $args 1 end]
|
set args [lrange $args 1 end]
|
||||||
|
|
||||||
if {[catch {
|
return [_open_stdout_stderr [concat $opt $cmdp $args]]
|
||||||
set fd [open [concat $opt $cmdp $args] r]
|
|
||||||
} err]} {
|
|
||||||
if { [lindex $args end] eq {2>@1}
|
|
||||||
&& $err eq {can not find channel named "1"}
|
|
||||||
} {
|
|
||||||
# Older versions of Tcl 8.4 don't have this 2>@1 IO
|
|
||||||
# redirect operator. Fallback to |& cat for those.
|
|
||||||
# The command was not actually started, so its safe
|
|
||||||
# to try to start it a second time.
|
|
||||||
#
|
|
||||||
set fd [open [concat \
|
|
||||||
$opt \
|
|
||||||
$cmdp \
|
|
||||||
[lrange $args 0 end-1] \
|
|
||||||
[list |& cat] \
|
|
||||||
] r]
|
|
||||||
} else {
|
|
||||||
error $err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $fd
|
|
||||||
}
|
}
|
||||||
|
|
||||||
proc git_write {args} {
|
proc git_write {args} {
|
||||||
|
|
|
@ -87,19 +87,12 @@ method _init {} {
|
||||||
}
|
}
|
||||||
|
|
||||||
method exec {cmd {after {}}} {
|
method exec {cmd {after {}}} {
|
||||||
# -- Cygwin's Tcl tosses the enviroment when we exec our child.
|
if {[lindex $cmd 0] eq {git}} {
|
||||||
# But most users need that so we have to relogin. :-(
|
set fd_f [eval git_read --stderr [lrange $cmd 1 end]]
|
||||||
#
|
} else {
|
||||||
if {[is_Cygwin]} {
|
lappend cmd 2>@1
|
||||||
set cmd [list sh --login -c "cd \"[pwd]\" && [join $cmd { }]"]
|
set fd_f [_open_stdout_stderr $cmd]
|
||||||
}
|
}
|
||||||
|
|
||||||
# -- Tcl won't let us redirect both stdout and stderr to
|
|
||||||
# the same pipe. So pass it through cat...
|
|
||||||
#
|
|
||||||
set cmd [concat | $cmd |& cat]
|
|
||||||
|
|
||||||
set fd_f [open $cmd r]
|
|
||||||
fconfigure $fd_f -blocking 0 -translation binary
|
fconfigure $fd_f -blocking 0 -translation binary
|
||||||
fileevent $fd_f readable [cb _read $fd_f $after]
|
fileevent $fd_f readable [cb _read $fd_f $after]
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче