From 706d6c3e76fc5f7f988b056015689b489eb8f6b5 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Tue, 26 Jun 2007 11:09:49 +1000 Subject: 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 diff --git a/gitk b/gitk index 72a9145..269f9b0 100755 --- a/gitk +++ b/gitk @@ -5851,19 +5851,54 @@ proc resethead {} { bind $w "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)]} { -- cgit v0.10.2-6-g49f6