From 350a35f0a17af071af3f6f76d9fc6f63265b23d2 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 25 Jul 2007 03:44:50 -0400 Subject: [PATCH] git-gui: Replace merge dialog with our revision picker widget Now that we only support merging one branch we can offer the user a better user interface experience by allowing them to select the revision they want to merge through our revision picking widget. This change neatly solves the problem of locating a branch out of a sea of 200 tracking branches, and of dealing with very long branch names that all have a common prefix. Signed-off-by: Shawn O. Pearce --- lib/merge.tcl | 81 +++++++-------------------------------------------- 1 file changed, 11 insertions(+), 70 deletions(-) diff --git a/lib/merge.tcl b/lib/merge.tcl index e5a752507..f8d92b320 100644 --- a/lib/merge.tcl +++ b/lib/merge.tcl @@ -4,8 +4,7 @@ class merge { field w ; # top level window -field w_list ; # widget of available branches -field list ; # list of available branches +field w_rev ; # mega-widget to pick the revision to merge method _can_merge {} { global HEAD commit_type file_states @@ -68,11 +67,10 @@ You should complete the current commit before starting a merge. Doing so will h } method _rev {} { - set i [$w_list curselection] - if {$i >= 0} { - return [lindex [lindex $list $i] 0] + if {[catch {$w_rev commit_or_die}]} { + return {} } - return {} + return [$w_rev get] } method _visualize {} { @@ -121,38 +119,6 @@ constructor dialog {} { return } - set fmt {list %(objectname) %(*objectname) %(refname) %(subject)} - set fr_fd [git_read for-each-ref \ - --tcl \ - --format=$fmt \ - refs/heads \ - refs/remotes \ - refs/tags \ - ] - fconfigure $fr_fd -translation binary - while {[gets $fr_fd line] > 0} { - set line [eval $line] - set ref [lindex $line 2] - regsub ^refs/(heads|remotes|tags)/ $ref {} ref - set subj($ref) [lindex $line 3] - lappend sha1([lindex $line 0]) $ref - if {[lindex $line 1] ne {}} { - lappend sha1([lindex $line 1]) $ref - } - } - close $fr_fd - - set list [list] - set fr_fd [git_read rev-list --all --not HEAD] - while {[gets $fr_fd line] > 0} { - if {[catch {set ref $sha1($line)}]} continue - foreach n $ref { - lappend list [list $n $line] - } - } - close $fr_fd - set list [lsort -unique $list] - make_toplevel top w wm title $top "[appname] ([reponame]): Merge" if {$top ne {.}} { @@ -178,39 +144,11 @@ constructor dialog {} { pack $w.buttons.cancel -side right -padx 5 pack $w.buttons -side bottom -fill x -pady 10 -padx 10 - labelframe $w.source -text {Source Branches} - set w_list $w.source.l - listbox $w_list \ - -height 10 \ - -width 70 \ - -font font_diff \ - -selectmode browse \ - -yscrollcommand [list $w.source.sby set] - scrollbar $w.source.sby -command [list $w_list yview] - pack $w.source.sby -side right -fill y - pack $w_list -side left -fill both -expand 1 - pack $w.source -fill both -expand 1 -pady 5 -padx 5 - - foreach ref $list { - set n [lindex $ref 0] - if {[string length $n] > 20} { - set n "[string range $n 0 16]..." - } - $w_list insert end [format {%s %-20s %s} \ - [string range [lindex $ref 1] 0 5] \ - $n \ - $subj([lindex $ref 0])] - } - - bind $w_list [list event generate %W ] - bind $w_list [list event generate %W ] - bind $w_list [list event generate %W ] - bind $w_list [list event generate %W ] - bind $w_list [list event generate %W ] - bind $w_list [list event generate %W ] - bind $w_list $_visualize + set w_rev [::choose_rev::new_unmerged $w.rev {Revision To Merge}] + pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5 bind $w <$M1B-Key-Return> $_start + bind $w $_start bind $w [cb _visible] bind $w [cb _cancel] wm protocol $w WM_DELETE_WINDOW [cb _cancel] @@ -219,7 +157,10 @@ constructor dialog {} { method _visible {} { grab $w - focus $w_list + if {[is_config_true gui.matchtrackingbranch]} { + $w_rev pick_tracking_branch + } + $w_rev focus_filter } method _cancel {} { -- 2.45.2