git-gui: Include commit id/subject in merge choices
authorShawn O. Pearce <spearce@spearce.org>
Thu, 3 May 2007 22:21:39 +0000 (18:21 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 8 May 2007 03:35:52 +0000 (23:35 -0400)
When merging branches using our local merge feature it can be
handy to know the first few digits of the commit the ref points
at as well as the short description of the branch name.

Unfortunately I'm unable to use three listboxes in a row, as Tcl
freaks out and refuses to let me have a selection in more than
one of them at any given point in time.  So instead we use a
fixed width font in the existing listbox and organize the data
into three columns.  Not nearly as nice looking, but users can
continue to use the listbox's features.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
lib/merge.tcl

index 8a07660e156ae3c3f4b9b05455064d30405ea193..304490a276c80a51a39b4173eba37cd68b5b0ff8 100644 (file)
@@ -63,28 +63,28 @@ You should complete the current commit before starting a merge.  Doing so will h
        return 1
 }
 
-proc _visualize {w} {
-       set revs {}
+proc _refs {w list} {
+       set r {}
        foreach i [$w.source.l curselection] {
-               lappend revs [$w.source.l get $i]
+               lappend r [lindex [lindex $list $i] 0]
        }
+       return $r
+}
+
+proc _visualize {w list} {
+       set revs [_refs $w $list]
        if {$revs eq {}} return
        lappend revs --not HEAD
        do_gitk $revs
 }
 
-proc _start {w} {
+proc _start {w list} {
        global HEAD ui_status_value current_branch
 
        set cmd [list git merge]
-       set names {}
-       set revcnt 0
-       foreach i [$w.source.l curselection] {
-               set b [$w.source.l get $i]
-               lappend cmd $b
-               lappend names $b
-               incr revcnt
-       }
+       set names [_refs $w $list]
+       set revcnt [llength $names]
+       append cmd { } $names
 
        if {$revcnt == 0} {
                return
@@ -163,6 +163,36 @@ proc dialog {} {
 
        if {![_can_merge]} return
 
+       set fmt {list %(objectname) %(*objectname) %(refname) %(subject)}
+       set cmd [list git for-each-ref --tcl --format=$fmt]
+       lappend cmd refs/heads
+       lappend cmd refs/remotes
+       lappend cmd refs/tags
+       set fr_fd [open "| $cmd" r]
+       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 to_show {}
+       set fr_fd [open "| git rev-list --all --not HEAD"]
+       while {[gets $fr_fd line] > 0} {
+               if {[catch {set ref $sha1($line)}]} continue
+               foreach n $ref {
+                       lappend to_show [list $n $line]
+               }
+       }
+       close $fr_fd
+       set to_show [lsort -unique $to_show]
+
        set w .merge_setup
        toplevel $w
        wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
@@ -174,10 +204,10 @@ proc dialog {} {
 
        frame $w.buttons
        button $w.buttons.visualize -text Visualize \
-               -command [namespace code [list _visualize $w]]
+               -command [namespace code [list _visualize $w $to_show]]
        pack $w.buttons.visualize -side left
        button $w.buttons.create -text Merge \
-               -command [namespace code [list _start $w]]
+               -command [namespace code [list _start $w $to_show]]
        pack $w.buttons.create -side right
        button $w.buttons.cancel -text {Cancel} \
                -command [list destroy $w]
@@ -188,6 +218,7 @@ proc dialog {} {
        listbox $w.source.l \
                -height 10 \
                -width 70 \
+               -font font_diff \
                -selectmode extended \
                -yscrollcommand [list $w.source.sby set]
        scrollbar $w.source.sby -command [list $w.source.l yview]
@@ -195,40 +226,18 @@ proc dialog {} {
        pack $w.source.l -side left -fill both -expand 1
        pack $w.source -fill both -expand 1 -pady 5 -padx 5
 
-       set fmt {list %(objectname) %(*objectname) %(refname) %(subject)}
-       set cmd [list git for-each-ref --tcl --format=$fmt]
-       lappend cmd refs/heads
-       lappend cmd refs/remotes
-       lappend cmd refs/tags
-       set fr_fd [open "| $cmd" r]
-       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 to_show {}
-       set fr_fd [open "| git rev-list --all --not HEAD"]
-       while {[gets $fr_fd line] > 0} {
-               if {[catch {set ref $sha1($line)}]} continue
-               foreach n $ref {
-                       lappend to_show $n
+       foreach ref $to_show {
+               set n [lindex $ref 0]
+               if {[string length $n] > 20} {
+                       set n "[string range $n 0 16]..."
                }
-       }
-       close $fr_fd
-
-       foreach ref [lsort -unique $to_show] {
-               $w.source.l insert end $ref
+               $w.source.l insert end [format {%s %-20s %s} \
+                       [string range [lindex $ref 1] 0 5] \
+                       $n \
+                       $subj([lindex $ref 0])]
        }
 
-       bind $w <Visibility> "grab $w"
+       bind $w <Visibility> "grab $w; focus $w.source.l"
        bind $w <Key-Escape> "unlock_index;destroy $w"
        bind $w <Destroy> unlock_index
        wm title $w "[appname] ([reponame]): Merge"