提交 1fc4ba86 编写于 作者: S Shawn O. Pearce

git-gui: Include commit id/subject in merge choices

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: NShawn O. Pearce <spearce@spearce.org>
上级 349f92e3
...@@ -63,28 +63,28 @@ You should complete the current commit before starting a merge. Doing so will h ...@@ -63,28 +63,28 @@ You should complete the current commit before starting a merge. Doing so will h
return 1 return 1
} }
proc _visualize {w} { proc _refs {w list} {
set revs {} set r {}
foreach i [$w.source.l curselection] { 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 if {$revs eq {}} return
lappend revs --not HEAD lappend revs --not HEAD
do_gitk $revs do_gitk $revs
} }
proc _start {w} { proc _start {w list} {
global HEAD ui_status_value current_branch global HEAD ui_status_value current_branch
set cmd [list git merge] set cmd [list git merge]
set names {} set names [_refs $w $list]
set revcnt 0 set revcnt [llength $names]
foreach i [$w.source.l curselection] { append cmd { } $names
set b [$w.source.l get $i]
lappend cmd $b
lappend names $b
incr revcnt
}
if {$revcnt == 0} { if {$revcnt == 0} {
return return
...@@ -163,6 +163,36 @@ proc dialog {} { ...@@ -163,6 +163,36 @@ proc dialog {} {
if {![_can_merge]} return 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 set w .merge_setup
toplevel $w toplevel $w
wm geometry $w "+[winfo rootx .]+[winfo rooty .]" wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
...@@ -174,10 +204,10 @@ proc dialog {} { ...@@ -174,10 +204,10 @@ proc dialog {} {
frame $w.buttons frame $w.buttons
button $w.buttons.visualize -text Visualize \ 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 pack $w.buttons.visualize -side left
button $w.buttons.create -text Merge \ 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 pack $w.buttons.create -side right
button $w.buttons.cancel -text {Cancel} \ button $w.buttons.cancel -text {Cancel} \
-command [list destroy $w] -command [list destroy $w]
...@@ -188,6 +218,7 @@ proc dialog {} { ...@@ -188,6 +218,7 @@ proc dialog {} {
listbox $w.source.l \ listbox $w.source.l \
-height 10 \ -height 10 \
-width 70 \ -width 70 \
-font font_diff \
-selectmode extended \ -selectmode extended \
-yscrollcommand [list $w.source.sby set] -yscrollcommand [list $w.source.sby set]
scrollbar $w.source.sby -command [list $w.source.l yview] scrollbar $w.source.sby -command [list $w.source.l yview]
...@@ -195,40 +226,18 @@ proc dialog {} { ...@@ -195,40 +226,18 @@ proc dialog {} {
pack $w.source.l -side left -fill both -expand 1 pack $w.source.l -side left -fill both -expand 1
pack $w.source -fill both -expand 1 -pady 5 -padx 5 pack $w.source -fill both -expand 1 -pady 5 -padx 5
set fmt {list %(objectname) %(*objectname) %(refname) %(subject)} foreach ref $to_show {
set cmd [list git for-each-ref --tcl --format=$fmt] set n [lindex $ref 0]
lappend cmd refs/heads if {[string length $n] > 20} {
lappend cmd refs/remotes set n "[string range $n 0 16]..."
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
} }
} $w.source.l insert end [format {%s %-20s %s} \
close $fr_fd [string range [lindex $ref 1] 0 5] \
$n \
foreach ref [lsort -unique $to_show] { $subj([lindex $ref 0])]
$w.source.l insert end $ref
} }
bind $w <Visibility> "grab $w" bind $w <Visibility> "grab $w; focus $w.source.l"
bind $w <Key-Escape> "unlock_index;destroy $w" bind $w <Key-Escape> "unlock_index;destroy $w"
bind $w <Destroy> unlock_index bind $w <Destroy> unlock_index
wm title $w "[appname] ([reponame]): Merge" wm title $w "[appname] ([reponame]): Merge"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册