diff options
author | Paul Mackerras <paulus@samba.org> | 2007-06-26 11:09:49 +1000 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-06-26 11:14:06 +1000 |
commit | 706d6c3e76fc5f7f988b056015689b489eb8f6b5 (patch) | |
tree | db99eae8e86004adcb7121b1a284621e18360d19 | |
parent | gitk: Improve handling of whitespace and special chars in filenames (diff) | |
download | tgif-706d6c3e76fc5f7f988b056015689b489eb8f6b5.tar.xz |
gitk: Add a progress bar to show progress while resetting
Since git reset now gets chatty while resetting, we were getting errors
reported when a reset was done using the "reset branch to here" menu
item. With this we now read the progress messages from git reset and
update a progress bar. Because git reset outputs the progress messages
to standard error, and Tcl treats messages to standard error as error
messages, we have to invoke git reset via a shell and redirect standard
error into standard output.
This also fixes a bug in computing descendent heads when head ids
are changed via a reset.
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rwxr-xr-x | gitk | 52 |
1 files changed, 45 insertions, 7 deletions
@@ -5851,19 +5851,54 @@ proc resethead {} { bind $w <Visibility> "grab $w; focus $w" tkwait window $w if {!$confirm_ok} return - dohidelocalchanges - if {[catch {exec git reset --$resettype $rowmenuid} err]} { + if {[catch {set fd [open \ + [list | sh -c "git reset --$resettype $rowmenuid 2>&1"] r]} err]} { error_popup $err } else { - set oldhead $mainheadid - movedhead $rowmenuid $mainhead - set mainheadid $rowmenuid + dohidelocalchanges + set w ".resetprogress" + filerun $fd [list readresetstat $fd $w] + toplevel $w + wm transient $w + wm title $w "Reset progress" + message $w.m -text "Reset in progress, please wait..." \ + -justify center -aspect 1000 + pack $w.m -side top -fill x -padx 20 -pady 5 + canvas $w.c -width 150 -height 20 -bg white + $w.c create rect 0 0 0 20 -fill green -tags rect + pack $w.c -side top -fill x -padx 20 -pady 5 -expand 1 + nowbusy reset + } +} + +proc readresetstat {fd w} { + global mainhead mainheadid showlocalchanges + + if {[gets $fd line] >= 0} { + if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} { + set x [expr {($m * 150) / $n}] + $w.c coords rect 0 0 $x 20 + } + return 1 + } + destroy $w + notbusy reset + if {[catch {close $fd} err]} { + error_popup $err + } + set oldhead $mainheadid + set newhead [exec git rev-parse HEAD] + if {$newhead ne $oldhead} { + movehead $newhead $mainhead + movedhead $newhead $mainhead + set mainheadid $newhead redrawtags $oldhead - redrawtags $rowmenuid + redrawtags $newhead } if {$showlocalchanges} { doshowlocalchanges } + return 0 } # context menu for a head @@ -6742,7 +6777,10 @@ proc descheads {id} { } foreach a $arcnos($id) { if {$archeads($a) ne {}} { - set ret [concat $ret $archeads($a)] + validate_archeads $a + if {$archeads($a) ne {}} { + set ret [concat $ret $archeads($a)] + } } set d $arcstart($a) if {![info exists seen($d)]} { |