I'm sorry for sending a non-working patch. Apparently I got lost in /tmp. So here is the patch for gitk that allows you to browse the entire tree for every revision.
The patched gitk script and some screenshots can be found at: http://public.efil.de/gitk/ For my personal use it's rather sufficient. If anybody is interested in using it, I would clean it up. - Ingo Add tree view. This allows you to browse the entire tree for every revision. You may switch back an forward betweem the two modes at any time. Keybindings: v - toggle view mode (tree/commit) l - toggle line numbers --- commit dbbfcc0cabb8eaaff998dc95957d73867f0e2f35 tree 53d7597f0f42ca1c3f7f01c7ca60d14541077a89 parent ccf1ee327f9a7d51704578fa41ba255abfd3a730 author <[EMAIL PROTECTED](none)> Thu, 25 Aug 2005 00:13:22 +0200 committer <[EMAIL PROTECTED](none)> Thu, 25 Aug 2005 00:13:22 +0200 gitk | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 187 insertions(+), 5 deletions(-) diff --git a/gitk b/gitk --- a/gitk +++ b/gitk @@ -329,12 +329,13 @@ proc makewindow {} { global findtype findtypemenu findloc findstring fstring geometry global entries sha1entry sha1string sha1but global maincursor textcursor curtextcursor - global rowctxmenu gaudydiff mergemax + global rowctxmenu gaudydiff mergemax viewmodebutton menu .bar .bar add cascade -label "File" -menu .bar.file menu .bar.file .bar.file add command -label "Reread references" -command rereadrefs + .bar.file add command -label "Toggle line numbers" -command togglelinenum .bar.file add command -label "Quit" -command doquit menu .bar.help .bar add cascade -label "Help" -menu .bar.help @@ -381,6 +382,9 @@ proc makewindow {} { .ctop.top.clist add $canv3 bind .ctop.top.clist <Configure> {resizeclistpanes %W %w} + set viewmodebutton Tree + button .ctop.top.bar.viewmodebutton -textvariable viewmodebutton -command toggleviewmode + pack .ctop.top.bar.viewmodebutton -side left set sha1entry .ctop.top.bar.sha1 set entries $sha1entry set sha1but .ctop.top.bar.sha1label @@ -493,9 +497,11 @@ proc makewindow {} { bindkey <Key-space> "$ctext yview scroll 1 pages" bindkey p "selnextline -1" bindkey n "selnextline 1" + bindkey l "togglelinenum" bindkey b "$ctext yview scroll -1 pages" bindkey d "$ctext yview scroll 18 units" bindkey u "$ctext yview scroll -18 units" + bindkey v "toggleviewmode" bindkey / {findnext 1} bindkey <Key-Return> {findnext 0} bindkey ? findprev @@ -2815,10 +2821,178 @@ proc gettreediffline {gdtf ids} { lappend treediff $file } +proc toggleviewmode {} { + global treemode viewmodebutton selectedline cflist viewpath ctext + if { $treemode } { + set viewmodebutton Tree + set treemode false + } else { + set viewmodebutton Commit + set treemode true + } + # redraw + if {![info exists selectedline]} return + set l [expr $selectedline] + selectline $l 1 + # select current file + if {! $treemode } { + set commitfiles [ $cflist get 0 end ] + set index [ lsearch $commitfiles $viewpath ] + if { $index > 0 } { + catch { after 500 $ctext yview fmark.$index } + } + } +} + +proc togglelinenum {} { + global showlinenum selectedline + if { $showlinenum } { set showlinenum false } else { set showlinenum true } + if {![info exists selectedline]} return + set l [expr $selectedline] + selectline $l 1 +} + +proc viewfull { path } { + global ctext currentid viewpath + $ctext conf -state normal + $ctext delete 0.0 end + + if { $path != "" } { set viewpath $path } + if { $viewpath == "Comments" || $viewpath == "/" || $viewpath == "" } { + set path "" + set viewpath "/" + set kind root + set sha $currentid + } else { + if [catch {set stream [open "|git-ls-tree $currentid $viewpath" r]}] { + $ctext insert end "ERROR: viewfull: git-ls-tree $currentid $viewpath" + return + } + gets $stream line + fconfigure $stream -blocking 0 + close $stream + if { $line == "" } { + set kind "NOT FOUND !!!" + } else { + set kind [lindex $line 1] + } + set sha [lindex $line 2] + } + + viewheader $viewpath $kind + + if { $kind == "blob"} { + viewblob $sha + } elseif { $kind == "tree" || $kind == "root"} { + viewtree $sha + } +} + +proc viewheader { path kind } { + global ctext + $ctext insert end "type: $kind\n" + $ctext insert end "path: " + + set splitpath [ linsert [ split [ string trim $path "/" ] "/" ] 0 "ROOT" ] + set name [ lindex $splitpath end ] + set splitpath [ lrange $splitpath 0 end-1 ] + set buildpath "/" + foreach next $splitpath { + if { $next != "ROOT" } { + append buildpath "$next/" + } + viewprintlink "$next" $buildpath + $ctext insert end " / " + } + $ctext insert end "$name \n" + set l [expr {(78 - [string length $name]) / 2}] + set pad [string range "----------------------------------------" 1 $l] + $ctext insert end "$pad $name $pad\n" filesep +} + +proc viewprintlink { name path } { + global ctext + set linkbeg [$ctext index "end - 1c"] + $ctext insert end "$name" + set linkend [$ctext index "end - 1c"] + $ctext tag add linkfile$name "$linkbeg + 0 c" "$linkend + 0 c" + $ctext tag conf linkfile$name -foreground blue -underline 1 + $ctext tag bind linkfile$name <Enter> { %W configure -cursor hand2 } + $ctext tag bind linkfile$name <Leave> { %W configure -cursor $curtextcursor } + $ctext tag bind linkfile$name <1> [ list viewfull "$path" ] +} + + +proc viewblob {sha} { + global ctext linenum + set linenum 0 + if [catch {set stream [open "|git-cat-file blob $sha" r]}] { + $ctext insert end "ERROR: viewblob" + return + } + fconfigure $stream -blocking 0 + fileevent $stream readable [list getviewblobline $stream $sha] +} + +proc getviewblobline {stream sha} { + global ctext linenum showlinenum + set n [gets $stream line] + if {$n < 0} { + if {![eof $stream]} return + close $stream + return + } + incr linenum + set num [format "%5s" "$linenum"] + if { $showlinenum } { $ctext insert end "$num " hunksep } + $ctext insert end "$line\n" +} + +proc viewtree {sha} { + global ctext lstree + set lstree "" + $ctext insert end "\n\n" + if [catch {set stream [open "|git-ls-tree $sha" r]}] { + $ctext insert end "ERROR viewtree" + return + } + fconfigure $stream -blocking 0 + fileevent $stream readable [list getviewtreeline $stream] +} + +proc getviewtreeline {stream} { + global ctext viewpath lstree + set n [gets $stream line] + if {$n < 0} { + if {![eof $stream]} return + close $stream + printviewtreefilter "tree" + $ctext insert end "\n" + printviewtreefilter "blob" + return + } + lappend lstree $line +} + +proc printviewtreefilter {filter} { + global ctext lstree viewpath + foreach line $lstree { + set kind [ lindex $line 1 ] + if { $kind != $filter} continue + $ctext insert end " $kind " + set name [ lindex $line 3 ] + viewprintlink $name "$viewpath/$name" + $ctext insert end "\n" + } +} + proc getblobdiffs {ids} { global diffopts blobdifffd diffids env curdifftag curtagstart - global difffilestart nextupdate diffinhdr treediffs - + global difffilestart nextupdate diffinhdr treediffs treemode + if { $treemode } { + viewfull "" + return + } set id [lindex $ids 0] set p [lindex $ids 1] set env(GIT_DIFF_OPTS) $diffopts @@ -2951,12 +3125,17 @@ proc nextfile {} { } proc listboxsel {} { - global ctext cflist currentid + global ctext cflist currentid treemode viewpath if {![info exists currentid]} return set sel [lsort [$cflist curselection]] if {$sel eq {}} return set first [lindex $sel 0] - catch {$ctext yview fmark.$first} + set viewpath [ $cflist get $first ] + if { $treemode } { + viewfull [$cflist get $first] + } else { + catch {$ctext yview fmark.$first} + } } proc setcoords {} { @@ -3576,6 +3755,9 @@ set stopped 0 set redisplaying 0 set stuffsaved 0 set patchnum 0 +set treemode false +set viewpath "" +set showlinenum true setcoords makewindow readrefs -- +--------------------------------------------------------+ | Ingo Bormuth, voicebox & telefax: +49-12125-10226517 | | GnuPG key 86326EC9 at http://ibormuth.efil.de/contact | +--------------------------------------------------------+ - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html