gitk: Make File->Update work properly again
[git.git] / gitk
diff --git a/gitk b/gitk
index 961b582..c6649a5 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -22,8 +22,8 @@ proc parse_args {rargs} {
     set parsed_args {}
     set cmdline_files {}
     if {[catch {
     set parsed_args {}
     set cmdline_files {}
     if {[catch {
-       set parse_args [concat --default HEAD $rargs]
-       set args [split [eval exec git-rev-parse $parse_args] "\n"]
+       set args [concat --default HEAD $rargs]
+       set args [split [eval exec git-rev-parse $args] "\n"]
        set i 0
        foreach arg $args {
            if {![regexp {^[0-9a-f]{40}$} $arg]} {
        set i 0
        foreach arg $args {
            if {![regexp {^[0-9a-f]{40}$} $arg]} {
@@ -217,17 +217,13 @@ proc readcommit {id} {
 }
 
 proc updatecommits {} {
 }
 
 proc updatecommits {} {
-    global parsed_args
+    global viewdata curview revtreeargs
 
 
-    unselectline
-    stopfindproc
-    foreach v {matchinglines treediffs currentid} {
-       global $v
-       catch {unset $v}
-    }
-    clear_display
-    readrefs
-    getcommits $parsed_args
+    set n $curview
+    set curview -1
+    catch {unset viewdata($n)}
+    parse_args $revtreeargs
+    showview $n
 }
 
 proc parsecommit {id contents listed} {
 }
 
 proc parsecommit {id contents listed} {
@@ -354,7 +350,7 @@ proc error_popup msg {
     tkwait window $w
 }
 
     tkwait window $w
 }
 
-proc makewindow {rargs} {
+proc makewindow {} {
     global canv canv2 canv3 linespc charspc ctext cflist textfont
     global findtype findtypemenu findloc findstring fstring geometry
     global entries sha1entry sha1string sha1but
     global canv canv2 canv3 linespc charspc ctext cflist textfont
     global findtype findtypemenu findloc findstring fstring geometry
     global entries sha1entry sha1string sha1but
@@ -817,13 +813,6 @@ proc delview {} {
     showview 0
 }
 
     showview 0
 }
 
-proc saveview {} {
-    global curview viewdata
-    global displayorder parentlist childlist rowidlist rowoffsets
-    global rowrangelist commitlisted
-
-}
-
 proc showview {n} {
     global curview viewdata viewfiles
     global displayorder parentlist childlist rowidlist rowoffsets
 proc showview {n} {
     global curview viewdata viewfiles
     global displayorder parentlist childlist rowidlist rowoffsets
@@ -832,6 +821,7 @@ proc showview {n} {
     global selectedline currentid canv canvy0
     global matchinglines treediffs
     global parsed_args
     global selectedline currentid canv canvy0
     global matchinglines treediffs
     global parsed_args
+    global pending_select phase
 
     if {$n == $curview} return
     set selid {}
 
     if {$n == $curview} return
     set selid {}
@@ -850,7 +840,7 @@ proc showview {n} {
     }
     unselectline
     stopfindproc
     }
     unselectline
     stopfindproc
-    if {![info exists viewdata($curview)]} {
+    if {$curview >= 0 && $phase eq {} && ![info exists viewdata($curview)]} {
        set viewdata($curview) \
            [list $displayorder $parentlist $childlist $rowidlist \
                 $rowoffsets $rowrangelist $commitlisted]
        set viewdata($curview) \
            [list $displayorder $parentlist $childlist $rowidlist \
                 $rowoffsets $rowrangelist $commitlisted]
@@ -858,6 +848,7 @@ proc showview {n} {
     catch {unset matchinglines}
     catch {unset treediffs}
     clear_display
     catch {unset matchinglines}
     catch {unset treediffs}
     clear_display
+    readrefs
 
     set curview $n
     .bar.view entryconf 2 -state [expr {$n == 0? "disabled": "normal"}]
 
     set curview $n
     .bar.view entryconf 2 -state [expr {$n == 0? "disabled": "normal"}]
@@ -867,6 +858,7 @@ proc showview {n} {
        if {$viewfiles($n) ne {}} {
            set args [concat $args "--" $viewfiles($n)]
        }
        if {$viewfiles($n) ne {}} {
            set args [concat $args "--" $viewfiles($n)]
        }
+       set pending_select $selid
        getcommits $args 
        return
     }
        getcommits $args 
        return
     }
@@ -1036,7 +1028,7 @@ proc initlayout {} {
     set commitlisted {}
     set parentlist {}
     set childlist {}
     set commitlisted {}
     set parentlist {}
     set childlist {}
-    set rowrangelist {{}}
+    set rowrangelist {}
     catch {unset children}
     set nextcolor 0
     set rowidlist {{}}
     catch {unset children}
     set nextcolor 0
     set rowidlist {{}}
@@ -1099,7 +1091,7 @@ proc layoutmore {} {
 }
 
 proc showstuff {canshow} {
 }
 
 proc showstuff {canshow} {
-    global numcommits
+    global numcommits commitrow pending_select
     global linesegends idrowranges idrangedrawn
 
     if {$numcommits == 0} {
     global linesegends idrowranges idrangedrawn
 
     if {$numcommits == 0} {
@@ -1113,6 +1105,7 @@ proc showstuff {canshow} {
     set rows [visiblerows]
     set r0 [lindex $rows 0]
     set r1 [lindex $rows 1]
     set rows [visiblerows]
     set r0 [lindex $rows 0]
     set r1 [lindex $rows 1]
+    set selrow -1
     for {set r $row} {$r < $canshow} {incr r} {
        if {[info exists linesegends($r)]} {
            foreach id $linesegends($r) {
     for {set r $row} {$r < $canshow} {incr r} {
        if {[info exists linesegends($r)]} {
            foreach id $linesegends($r) {
@@ -1135,6 +1128,11 @@ proc showstuff {canshow} {
        drawcmitrow $row
        incr row
     }
        drawcmitrow $row
        incr row
     }
+    if {[info exists pending_select] &&
+       [info exists commitrow($pending_select)] &&
+       $commitrow($pending_select) < $numcommits} {
+       selectline $commitrow($pending_select) 1
+    }
 }
 
 proc layoutrows {row endrow last} {
 }
 
 proc layoutrows {row endrow last} {
@@ -1202,10 +1200,12 @@ proc layoutrows {row endrow last} {
        } else {
            unset idinlist($id)
        }
        } else {
            unset idinlist($id)
        }
+       set ranges {}
        if {[info exists idrowranges($id)]} {
            lappend idrowranges($id) $row
        if {[info exists idrowranges($id)]} {
            lappend idrowranges($id) $row
-           lappend rowrangelist $idrowranges($id)
+           set ranges $idrowranges($id)
        }
        }
+       lappend rowrangelist $ranges
        incr row
        set offs [ntimes [llength $idlist] 0]
        set l [llength $newolds]
        incr row
        set offs [ntimes [llength $idlist] 0]
        set l [llength $newolds]
@@ -1732,8 +1732,8 @@ proc findcrossings {id} {
     foreach {s e} [rowranges $id] {
        if {$e >= $numcommits} {
            set e [expr {$numcommits - 1}]
     foreach {s e} [rowranges $id] {
        if {$e >= $numcommits} {
            set e [expr {$numcommits - 1}]
-           if {$e < $s} continue
        }
        }
+       if {$e <= $s} continue
        set x [lsearch -exact [lindex $rowidlist $e] $id]
        if {$x < 0} {
            puts "findcrossings: oops, no [shortids $id] in row $e"
        set x [lsearch -exact [lindex $rowidlist $e] $id]
        if {$x < 0} {
            puts "findcrossings: oops, no [shortids $id] in row $e"
@@ -2360,7 +2360,7 @@ proc donefilediff {} {
     }
 }
 
     }
 }
 
-proc findcont {id} {
+proc findcont {} {
     global findid treediffs parentlist
     global ffileline findstartline finddidsel
     global displayorder numcommits matchinglines findinprogress
     global findid treediffs parentlist
     global ffileline findstartline finddidsel
     global displayorder numcommits matchinglines findinprogress
@@ -2493,8 +2493,9 @@ proc selectline {l isnew} {
     global canvy0 linespc parentlist childlist
     global cflist currentid sha1entry
     global commentend idtags linknum
     global canvy0 linespc parentlist childlist
     global cflist currentid sha1entry
     global commentend idtags linknum
-    global mergemax numcommits
+    global mergemax numcommits pending_select
 
 
+    catch {unset pending_select}
     $canv delete hover
     normalline
     if {$l < 0 || $l >= $numcommits} return
     $canv delete hover
     normalline
     if {$l < 0 || $l >= $numcommits} return
@@ -2784,7 +2785,7 @@ proc getmergediffline {mdf id np} {
        incr nextupdate 100
        fileevent $mdf readable {}
        update
        incr nextupdate 100
        fileevent $mdf readable {}
        update
-       fileevent $mdf readable [list getmergediffline $mdf $id]
+       fileevent $mdf readable [list getmergediffline $mdf $id $np]
     }
 }
 
     }
 }
 
@@ -4027,7 +4028,7 @@ set stopped 0
 set stuffsaved 0
 set patchnum 0
 setcoords
 set stuffsaved 0
 set patchnum 0
 setcoords
-makewindow $revtreeargs
+makewindow
 readrefs
 parse_args $revtreeargs
 set args $parsed_args
 readrefs
 parse_args $revtreeargs
 set args $parsed_args