Skip to content

Commit

Permalink
git-gui: Implement automatic rescan after Tool execution.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alexander Gavrilov authored and Shawn O. Pearce committed Nov 16, 2008
1 parent 67df911 commit b8dfb16
Showing 1 changed file with 42 additions and 2 deletions.
44 changes: 42 additions & 2 deletions lib/tools.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,15 @@ proc tools_exec {fullname} {

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)
Expand All @@ -117,3 +119,41 @@ proc tools_exec {fullname} {
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]
}
}

0 comments on commit b8dfb16

Please sign in to comment.