Code

Accommodate new git-diff-tree output format
authorPaul Mackerras <paulus@samba.org>
Thu, 19 May 2005 12:35:53 +0000 (12:35 +0000)
committerPaul Mackerras <paulus@samba.org>
Thu, 19 May 2005 12:35:53 +0000 (12:35 +0000)
Add 'f' key for moving to next file

gitk

diff --git a/gitk b/gitk
index 7a46b872f43cc40a2f380f5ac7d8586ed96dafac..8d25c32d653f9ffd30cb8c6543c33212de1d89c9 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -7,7 +7,7 @@ exec wish "$0" -- "${1+$@}"
 # and distributed under the terms of the GNU General Public Licence,
 # either version 2, or (at your option) any later version.
 
-# CVS $Revision: 1.16 $
+# CVS $Revision: 1.17 $
 
 proc getcommits {rargs} {
     global commits commfd phase canv mainfont
@@ -257,6 +257,7 @@ proc makewindow {} {
     bindkey u "$ctext yview scroll -18 u"
     bindkey / findnext
     bindkey ? findprev
+    bindkey f nextfile
     bind . <Control-q> doquit
     bind . <Control-f> dofind
     bind . <Control-g> findnext
@@ -401,7 +402,7 @@ Copyright 
 
 Use and redistribute under the terms of the GNU General Public License
 
-(CVS $Revision: 1.16 $)} \
+(CVS $Revision: 1.17 $)} \
            -justify center -aspect 400
     pack $w.m -side top -fill x -padx 20 -pady 20
     button $w.ok -text Close -command "destroy $w"
@@ -1022,6 +1023,7 @@ proc gettreediffline {gdtf id} {
 
 proc getblobdiffs {id} {
     global parents diffopts blobdifffd env curdifftag curtagstart
+    global diffindex difffilestart
     set p [lindex $parents($id) 0]
     set env(GIT_DIFF_OPTS) $diffopts
     if [catch {set bdf [open "|git-diff-tree -r -p $p $id" r]} err] {
@@ -1032,12 +1034,14 @@ proc getblobdiffs {id} {
     set blobdifffd($id) $bdf
     set curdifftag Comments
     set curtagstart 0.0
+    set diffindex 0
+    catch {unset difffilestart}
     fileevent $bdf readable "getblobdiffline $bdf $id"
 }
 
 proc getblobdiffline {bdf id} {
     global currentid blobdifffd ctext curdifftag curtagstart seenfile
-    global diffnexthead diffnextnote
+    global diffnexthead diffnextnote diffindex difffilestart
     set n [gets $bdf line]
     if {$n < 0} {
        if {[eof $bdf]} {
@@ -1065,6 +1069,8 @@ proc getblobdiffline {bdf id} {
            set header "$diffnexthead ($diffnextnote)"
            unset diffnexthead
        }
+       set difffilestart($diffindex) [$ctext index "end - 1c"]
+       incr diffindex
        set curdifftag "f:$fname"
        $ctext tag delete $curdifftag
        set l [expr {(78 - [string length $header]) / 2}]
@@ -1078,6 +1084,14 @@ proc getblobdiffline {bdf id} {
     } elseif {[string range $line 0 8] == "Deleted: "} {
        set diffnexthead [string range $line 9 end]
        set diffnextnote "deleted"
+    } elseif {[regexp {^diff --git a/(.*) b/} $line match fn]} {
+       # save the filename in case the next thing is "new file mode ..."
+       set diffnexthead $fn
+       set diffnextnote "modified"
+    } elseif {[regexp {^new file mode ([0-7]+)} $line match m]} {
+       set diffnextnote "new file, mode $m"
+    } elseif {[string range $line 0 11] == "deleted file"} {
+       set diffnextnote "deleted"
     } elseif {[regexp {^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@(.*)} \
                   $line match f1l f1c f2l f2c rest]} {
        $ctext insert end "\t" hunksep
@@ -1110,6 +1124,17 @@ proc getblobdiffline {bdf id} {
     $ctext conf -state disabled
 }
 
+proc nextfile {} {
+    global difffilestart ctext
+    set here [$ctext index @0,0]
+    for {set i 0} {[info exists difffilestart($i)]} {incr i} {
+       if {[$ctext compare $difffilestart($i) > $here]} {
+           $ctext yview $difffilestart($i)
+           break
+       }
+    }
+}
+
 proc listboxsel {} {
     global ctext cflist currentid treediffs seenfile
     if {![info exists currentid]} return