git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* gitk tree view
@ 2005-08-23  4:24 Ingo Bormuth
  2005-08-24 22:35 ` [PATCH] Gitk tree view (correction) Ingo Bormuth
  0 siblings, 1 reply; 3+ messages in thread
From: Ingo Bormuth @ 2005-08-23  4:24 UTC (permalink / raw
  To: git; +Cc: paulus, ingo

[-- Attachment #1: Type: text/plain, Size: 9043 bytes --]


Hi.

This is a quick hack which allows you to browser the entire tree using gitk.

Keybindings:  n - toggle line numbers
              v - toggle tree view

I know, it should be cleaned up. It needs some locking. 
Colored diffs in the tree would be nice.

Is anybody interested in a propper version ???

Cheers Ingo


-- 
   +--------------------------------------------------------+
   | Ingo Bormuth,  voicebox & telefax: +49-12125-10226517  |
   | GnuPG key 86326EC9 at http://ibormuth.efil.de/contact  |
   +--------------------------------------------------------+





Added tree view.
This is a rather quick hack.

---
commit 4f697f79d6e82d0d0269eeda5f746174c6ba047e
tree c6f82a184da82ed417f170d1b7e2025a801c879b
parent 792fe559d02e55c12d2d544fd6d6f202cbaab6f4
author <ingo@kruemel.(none)> Tue, 23 Aug 2005 06:08:21 +0200
committer <ingo@kruemel.(none)> Tue, 23 Aug 2005 06:08:21 +0200

 gitk |  189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 183 insertions(+), 6 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 togglesetviewmode
+    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
@@ -2056,7 +2062,7 @@ proc selectline {l isnew} {
     global lineid linehtag linentag linedtag
     global canvy0 linespc parents nparents children
     global cflist currentid sha1entry
-    global commentend idtags idline linknum
+    global commentend idtags idline linknum viewmodebutton
 
     $canv delete hover
     if {![info exists lineid($l)] || ![info exists linehtag($l)]} return
@@ -2815,10 +2821,173 @@ proc gettreediffline {gdtf ids} {
     lappend treediff $file
 }
 
+proc toggleviewmode {} {
+    global viewmodebutton selectedline
+    if { $viewmodebutton == "Commit" } { 
+        set viewmodebutton Tree
+    } else { 
+        set viewmodebutton Commit
+    }
+    if {![info exists selectedline]} return
+    set l [expr $selectedline]
+    selectline $l 1
+}
+
+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 { $viewpath == "Comments" || $path == "/" } {
+        set path ""
+        set viewpath ""
+    }
+    if { $path != "" } {
+        set viewpath $path
+    }
+
+    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
+    close $stream
+    
+    set kind [lindex $line 1]
+    set sha  [lindex $line 2]
+
+    if { $viewpath == "" } {
+        set kind root
+        set sha $currentid
+    }
+
+    if { $line == "" } {
+      set kind "NOT FOUND !!!"
+    }
+    
+    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
+        set name [ lindex $line 3 ]
+        $ctext insert end "    $kind  "
+        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 viewmodebutton
+    # If the button says COMMIT, we are in TREE mode)
+    if { $viewmodebutton == "Commit" } { 
+      viewfull "" 
+      return 
+    }
     set id [lindex $ids 0]
     set p [lindex $ids 1]
     set env(GIT_DIFF_OPTS) $diffopts
@@ -2951,12 +3120,18 @@ proc nextfile {} {
 }
 
 proc listboxsel {} {
-    global ctext cflist currentid
+    global ctext cflist currentid viewmodebutton 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 the button says COMMIT, we are in TREE mode
+    if {$viewmodebutton == "Commit"} {
+      viewfull [$cflist get $first]
+    } else {
+        catch {$ctext yview fmark.$first}
+    }
 }
 
 proc setcoords {} {
@@ -3576,6 +3751,8 @@ set stopped 0
 set redisplaying 0
 set stuffsaved 0
 set patchnum 0
+set viewpath ""
+set showlinenum false
 setcoords
 makewindow
 readrefs



[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] Gitk tree view (correction)
  2005-08-23  4:24 gitk tree view Ingo Bormuth
@ 2005-08-24 22:35 ` Ingo Bormuth
  0 siblings, 0 replies; 3+ messages in thread
From: Ingo Bormuth @ 2005-08-24 22:35 UTC (permalink / raw
  To: git; +Cc: paulus, ingo


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 <ingo@kruemel.(none)> Thu, 25 Aug 2005 00:13:22 +0200
committer <ingo@kruemel.(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  |
   +--------------------------------------------------------+

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Gitk tree view (correction)
@ 2005-08-25 13:56 Linda Walter
  0 siblings, 0 replies; 3+ messages in thread
From: Linda Walter @ 2005-08-25 13:56 UTC (permalink / raw
  To: git

Hey, that's a nice one. Now I can easily go through my code without using the web interface. It would be nice if you could mark the lines that have changed in bold or whatever. It would also be nice, to add the current uncommitted working version as "newest revision".

Stagger (Please CC me, as I'm not on the list)



-- 
___________________________________________________________
Sign-up for Ads Free at Mail.com
http://promo.mail.com/adsfreejump.htm

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-08-25 13:56 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-23  4:24 gitk tree view Ingo Bormuth
2005-08-24 22:35 ` [PATCH] Gitk tree view (correction) Ingo Bormuth
  -- strict thread matches above, loose matches on Subject: below --
2005-08-25 13:56 Linda Walter

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).