Merge branch 'js/commit-gpgsign' into pu
[gitweb.git] / lib / tools.tcl
index 044432e39e2d61471f2e9af169745aba183d9e31..6ec94113db7d8c75d78e5300469bb8154e37c940 100644 (file)
@@ -87,8 +87,14 @@ proc tools_exec {fullname} {
                        return
                }
        } elseif {[is_config_true "guitool.$fullname.confirm"]} {
-               if {[ask_popup [mc "Are you sure you want to run %s?" $fullname]] ne {yes}} {
-                       return
+               if {[is_config_true "guitool.$fullname.needsfile"]} {
+                       if {[ask_popup [mc "Are you sure you want to run %1\$s on file \"%2\$s\"?" $fullname $current_diff_path]] ne {yes}} {
+                               return
+                       }
+               } else {
+                       if {[ask_popup [mc "Are you sure you want to run %s?" $fullname]] ne {yes}} {
+                               return
+                       }
                }
        }
 
@@ -102,13 +108,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)
@@ -117,3 +125,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 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]
+       }
+}