Signed-off-by: Pierre Dumuid <[email protected]>
---
gitk | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/gitk b/gitk
index 36cba49..a894f1d 100755
--- a/gitk
+++ b/gitk
@@ -2089,6 +2089,10 @@ proc makewindow {} {
{mc "Reread re&ferences" command rereadrefs}
{mc "&List references" command showrefs -accelerator F2}
{xx "" separator}
+ {mc "List Local Branches" command {show_tree_of_references_dialog
"localBranches"} -accelerator F6}
+ {mc "List Remote Branches" command {show_tree_of_references_dialog
"remoteBranches"} -accelerator F7}
+ {mc "List Tags" command {show_tree_of_references_dialog
"tags"} -accelerator F8}
+ {xx "" separator}
{mc "Start git &gui" command {exec git gui &}}
{xx "" separator}
{mc "&Quit" command doquit -accelerator Meta1-Q}
@@ -2601,6 +2605,9 @@ proc makewindow {} {
bind . <F5> updatecommits
bindmodfunctionkey Shift 5 reloadcommits
bind . <F2> showrefs
+ bind . <F6> {show_tree_of_references_dialog "localBranches"}
+ bind . <F7> {show_tree_of_references_dialog "remoteBranches"}
+ bind . <F8> {show_tree_of_references_dialog "tags"}
bindmodfunctionkey Shift 4 {newview 0}
bind . <F4> edit_or_newview
bind . <$M1B-q> doquit
@@ -10146,6 +10153,116 @@ proc rmbranch {} {
run refill_reflist
}
+# Display a tree view of local branches, remote branches, and tags according
to view_type.
+#
+# @param string view_type
+# Must be one of "localBranches", "remoteBranches", or "tags".
+#
+proc show_tree_of_references_dialog {view_type} {
+ global NS
+ global treefilelist
+ global headids tagids
+
+ switch -- $view_type {
+ "localBranches" {
+ set dialogName "Local Branches"
+ set top .show_tree_of_local_branches
+ set listOfReferences [lsort [array names headids -regexp
{^(?!remotes/)} ]]
+ set truncateFrom 0
+ }
+ "remoteBranches" {
+ set dialogName "Remote Branches"
+ set top .show_tree_of_remote_branches
+ set listOfReferences [lsort [array names headids -regexp
{^remotes/} ]]
+ set truncateFrom 8
+ }
+ "tags" {
+ set dialogName "Tags"
+ set top .show_tree_of_tags
+ set listOfReferences [lsort [array names tagids]]
+ set truncateFrom 0
+ }
+ }
+
+ if {[winfo exists $top]} {
+ raise $top
+ return
+ }
+
+ ttk_toplevel $top
+ wm title $top [mc "$dialogName: %s" [file tail [pwd]]]
+ wm geometry $top "600x900"
+
+ make_transient $top .
+
+ ## See http://www.tkdocs.com/tutorial/tree.html
+ ttk::treeview $top.referenceList -xscrollcommand "$top.horizontalScrollBar
set" -yscrollcommand "$top.verticalScrollBar set"
+
+ # Populate the dialog
+ foreach reference $listOfReferences {
+ # The display name omits some leading characters (such as "remotes/")
+ set referenceDisplayName [string range $reference $truncateFrom end]
+
+ # Split the branch/tag by slashes, and incrementally ensure that each
leaf in the treeview exists..
+ # otherwise add it.
+ set treeLeaves [split $referenceDisplayName "/"]
+ for {set i 0} {$i < [llength $treeLeaves]} {} {
+ set leafReferenceId [join [lrange $treeLeaves 0 $i] "/"]
+ if {![$top.referenceList exists $leafReferenceId]} {
+ if {$i > 0} {
+ set parentLeafId [join [lrange $treeLeaves 0 $i-1] "/"]
+ } else {
+ set parentLeafId {}
+ }
+ $top.referenceList insert $parentLeafId end -id
$leafReferenceId -text [lindex $treeLeaves $i]
+ }
+ incr i
+ }
+ }
+
+ ${NS}::scrollbar $top.verticalScrollBar -command "$top.referenceList
yview" -orient vertical
+ ${NS}::scrollbar $top.horizontalScrollBar -command "$top.referenceList
xview" -orient horizontal
+
+ grid $top.referenceList $top.verticalScrollBar -sticky nsew
+ grid $top.horizontalScrollBar x -sticky ew
+
+ bind $top <Key-Escape> [list destroy $top]
+
+ bind $top.referenceList <<TreeviewSelect>>
{callback_tree_of_references_item_selected %W; break}
+
+ grid columnconfigure $top 0 -weight 1
+ grid rowconfigure $top 0 -weight 1
+}
+
+# Call back for selecting a branch / tag in the tree of references
+#
+# @param w
+#
+proc callback_tree_of_references_item_selected {w} {
+ global headids tagids
+
+ set itemId [$w focus]
+ switch -- $w {
+ ".show_tree_of_local_branches.referenceList" {
+ if {[info exists headids($itemId)]} {
+ selbyid $headids($itemId)
+ }
+ }
+ ".show_tree_of_remote_branches.referenceList" {
+ set itemId "remotes/$itemId"
+ if {[info exists headids($itemId)]} {
+ selbyid $headids($itemId)
+ }
+ }
+ ".show_tree_of_tags.referenceList" {
+ if {[info exists tagids($itemId)]} {
+ selbyid $tagids($itemId)
+ }
+ }
+ }
+}
+
+
# Display a list of tags and heads
proc showrefs {} {
global showrefstop bgcolor fgcolor selectbgcolor NS
--
2.10.2