summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 67df911)
raw | patch | inline | side by side (parent: 67df911)
author | Alexander Gavrilov <angavrilov@gmail.com> | |
Sun, 16 Nov 2008 18:46:51 +0000 (21:46 +0300) | ||
committer | Shawn O. Pearce <spearce@spearce.org> | |
Sun, 16 Nov 2008 21:33:33 +0000 (13:33 -0800) |
The Tools menu is generally intended for commands that
affect the working directory or repository state. Thus,
the user would usually want to initiate rescan after
execution of a tool. This commit implements it.
In case somebody would want to avoid rescanning after
certain tools, it also adds an option that controls it,
although it is not made available through the Add dialog.
Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
affect the working directory or repository state. Thus,
the user would usually want to initiate rescan after
execution of a tool. This commit implements it.
In case somebody would want to avoid rescanning after
certain tools, it also adds an option that controls it,
although it is not made available through the Add dialog.
Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
lib/tools.tcl | patch | blob | history |
diff --git a/lib/tools.tcl b/lib/tools.tcl
index 044432e39e2d61471f2e9af169745aba183d9e31..6ae63b6c7c61cb8f773ba5b9367c948820a0873a 100644 (file)
--- a/lib/tools.tcl
+++ b/lib/tools.tcl
set cmdline $repo_config(guitool.$fullname.cmd)
if {[is_config_true "guitool.$fullname.noconsole"]} {
- exec sh -c $cmdline &
+ tools_run_silent [list sh -c $cmdline] \
+ [list tools_complete $fullname {}]
} else {
regsub {/} $fullname { / } title
set w [console::new \
[mc "Tool: %s" $title] \
[mc "Running: %s" $cmdline]]
- console::exec $w [list sh -c $cmdline]
+ console::exec $w [list sh -c $cmdline] \
+ [list tools_complete $fullname $w]
}
unset env(GIT_GUITOOL)
catch { unset env(ARGS) }
catch { unset env(REVISION) }
}
+
+proc tools_run_silent {cmd after} {
+ lappend cmd 2>@1
+ set fd [_open_stdout_stderr $cmd]
+
+ fconfigure $fd -blocking 0 -translation binary
+ fileevent $fd readable [list tools_consume_input $fd $after]
+}
+
+proc tools_consume_input {fd after} {
+ read $fd
+ if {[eof $fd]} {
+ fconfigure $fd -blocking 1
+ if {[catch {close $fd}]} {
+ uplevel #0 $after 0
+ } else {
+ uplevel #0 $after 1
+ }
+ }
+}
+
+proc tools_complete {fullname w {ok 1}} {
+ if {$w ne {}} {
+ console::done $w $ok
+ }
+
+ if {$ok} {
+ set msg [mc "Tool completed succesfully: %s" $fullname]
+ } else {
+ set msg [mc "Tool failed: %s" $fullname]
+ }
+
+ if {[is_config_true "guitool.$fullname.norescan"]} {
+ ui_status $msg
+ } else {
+ rescan [list ui_status $msg]
+ }
+}