git-gui: remove 'no such variable' for s error when encounter unknown file states
[gitweb.git] / lib / tools.tcl
index 00d46ddab5fcb9b872c3083959f7f9feb06e9fc9..95e6e5553ea86482d0fe9be77b07e805e01e3393 100644 (file)
@@ -77,7 +77,16 @@ proc tools_exec {fullname} {
                }
        }
 
-       if {[is_config_true "guitool.$fullname.confirm"]} {
+       catch { unset env(ARGS) }
+       catch { unset env(REVISION) }
+
+       if {[get_config "guitool.$fullname.revprompt"] ne {} ||
+           [get_config "guitool.$fullname.argprompt"] ne {}} {
+               set dlg [tools_askdlg::dialog $fullname]
+               if {![tools_askdlg::execute $dlg]} {
+                       return
+               }
+       } elseif {[is_config_true "guitool.$fullname.confirm"]} {
                if {[ask_popup [mc "Are you sure you want to run %s?" $fullname]] ne {yes}} {
                        return
                }
@@ -93,16 +102,58 @@ 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)
        unset env(FILENAME)
        unset env(CUR_BRANCH)
+       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 successfully: %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]
+       }
 }