* [PATCH 0/7] gitk: UI enhancements @ 2008-10-08 7:05 Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras This is a set of patches that enhance the UI in various ways. They should be applied in order, and after the previous 4 patches that deal with encodings. The previous set of patches is apparently not applied yet, but I feel that I should not hold these back any longer. If Robin Rosenberg's series gets accepted first, I'll rebase and resend the patches. Alexander Gavrilov (7): gitk: Enhance UI popup and accelerator handling. gitk: Allow forcing branch creation if it already exists. gitk: Allow starting gui blame for a specific line. gitk: Fix file list context menu for merge commits. gitk: Make cherry-pick call git-citool on conflicts. gitk: Implement a user-friendly Edit View dialog. gitk: Explicitly position popup windows. gitk | 550 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 471 insertions(+), 79 deletions(-) ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-08 7:05 [PATCH 0/7] gitk: UI enhancements Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov ` (3 more replies) 0 siblings, 4 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras - Popups are supposed to be marked transient, otherwise the WM creates them in strange places. Besides, at least under kwin, transients are automatically kept above their parent. - Accelerators for menu items should be listed directly on the items, to make them more discoverable. - Some more accelerators are added, e.g. F4 for Edit View. - Finally, dialogs can now be accepted or dismissed using the Return and Escape keys. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 73 insertions(+), 23 deletions(-) diff --git a/gitk b/gitk index e6c2a17..a4ef736 100755 --- a/gitk +++ b/gitk @@ -1710,22 +1710,24 @@ proc show_error {w top msg} { pack $w.ok -side bottom -fill x bind $top <Visibility> "grab $top; focus $top" bind $top <Key-Return> "destroy $top" + bind $top <Key-space> "destroy $top" + bind $top <Key-Escape> "destroy $top" tkwait window $top } -proc error_popup msg { +proc error_popup {msg {owner .}} { set w .error toplevel $w - wm transient $w . + wm transient $w $owner show_error $w $w $msg } -proc confirm_popup msg { +proc confirm_popup {msg {owner .}} { global confirm_ok set confirm_ok 0 set w .confirm toplevel $w - wm transient $w . + wm transient $w $owner message $w.m -text $msg -justify center -aspect 400 pack $w.m -side top -fill x -padx 20 -pady 20 button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w" @@ -1733,6 +1735,9 @@ proc confirm_popup msg { button $w.cancel -text [mc Cancel] -command "destroy $w" pack $w.cancel -side right -fill x bind $w <Visibility> "grab $w; focus $w" + bind $w <Key-Return> "set confirm_ok 1; destroy $w" + bind $w <Key-space> "set confirm_ok 1; destroy $w" + bind $w <Key-Escape> "destroy $w" tkwait window $w return $confirm_ok } @@ -1767,22 +1772,28 @@ proc makewindow {} { global rprogitem rprogcoord rownumsel numcommits global have_tk85 + if {[tk windowingsystem] eq {aqua}} { + set M1T Cmd + } else { + set M1T Ctrl + } + menu .bar .bar add cascade -label [mc "File"] -menu .bar.file menu .bar.file - .bar.file add command -label [mc "Update"] -command updatecommits - .bar.file add command -label [mc "Reload"] -command reloadcommits + .bar.file add command -label [mc "Update"] -accelerator F5 -command updatecommits + .bar.file add command -label [mc "Reload"] -accelerator $M1T-F5 -command reloadcommits .bar.file add command -label [mc "Reread references"] -command rereadrefs - .bar.file add command -label [mc "List references"] -command showrefs - .bar.file add command -label [mc "Quit"] -command doquit + .bar.file add command -label [mc "List references"] -accelerator F2 -command showrefs + .bar.file add command -label [mc "Quit"] -accelerator $M1T-Q -command doquit menu .bar.edit .bar add cascade -label [mc "Edit"] -menu .bar.edit .bar.edit add command -label [mc "Preferences"] -command doprefs menu .bar.view .bar add cascade -label [mc "View"] -menu .bar.view - .bar.view add command -label [mc "New view..."] -command {newview 0} - .bar.view add command -label [mc "Edit view..."] -command editview \ + .bar.view add command -label [mc "New view..."] -accelerator Shift-F4 -command {newview 0} + .bar.view add command -label [mc "Edit view..."] -accelerator F4 -command editview \ -state disabled .bar.view add command -label [mc "Delete view"] -command delview -state disabled .bar.view add separator @@ -2146,7 +2157,12 @@ proc makewindow {} { bindkey <Key-Return> {dofind 1 1} bindkey ? {dofind -1 1} bindkey f nextfile - bindkey <F5> updatecommits + bind . <F5> updatecommits + bind . <$M1B-F5> reloadcommits + bind . <F2> showrefs + bind . <Shift-F4> {newview 0} + catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } + bind . <F4> edit_or_newview bind . <$M1B-q> doquit bind . <$M1B-f> {dofind 1 1} bind . <$M1B-g> {dofind 1 0} @@ -2456,6 +2472,7 @@ proc about {} { } toplevel $w wm title $w [mc "About gitk"] + wm transient $w . message $w.m -text [mc " Gitk - a commit viewer for git @@ -2484,10 +2501,10 @@ proc keys {} { } toplevel $w wm title $w [mc "Gitk key bindings"] + wm transient $w . message $w.m -text " [mc "Gitk key bindings:"] -[mc "<%s-Q> Quit" $M1T] [mc "<Home> Move to first commit"] [mc "<End> Move to last commit"] [mc "<Up>, p, i Move up one commit"] @@ -2521,11 +2538,11 @@ proc keys {} { [mc "<%s-plus> Increase font size" $M1T] [mc "<%s-KP-> Decrease font size" $M1T] [mc "<%s-minus> Decrease font size" $M1T] -[mc "<F5> Update"] " \ -justify left -bg white -border 2 -relief groove pack $w.m -side top -fill both -padx 2 -pady 2 button $w.ok -text [mc "Close"] -command "destroy $w" -default active + bind $w <Key-Escape> [list destroy $w] pack $w.ok -side bottom bind $w <Visibility> "focus $w.ok" bind $w <Key-Escape> "destroy $w" @@ -3171,6 +3188,16 @@ proc newview {ishighlight} { vieweditor $top $nextviewnum [mc "Gitk view definition"] } +proc edit_or_newview {} { + global curview + + if {$curview > 0} { + editview + } else { + newview 0 + } +} + proc editview {} { global curview global viewname viewperm newviewname newviewperm @@ -3193,6 +3220,7 @@ proc vieweditor {top n title} { toplevel $top wm title $top $title + wm transient $top . label $top.nl -text [mc "Name"] entry $top.name -width 20 -textvariable newviewname($n) grid $top.nl $top.name -sticky w -pady 5 @@ -3229,6 +3257,7 @@ proc vieweditor {top n title} { frame $top.buts button $top.buts.ok -text [mc "OK"] -command [list newviewok $top $n] button $top.buts.can -text [mc "Cancel"] -command [list destroy $top] + bind $top <Escape> [list destroy $top] grid $top.buts.ok $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -3261,9 +3290,7 @@ proc newviewok {top n} { if {[catch { set newargs [shellsplit $newviewargs($n)] } err]} { - error_popup "[mc "Error in commit selection arguments:"] $err" - wm raise $top - focus $top + error_popup "[mc "Error in commit selection arguments:"] $err" $top return } set files {} @@ -7367,6 +7394,7 @@ proc mkpatch {} { set patchtop $top catch {destroy $top} toplevel $top + wm transient $top . label $top.title -text [mc "Generate patch"] grid $top.title - -pady 10 label $top.from -text [mc "From:"] @@ -7397,6 +7425,8 @@ proc mkpatch {} { frame $top.buts button $top.buts.gen -text [mc "Generate"] -command mkpatchgo button $top.buts.can -text [mc "Cancel"] -command mkpatchcan + bind $top <Key-Return> mkpatchgo + bind $top <Key-Escape> mkpatchcan grid $top.buts.gen $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -7431,7 +7461,7 @@ proc mkpatchgo {} { set cmd [lrange $cmd 1 end] lappend cmd >$fname & if {[catch {eval exec $cmd} err]} { - error_popup "[mc "Error creating patch:"] $err" + error_popup "[mc "Error creating patch:"] $err" $patchtop } catch {destroy $patchtop} unset patchtop @@ -7451,6 +7481,7 @@ proc mktag {} { set mktagtop $top catch {destroy $top} toplevel $top + wm transient $top . label $top.title -text [mc "Create tag"] grid $top.title - -pady 10 label $top.id -text [mc "ID:"] @@ -7468,6 +7499,8 @@ proc mktag {} { frame $top.buts button $top.buts.gen -text [mc "Create"] -command mktaggo button $top.buts.can -text [mc "Cancel"] -command mktagcan + bind $top <Key-Return> mktaggo + bind $top <Key-Escape> mktagcan grid $top.buts.gen $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -7481,17 +7514,17 @@ proc domktag {} { set id [$mktagtop.sha1 get] set tag [$mktagtop.tag get] if {$tag == {}} { - error_popup [mc "No tag name specified"] + error_popup [mc "No tag name specified"] $mktagtop return } if {[info exists tagids($tag)]} { - error_popup [mc "Tag \"%s\" already exists" $tag] + error_popup [mc "Tag \"%s\" already exists" $tag] $mktagtop return } if {[catch { exec git tag $tag $id } err]} { - error_popup "[mc "Error creating tag:"] $err" + error_popup "[mc "Error creating tag:"] $err" $mktagtop return } @@ -7501,6 +7534,7 @@ proc domktag {} { addedtag $id dispneartags 0 run refill_reflist + return 1 } proc redrawtags {id} { @@ -7539,7 +7573,7 @@ proc mktagcan {} { } proc mktaggo {} { - domktag + if {![domktag]} return mktagcan } @@ -7550,6 +7584,7 @@ proc writecommit {} { set wrcomtop $top catch {destroy $top} toplevel $top + wm transient $top . label $top.title -text [mc "Write commit to file"] grid $top.title - -pady 10 label $top.id -text [mc "ID:"] @@ -7571,6 +7606,8 @@ proc writecommit {} { frame $top.buts button $top.buts.gen -text [mc "Write"] -command wrcomgo button $top.buts.can -text [mc "Cancel"] -command wrcomcan + bind $top <Key-Return> wrcomgo + bind $top <Key-Escape> wrcomcan grid $top.buts.gen $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -7585,7 +7622,7 @@ proc wrcomgo {} { set cmd "echo $id | [$wrcomtop.cmd get]" set fname [$wrcomtop.fname get] if {[catch {exec sh -c $cmd >$fname &} err]} { - error_popup "[mc "Error writing commit:"] $err" + error_popup "[mc "Error writing commit:"] $err" $wrcomtop } catch {destroy $wrcomtop} unset wrcomtop @@ -7604,6 +7641,7 @@ proc mkbranch {} { set top .makebranch catch {destroy $top} toplevel $top + wm transient $top . label $top.title -text [mc "Create new branch"] grid $top.title - -pady 10 label $top.id -text [mc "ID:"] @@ -7617,6 +7655,8 @@ proc mkbranch {} { frame $top.buts button $top.buts.go -text [mc "Create"] -command [list mkbrgo $top] button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}" + bind $top <Key-Return> [list mkbrgo $top] + bind $top <Key-Escape> "catch {destroy $top}" grid $top.buts.go $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -7630,7 +7670,7 @@ proc mkbrgo {top} { set name [$top.name get] set id [$top.sha1 get] if {$name eq {}} { - error_popup [mc "Please specify a name for the new branch"] + error_popup [mc "Please specify a name for the new branch"] $top return } catch {destroy $top} @@ -7723,6 +7763,7 @@ proc resethead {} { button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w" pack $w.ok -side left -fill x -padx 20 -pady 20 button $w.cancel -text [mc Cancel] -command "destroy $w" + bind $w <Key-Escape> [list destroy $w] pack $w.cancel -side right -fill x -padx 20 -pady 20 bind $w <Visibility> "grab $w; focus $w" tkwait window $w @@ -7879,6 +7920,7 @@ proc showrefs {} { } toplevel $top wm title $top [mc "Tags and heads: %s" [file tail [pwd]]] + wm transient $top . text $top.list -background $bgcolor -foreground $fgcolor \ -selectbackground $selectbgcolor -font mainfont \ -xscrollcommand "$top.xsb set" -yscrollcommand "$top.ysb set" \ @@ -7900,6 +7942,7 @@ proc showrefs {} { pack $top.f.l -side left grid $top.f - -sticky ew -pady 2 button $top.close -command [list destroy $top] -text [mc "Close"] + bind $top <Key-Escape> [list destroy $top] grid $top.close - grid columnconfigure $top 0 -weight 1 grid rowconfigure $top 0 -weight 1 @@ -9205,6 +9248,7 @@ proc mkfontdisp {font top which} { proc choosefont {font which} { global fontparam fontlist fonttop fontattr + global prefstop set fontparam(which) $which set fontparam(font) $font @@ -9218,6 +9262,7 @@ proc choosefont {font which} { font create sample eval font config sample [font actual $font] toplevel $top + wm transient $top $prefstop wm title $top [mc "Gitk font chooser"] label $top.l -textvariable fontparam(which) pack $top.l -side top @@ -9251,6 +9296,8 @@ proc choosefont {font which} { frame $top.buts button $top.buts.ok -text [mc "OK"] -command fontok -default active button $top.buts.can -text [mc "Cancel"] -command fontcan -default normal + bind $top <Key-Return> fontok + bind $top <Key-Escape> fontcan grid $top.buts.ok $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a @@ -9332,6 +9379,7 @@ proc doprefs {} { } toplevel $top wm title $top [mc "Gitk preferences"] + wm transient $top . label $top.ldisp -text [mc "Commit list display options"] grid $top.ldisp - -sticky w -pady 10 label $top.spacer -text " " @@ -9419,6 +9467,8 @@ proc doprefs {} { frame $top.buts button $top.buts.ok -text [mc "OK"] -command prefsok -default active button $top.buts.can -text [mc "Cancel"] -command prefscan -default normal + bind $top <Key-Return> prefsok + bind $top <Key-Escape> prefscan grid $top.buts.ok $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 2/7] gitk: Allow forcing branch creation if it already exists. 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Alexander Gavrilov 2008-10-21 11:38 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Paul Mackerras 2008-10-09 0:27 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Paul Mackerras ` (2 subsequent siblings) 3 siblings, 2 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras If gitk knows that the branch the user tries to create exists, it should ask whether it should overwrite it. This way the user can either decide to choose a new name, or move the head while preserving the reflog. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 28 +++++++++++++++++++++++----- 1 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gitk b/gitk index a4ef736..96ca965 100755 --- a/gitk +++ b/gitk @@ -7669,24 +7669,42 @@ proc mkbrgo {top} { set name [$top.name get] set id [$top.sha1 get] + set cmdargs [list] + set old_id {} if {$name eq {}} { error_popup [mc "Please specify a name for the new branch"] $top return } + if {[info exists headids($name)]} { + if {![confirm_popup [mc \ + "Branch '%s' already exists. Overwrite?" $name] $top]} { + return + } + set old_id $headids($name) + lappend cmdargs -f + } catch {destroy $top} + lappend cmdargs $name $id nowbusy newbranch update if {[catch { - exec git branch $name $id + eval exec git branch $cmdargs } err]} { notbusy newbranch error_popup $err } else { - set headids($name) $id - lappend idheads($id) $name - addedhead $id $name notbusy newbranch - redrawtags $id + if {$old_id ne {}} { + movehead $id $name + movedhead $id $name + redrawtags $old_id + redrawtags $id + } else { + set headids($name) $id + lappend idheads($id) $name + addedhead $id $name + redrawtags $id + } dispneartags 0 run refill_reflist } -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Alexander Gavrilov 2008-10-23 11:58 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Paul Mackerras 2008-10-21 11:38 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Paul Mackerras 1 sibling, 2 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras Adds a context menu item to the diff viewer pane that calls blame, focusing it on the clicked line. In case of combined diffs, it also automatically deduces which parent is to be blamed. The context menu itself is added by this patch. It is possible to populate it with commands from the flist menu. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 133 insertions(+), 2 deletions(-) diff --git a/gitk b/gitk index 96ca965..3c77909 100755 --- a/gitk +++ b/gitk @@ -2184,6 +2184,7 @@ proc makewindow {} { bind $cflist <ButtonRelease-1> {treeclick %W %x %y} global ctxbut bind $cflist $ctxbut {pop_flist_menu %W %X %Y %x %y} + bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y} set maincursor [. cget -cursor] set textcursor [$ctext cget -cursor] @@ -2233,6 +2234,12 @@ proc makewindow {} { -command {external_diff} $flist_menu add command -label [mc "Blame parent commit"] \ -command {external_blame 1} + + global diff_menu + set diff_menu .diffctxmenu + menu $diff_menu -tearoff 0 + $diff_menu add command -label [mc "Blame parent commit"] \ + -command {external_blame_diff} } # Windows sends all mouse wheel events to the current focused window, not @@ -2935,6 +2942,34 @@ proc pop_flist_menu {w X Y x y} { tk_popup $flist_menu $X $Y } +proc find_ctext_fileinfo {line} { + global ctext_file_names ctext_file_lines + + set ok [bsearch $ctext_file_lines $line] + set tline [lindex $ctext_file_lines $ok] + + if {$ok >= [llength $ctext_file_lines] || $line < $tline} { + return {} + } else { + return [list [lindex $ctext_file_names $ok] $tline] + } +} + +proc pop_diff_menu {w X Y x y} { + global ctext diff_menu flist_menu_file + global diff_menu_txtpos diff_menu_line + global diff_menu_filebase + + stopfinding + set diff_menu_txtpos [split [$w index "@$x,$y"] "."] + set diff_menu_line [lindex $diff_menu_txtpos 0] + set f [find_ctext_fileinfo $diff_menu_line] + if {$f eq {}} return + set flist_menu_file [lindex $f 0] + set diff_menu_filebase [lindex $f 1] + tk_popup $diff_menu $X $Y +} + proc flist_hl {only} { global flist_menu_file findstring gdttype @@ -3041,7 +3076,84 @@ proc external_diff {} { } } -proc external_blame {parent_idx} { +proc find_hunk_blamespec {base line} { + global ctext + + # Find and parse the hunk header + set s_lix [$ctext search -backwards -regexp ^@@ "$line.0 lineend" $base.0] + if {$s_lix eq {}} return + + set s_line [$ctext get $s_lix "$s_lix + 1 lines"] + if {![regexp {^@@@?(( -\d+(,\d+)?)+) \+(\d+)(,\d+)? @@} $s_line \ + s_line old_specs osz osz1 new_line nsz]} { + return + } + + # base lines for the parents + set old_lines [list] + foreach old_spec [lrange [split $old_specs " "] 1 end] { + if {![regexp -- {-(\d+)(,\d+)?} $old_spec \ + old_spec old_line osz]} { + return + } + lappend old_lines $old_line + } + + # Now scan the lines to determine offset within the hunk + set parent {} + set dline 0 + set s_lno [lindex [split $s_lix "."] 0] + + for {set i $line} {$i > $s_lno} {incr i -1} { + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] + if {$parent eq {}} { + # find first preceeding line that belongs to some parent + for {set j 0} {$j < [llength $old_lines]} {incr j} { + set code [string index $c_line $j] + if {$code ne {-} && $code ne { }} continue + if {$code eq { } && $parent ne {}} continue + set parent $j + if {$code eq {-}} break + } + } + if {$parent ne {}} { + # then count other lines that belong to it + set code [string index $c_line $parent] + if {$code ne {+}} { + incr dline + } + } + } + + if {$parent eq {}} { set parent 0 } + incr dline [lindex $old_lines $parent] + incr parent + return [list $parent $dline] +} + +proc external_blame_diff {} { + global currentid diffmergeid cmitmode + global diff_menu_txtpos diff_menu_line + global diff_menu_filebase flist_menu_file + + if {$cmitmode eq "tree"} { + set parent_idx 1 + set line [expr {$diff_menu_line - $diff_menu_filebase - 1}] + } else { + set hinfo [find_hunk_blamespec $diff_menu_filebase $diff_menu_line] + if {$hinfo ne {}} { + set parent_idx [lindex $hinfo 0] + set line [lindex $hinfo 1] + } else { + set parent_idx 1 + set line 0 + } + } + + external_blame $parent_idx $line +} + +proc external_blame {parent_idx {line {}}} { global flist_menu_file global nullid nullid2 global parentlist selectedline currentid @@ -3057,7 +3169,12 @@ proc external_blame {parent_idx} { return } - if {[catch {exec git gui blame $base_commit $flist_menu_file &} err]} { + set cmdline [list git gui blame] + if {$line ne {} && $line > 1} { + lappend cmdline "--line=$line" + } + lappend cmdline $base_commit $flist_menu_file + if {[catch {eval exec $cmdline &} err]} { error_popup "[mc "git gui blame: command failed:"] $err" } } @@ -6305,6 +6422,7 @@ proc gettreeline {gtf id} { proc showfile {f} { global treefilelist treeidlist diffids nullid nullid2 + global ctext_file_names ctext_file_lines global ctext commentend set i [lsearch -exact $treefilelist($diffids) $f] @@ -6328,6 +6446,8 @@ proc showfile {f} { filerun $bf [list getblobline $bf $diffids] $ctext config -state normal clear_ctext $commentend + lappend ctext_file_names $f + lappend ctext_file_lines [lindex [split $commentend "."] 0] $ctext insert end "\n" $ctext insert end "$f\n" filesep $ctext config -state disabled @@ -6387,6 +6507,7 @@ proc mergediff {id} { proc getmergediffline {mdf id np} { global diffmergeid ctext cflist mergemax global difffilestart mdifffd + global ctext_file_names ctext_file_lines global diffencoding $ctext conf -state normal @@ -6404,6 +6525,8 @@ proc getmergediffline {mdf id np} { set here [$ctext index "end - 1c"] lappend difffilestart $here add_flist [list $fname] + lappend ctext_file_names $fname + lappend ctext_file_lines [lindex [split $here "."] 0] set diffencoding [get_cached_encoding $fname] set l [expr {(78 - [string length $fname]) / 2}] set pad [string range "----------------------------------------" 1 $l] @@ -6661,11 +6784,13 @@ proc setinlist {var i val} { proc makediffhdr {fname ids} { global ctext curdiffstart treediffs + global ctext_file_names set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { setinlist difffilestart $i $curdiffstart } + set ctext_file_names [lreplace $ctext_file_names end end $fname] set l [expr {(78 - [string length $fname]) / 2}] set pad [string range "----------------------------------------" 1 $l] $ctext insert $curdiffstart "$pad $fname $pad" filesep @@ -6674,6 +6799,7 @@ proc makediffhdr {fname ids} { proc getblobdiffline {bdf ids} { global diffids blobdifffd ctext curdiffstart global diffnexthead diffnextnote difffilestart + global ctext_file_names ctext_file_lines global diffinhdr treediffs global diffencoding @@ -6691,6 +6817,8 @@ proc getblobdiffline {bdf ids} { # start of a new file $ctext insert end "\n" set curdiffstart [$ctext index "end - 1c"] + lappend ctext_file_names "" + lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] $ctext insert end "\n" filesep # If the name hasn't changed the length will be odd, # the middle char will be a space, and the two bits either @@ -6827,6 +6955,7 @@ proc nextfile {} { proc clear_ctext {{first 1.0}} { global ctext smarktop smarkbot + global ctext_file_names ctext_file_lines global pendinglinks set l [lindex [split $first .] 0] @@ -6840,6 +6969,8 @@ proc clear_ctext {{first 1.0}} { if {$first eq "1.0"} { catch {unset pendinglinks} } + set ctext_file_names {} + set ctext_file_lines {} } proc settabs {{firstab {}}} { -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 4/7] gitk: Fix file list context menu for merge commits. 2008-10-08 7:05 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Alexander Gavrilov 2008-10-21 11:39 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Paul Mackerras 2008-10-23 11:58 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Paul Mackerras 1 sibling, 2 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras Currently it displays an ugly error box, because the treediffs array is not filled for such commits. This is clearly unacceptable. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gitk b/gitk index 3c77909..cfaf7a1 100755 --- a/gitk +++ b/gitk @@ -6479,7 +6479,7 @@ proc getblobline {bf id} { proc mergediff {id} { global diffmergeid mdifffd - global diffids + global diffids treediffs global parents global diffcontext global diffencoding @@ -6487,6 +6487,7 @@ proc mergediff {id} { set diffmergeid $id set diffids $id + set treediffs($id) [list ] # this doesn't seem to actually affect anything... set cmd [concat | git diff-tree --no-commit-id --cc -U$diffcontext $id] if {$limitdiffs && $vfilelimit($curview) ne {}} { @@ -6506,7 +6507,7 @@ proc mergediff {id} { proc getmergediffline {mdf id np} { global diffmergeid ctext cflist mergemax - global difffilestart mdifffd + global difffilestart mdifffd treediffs global ctext_file_names ctext_file_lines global diffencoding @@ -6524,6 +6525,7 @@ proc getmergediffline {mdf id np} { $ctext insert end "\n" set here [$ctext index "end - 1c"] lappend difffilestart $here + lappend treediffs($id) $fname add_flist [list $fname] lappend ctext_file_names $fname lappend ctext_file_lines [lindex [split $here "."] 0] -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts. 2008-10-08 7:05 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 6/7] gitk: Implement a user-friendly Edit View dialog Alexander Gavrilov 2008-10-09 7:42 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Paul Mackerras 2008-10-21 11:39 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Paul Mackerras 1 sibling, 2 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras Now that git-gui has facilities to help users resolve conflicts, it makes sense to launch it from other gui tools when they happen. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 58 insertions(+), 1 deletions(-) diff --git a/gitk b/gitk index cfaf7a1..e84e109 100755 --- a/gitk +++ b/gitk @@ -7843,6 +7843,53 @@ proc mkbrgo {top} { } } +proc exec_citool {args {baseid {}}} { + global commitinfo env + + if {[info exists env(GIT_AUTHOR_NAME)]} { + set old_name $env(GIT_AUTHOR_NAME) + } + if {[info exists env(GIT_AUTHOR_EMAIL)]} { + set old_email $env(GIT_AUTHOR_EMAIL) + } + if {[info exists env(GIT_AUTHOR_DATE)]} { + set old_date $env(GIT_AUTHOR_DATE) + } + + if {$baseid ne {}} { + if {![info exists commitinfo($baseid)]} { + getcommit $baseid + } + set author [lindex $commitinfo($baseid) 1] + set date [lindex $commitinfo($baseid) 2] + if {[regexp {^\s*(\S.*\S|\S)\s*<(.*)>\s*$} \ + $author author name email] + && $date ne {}} { + set env(GIT_AUTHOR_NAME) $name + set env(GIT_AUTHOR_EMAIL) $email + set env(GIT_AUTHOR_DATE) $date + } + } + + eval exec git citool $args & + + if {[info exists old_name]} { + set env(GIT_AUTHOR_NAME) $old_name + } else { + unset env(GIT_AUTHOR_NAME) + } + if {[info exists old_email]} { + set env(GIT_AUTHOR_EMAIL) $old_email + } else { + unset env(GIT_AUTHOR_EMAIL) + } + if {[info exists old_date]} { + set env(GIT_AUTHOR_DATE) $old_date + } else { + unset env(GIT_AUTHOR_DATE) + } +} + proc cherrypick {} { global rowmenuid curview global mainhead mainheadid @@ -7861,7 +7908,17 @@ proc cherrypick {} { # no error occurs, and exec takes that as an indication of error... if {[catch {exec sh -c "git cherry-pick -r $rowmenuid 2>&1"} err]} { notbusy cherrypick - error_popup $err + if {[regexp -line \ + {Entry '(.*)' would be overwritten by merge} $err msg fname]} { + error_popup [mc "Cherry-pick failed: file '%s' had local modifications. +Your working directory is in an inconsistent state." $fname] + } elseif {[regexp -line {^CONFLICT \(.*\):} $err msg]} { + # Force citool to read MERGE_MSG + file delete [file join [gitdir] "GITGUI_MSG"] + exec_citool [list] $rowmenuid + } else { + error_popup $err + } return } set newhead [exec git rev-parse HEAD] -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 6/7] gitk: Implement a user-friendly Edit View dialog. 2008-10-08 7:05 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 7/7] gitk: Explicitly position popup windows Alexander Gavrilov 2008-10-09 7:42 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Paul Mackerras 1 sibling, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras Originally gitk required the user to specify all limiting options manually in the same field with the list of commits. It is extremely unfriendly for new users, who may not know which options can be used, or, indeed, that it is possible to specify them at all. This patch modifies the dialog to present the most useful options as individual fields. Note that options that may be useful to an extent, but produce broken view, are deliberately not included. It is still possible to specify options in the commit list field, but when the dialog is reopened, they will be extracted into their own separate fields. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 163 insertions(+), 44 deletions(-) diff --git a/gitk b/gitk index e84e109..c7dd487 100755 --- a/gitk +++ b/gitk @@ -3289,8 +3289,8 @@ proc shellsplit {str} { # Code to implement multiple views proc newview {ishighlight} { - global nextviewnum newviewname newviewperm newishighlight - global newviewargs revtreeargs viewargscmd newviewargscmd curview + global nextviewnum newviewname newishighlight + global revtreeargs viewargscmd newviewopts curview set newishighlight $ishighlight set top .gitkview @@ -3299,9 +3299,9 @@ proc newview {ishighlight} { return } set newviewname($nextviewnum) "[mc "View"] $nextviewnum" - set newviewperm($nextviewnum) 0 - set newviewargs($nextviewnum) [shellarglist $revtreeargs] - set newviewargscmd($nextviewnum) $viewargscmd($curview) + set newviewopts($nextviewnum,perm) 0 + set newviewopts($nextviewnum,cmd) $viewargscmd($curview) + decode_view_opts $nextviewnum $revtreeargs vieweditor $top $nextviewnum [mc "Gitk view definition"] } @@ -3315,53 +3315,167 @@ proc edit_or_newview {} { } } +set known_view_options { + {perm b . {} {mc "Remember this view"}} + {args t50= + {} {mc "Commits to include (arguments to git log):"}} + {all b * "--all" {mc "Use all refs"}} + {dorder b . {"--date-order" "-d"} {mc "Strictly sort by date"}} + {lright b . "--left-right" {mc "Mark branch sides"}} + {since t15 + {"--since=*" "--after=*"} {mc "Since date:"}} + {until t15 . {"--until=*" "--before=*"} {mc "Until date:"}} + {limit t10 + "--max-count=*" {mc "Max count:"}} + {skip t10 . "--skip=*" {mc "Skip:"}} + {first b . "--first-parent" {mc "Limit to first parent"}} + {cmd t50= + {} {mc "Command to generate more commits to include:"}} + } + +proc encode_view_opts {n} { + global known_view_options newviewopts + + set rargs [list] + foreach opt $known_view_options { + set patterns [lindex $opt 3] + if {$patterns eq {}} continue + set pattern [lindex $patterns 0] + + set val $newviewopts($n,[lindex $opt 0]) + + if {[lindex $opt 1] eq "b"} { + if {$val} { + lappend rargs $pattern + } + } else { + set val [string trim $val] + if {$val ne {}} { + set pfix [string range $pattern 0 end-1] + lappend rargs $pfix$val + } + } + } + return [concat $rargs [shellsplit $newviewopts($n,args)]] +} + +proc decode_view_opts {n view_args} { + global known_view_options newviewopts + + foreach opt $known_view_options { + if {[lindex $opt 1] eq "b"} { + set val 0 + } else { + set val {} + } + set newviewopts($n,[lindex $opt 0]) $val + } + set oargs [list] + foreach arg $view_args { + if {[regexp -- {^-([0-9]+)$} $arg arg cnt] + && ![info exists found(limit)]} { + set newviewopts($n,limit) $cnt + set found(limit) 1 + continue + } + catch { unset val } + foreach opt $known_view_options { + set id [lindex $opt 0] + if {[info exists found($id)]} continue + foreach pattern [lindex $opt 3] { + if {![string match $pattern $arg]} continue + if {[lindex $opt 1] ne "b"} { + set size [string length $pattern] + set val [string range $arg [expr {$size-1}] end] + } else { + set val 1 + } + set newviewopts($n,$id) $val + set found($id) 1 + break + } + if {[info exists val]} break + } + if {[info exists val]} continue + lappend oargs $arg + } + set newviewopts($n,args) [shellarglist $oargs] +} + proc editview {} { global curview - global viewname viewperm newviewname newviewperm - global viewargs newviewargs viewargscmd newviewargscmd + global viewname viewperm newviewname newviewopts + global viewargs viewargscmd set top .gitkvedit-$curview if {[winfo exists $top]} { raise $top return } - set newviewname($curview) $viewname($curview) - set newviewperm($curview) $viewperm($curview) - set newviewargs($curview) [shellarglist $viewargs($curview)] - set newviewargscmd($curview) $viewargscmd($curview) + set newviewname($curview) $viewname($curview) + set newviewopts($curview,perm) $viewperm($curview) + set newviewopts($curview,cmd) $viewargscmd($curview) + decode_view_opts $curview $viewargs($curview) vieweditor $top $curview "Gitk: edit view $viewname($curview)" } proc vieweditor {top n title} { - global newviewname newviewperm viewfiles bgcolor + global newviewname newviewopts viewfiles bgcolor + global known_view_options toplevel $top wm title $top $title wm transient $top . + + # View name + frame $top.nfr label $top.nl -text [mc "Name"] entry $top.name -width 20 -textvariable newviewname($n) - grid $top.nl $top.name -sticky w -pady 5 - checkbutton $top.perm -text [mc "Remember this view"] \ - -variable newviewperm($n) - grid $top.perm - -pady 5 -sticky w - message $top.al -aspect 1000 \ - -text [mc "Commits to include (arguments to git log):"] - grid $top.al - -sticky w -pady 5 - entry $top.args -width 50 -textvariable newviewargs($n) \ - -background $bgcolor - grid $top.args - -sticky ew -padx 5 - - message $top.ac -aspect 1000 \ - -text [mc "Command to generate more commits to include:"] - grid $top.ac - -sticky w -pady 5 - entry $top.argscmd -width 50 -textvariable newviewargscmd($n) \ - -background white - grid $top.argscmd - -sticky ew -padx 5 - - message $top.l -aspect 1000 \ + pack $top.nfr -in $top -fill x -pady 5 -padx 3 + pack $top.nl -in $top.nfr -side left -padx {0 30} + pack $top.name -in $top.nfr -side left + + # View options + set cframe $top.nfr + set cexpand 0 + set cnt 0 + foreach opt $known_view_options { + set id [lindex $opt 0] + set type [lindex $opt 1] + set flags [lindex $opt 2] + set title [eval [lindex $opt 4]] + set lxpad 0 + + if {$flags eq "+" || $flags eq "*"} { + set cframe $top.fr$cnt + incr cnt + frame $cframe + pack $cframe -in $top -fill x -pady 3 -padx 3 + set cexpand [expr {$flags eq "*"}] + } else { + set lxpad 5 + } + + if {$type eq "b"} { + checkbutton $cframe.c_$id -text $title -variable newviewopts($n,$id) + pack $cframe.c_$id -in $cframe -side left \ + -padx [list $lxpad 0] -expand $cexpand -anchor w + } elseif {[regexp {^t(\d+)$} $type type sz]} { + message $cframe.l_$id -aspect 1500 -text $title + entry $cframe.e_$id -width $sz -background $bgcolor \ + -textvariable newviewopts($n,$id) + pack $cframe.l_$id -in $cframe -side left -padx [list $lxpad 0] + pack $cframe.e_$id -in $cframe -side left -expand 1 -fill x + } elseif {[regexp {^t(\d+)=$} $type type sz]} { + message $cframe.l_$id -aspect 1500 -text $title + entry $cframe.e_$id -width $sz -background $bgcolor \ + -textvariable newviewopts($n,$id) + pack $cframe.l_$id -in $cframe -side top -pady [list 3 0] -anchor w + pack $cframe.e_$id -in $cframe -side top -fill x + } + } + + # Path list + message $top.l -aspect 1500 \ -text [mc "Enter files and directories to include, one per line:"] - grid $top.l - -sticky w - text $top.t -width 40 -height 10 -background $bgcolor -font uifont + pack $top.l -in $top -side top -pady [list 7 0] -anchor w -padx 3 + text $top.t -width 40 -height 5 -background $bgcolor -font uifont if {[info exists viewfiles($n)]} { foreach f $viewfiles($n) { $top.t insert end $f @@ -3370,15 +3484,19 @@ proc vieweditor {top n title} { $top.t delete {end - 1c} end $top.t mark set insert 0.0 } - grid $top.t - -sticky ew -padx 5 + pack $top.t -in $top -side top -pady [list 0 5] -fill both -expand 1 -padx 3 frame $top.buts button $top.buts.ok -text [mc "OK"] -command [list newviewok $top $n] + button $top.buts.apply -text [mc "Apply (F5)"] -command [list newviewok $top $n 1] button $top.buts.can -text [mc "Cancel"] -command [list destroy $top] + bind $top <Control-Return> [list newviewok $top $n] + bind $top <F5> [list newviewok $top $n 1] bind $top <Escape> [list destroy $top] - grid $top.buts.ok $top.buts.can + grid $top.buts.ok $top.buts.apply $top.buts.can grid columnconfigure $top.buts 0 -weight 1 -uniform a grid columnconfigure $top.buts 1 -weight 1 -uniform a - grid $top.buts - -pady 10 -sticky ew + grid columnconfigure $top.buts 2 -weight 1 -uniform a + pack $top.buts -in $top -side top -fill x focus $top.t } @@ -3399,13 +3517,13 @@ proc allviewmenus {n op args} { # doviewmenu $viewhlmenu 1 [list addvhighlight $n] $op $args } -proc newviewok {top n} { +proc newviewok {top n {apply 0}} { global nextviewnum newviewperm newviewname newishighlight global viewname viewfiles viewperm selectedview curview - global viewargs newviewargs viewargscmd newviewargscmd viewhlmenu + global viewargs viewargscmd newviewopts viewhlmenu if {[catch { - set newargs [shellsplit $newviewargs($n)] + set newargs [encode_view_opts $n] } err]} { error_popup "[mc "Error in commit selection arguments:"] $err" $top return @@ -3421,10 +3539,10 @@ proc newviewok {top n} { # creating a new view incr nextviewnum set viewname($n) $newviewname($n) - set viewperm($n) $newviewperm($n) + set viewperm($n) $newviewopts($n,perm) set viewfiles($n) $files set viewargs($n) $newargs - set viewargscmd($n) $newviewargscmd($n) + set viewargscmd($n) $newviewopts($n,cmd) addviewmenu $n if {!$newishighlight} { run showview $n @@ -3433,7 +3551,7 @@ proc newviewok {top n} { } } else { # editing an existing view - set viewperm($n) $newviewperm($n) + set viewperm($n) $newviewopts($n,perm) if {$newviewname($n) ne $viewname($n)} { set viewname($n) $newviewname($n) doviewmenu .bar.view 5 [list showview $n] \ @@ -3442,15 +3560,16 @@ proc newviewok {top n} { # entryconf [list -label $viewname($n) -value $viewname($n)] } if {$files ne $viewfiles($n) || $newargs ne $viewargs($n) || \ - $newviewargscmd($n) ne $viewargscmd($n)} { + $newviewopts($n,cmd) ne $viewargscmd($n)} { set viewfiles($n) $files set viewargs($n) $newargs - set viewargscmd($n) $newviewargscmd($n) + set viewargscmd($n) $newviewopts($n,cmd) if {$curview == $n} { run reloadcommits } } } + if {$apply} return catch {destroy $top} } -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 7/7] gitk: Explicitly position popup windows. 2008-10-08 7:05 ` [PATCH 6/7] gitk: Implement a user-friendly Edit View dialog Alexander Gavrilov @ 2008-10-08 7:05 ` Alexander Gavrilov 2008-10-21 11:41 ` Paul Mackerras 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-08 7:05 UTC (permalink / raw) To: git; +Cc: Paul Mackerras For some reason, on Windows all transient windows are placed in the upper left corner of the screen. Thus, it is necessary to explicitly position the windows using the tk::PlaceWindow function. Reference list and the Edit View dialog are positioned under the mouse cursor, thus allowing the user to create them in a convenient place using keyboard shortcuts, and providing a sane position when opened through the menu. Other popups are centered on the main window. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gitk b/gitk index c7dd487..9e580a6 100755 --- a/gitk +++ b/gitk @@ -1703,7 +1703,7 @@ proc removehead {id name} { unset headids($name) } -proc show_error {w top msg} { +proc show_error {w top msg {owner {}}} { message $w.m -text $msg -justify center -aspect 400 pack $w.m -side top -fill x -padx 20 -pady 20 button $w.ok -text [mc OK] -command "destroy $top" @@ -1712,6 +1712,9 @@ proc show_error {w top msg} { bind $top <Key-Return> "destroy $top" bind $top <Key-space> "destroy $top" bind $top <Key-Escape> "destroy $top" + if {$owner ne {}} { + tk::PlaceWindow $top widget $owner + } tkwait window $top } @@ -1719,7 +1722,7 @@ proc error_popup {msg {owner .}} { set w .error toplevel $w wm transient $w $owner - show_error $w $w $msg + show_error $w $w $msg $owner } proc confirm_popup {msg {owner .}} { @@ -1738,6 +1741,7 @@ proc confirm_popup {msg {owner .}} { bind $w <Key-Return> "set confirm_ok 1; destroy $w" bind $w <Key-space> "set confirm_ok 1; destroy $w" bind $w <Key-Escape> "destroy $w" + tk::PlaceWindow $w widget $owner tkwait window $w return $confirm_ok } @@ -2493,6 +2497,7 @@ Use and redistribute under the terms of the GNU General Public License"] \ bind $w <Visibility> "focus $w.ok" bind $w <Key-Escape> "destroy $w" bind $w <Key-Return> "destroy $w" + tk::PlaceWindow $w widget . } proc keys {} { @@ -2554,6 +2559,7 @@ proc keys {} { bind $w <Visibility> "focus $w.ok" bind $w <Key-Escape> "destroy $w" bind $w <Key-Return> "destroy $w" + tk::PlaceWindow $w widget . } # Procedures for manipulating the file list window at the @@ -3497,6 +3503,7 @@ proc vieweditor {top n title} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid columnconfigure $top.buts 2 -weight 1 -uniform a pack $top.buts -in $top -side top -fill x + tk::PlaceWindow $top pointer . focus $top.t } @@ -7684,6 +7691,7 @@ proc mkpatch {} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid $top.buts - -pady 10 -sticky ew focus $top.fname + tk::PlaceWindow $top widget . } proc mkpatchrev {} { @@ -7758,6 +7766,7 @@ proc mktag {} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid $top.buts - -pady 10 -sticky ew focus $top.tag + tk::PlaceWindow $top widget . } proc domktag {} { @@ -7865,6 +7874,7 @@ proc writecommit {} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid $top.buts - -pady 10 -sticky ew focus $top.fname + tk::PlaceWindow $top widget . } proc wrcomgo {} { @@ -7914,6 +7924,7 @@ proc mkbranch {} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid $top.buts - -pady 10 -sticky ew focus $top.name + tk::PlaceWindow $top widget . } proc mkbrgo {top} { @@ -8093,6 +8104,7 @@ proc resethead {} { bind $w <Key-Escape> [list destroy $w] pack $w.cancel -side right -fill x -padx 20 -pady 20 bind $w <Visibility> "grab $w; focus $w" + tk::PlaceWindow $w widget . tkwait window $w if {!$confirm_ok} return if {[catch {set fd [open \ @@ -8278,6 +8290,7 @@ proc showrefs {} { bind $top.list <ButtonRelease-1> {sel_reflist %W %x %y; break} set reflist {} refill_reflist + tk::PlaceWindow $top pointer . } proc sel_reflist {w x y} { @@ -9630,6 +9643,7 @@ proc choosefont {font which} { grid columnconfigure $top.buts 1 -weight 1 -uniform a pack $top.buts -side bottom -fill x trace add variable fontparam write chg_fontparam + tk::PlaceWindow $top widget $prefstop } else { raise $top $top.c itemconf text -text $which @@ -9801,6 +9815,7 @@ proc doprefs {} { grid columnconfigure $top.buts 1 -weight 1 -uniform a grid $top.buts - - -pady 10 -sticky ew bind $top <Visibility> "focus $top.buts.ok" + tk::PlaceWindow $top widget . } proc choose_extdiff {} { -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 7/7] gitk: Explicitly position popup windows. 2008-10-08 7:05 ` [PATCH 7/7] gitk: Explicitly position popup windows Alexander Gavrilov @ 2008-10-21 11:41 ` Paul Mackerras 2008-10-21 12:52 ` Alexander Gavrilov 0 siblings, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-21 11:41 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > For some reason, on Windows all transient windows are placed > in the upper left corner of the screen. Thus, it is necessary > to explicitly position the windows using the tk::PlaceWindow > function. Hmmm, this is not part of the official Tk API as far as I can see, and having to call tk::PlaceWindow on every window we create is a bit gross. What exactly does it do, and what effect will this change have on Linux? Are you sure there isn't some other way to fix the problem? Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/7] gitk: Explicitly position popup windows. 2008-10-21 11:41 ` Paul Mackerras @ 2008-10-21 12:52 ` Alexander Gavrilov 0 siblings, 0 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-21 12:52 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Tue, Oct 21, 2008 at 3:41 PM, Paul Mackerras <paulus@samba.org> wrote: > Alexander Gavrilov writes: > >> For some reason, on Windows all transient windows are placed >> in the upper left corner of the screen. Thus, it is necessary >> to explicitly position the windows using the tk::PlaceWindow >> function. > > Hmmm, this is not part of the official Tk API as far as I can see, and > having to call tk::PlaceWindow on every window we create is a bit > gross. What exactly does it do, and what effect will this change have > on Linux? Are you sure there isn't some other way to fix the problem? It is just a convenient helper function that can explicitly compute and set the window position in a number of ways. It is used in Tk's dialog implementations. If you don't like using an unofficial function, I can pull out the relevant ~8 lines of code as a separate function in gitk. http://objectmix.com/tcl/390381-tile-dialog-boxes-not-transient-parent-under-windows.html http://wiki.tcl.tk/1254 Alexander ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts. 2008-10-08 7:05 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 6/7] gitk: Implement a user-friendly Edit View dialog Alexander Gavrilov @ 2008-10-09 7:42 ` Paul Mackerras 2008-10-09 8:24 ` Alexander Gavrilov 1 sibling, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-09 7:42 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > Now that git-gui has facilities to help users resolve > conflicts, it makes sense to launch it from other gui > tools when they happen. Nice idea... > +proc exec_citool {args {baseid {}}} { I'm a little nervous about you having a parameter called "args", since that specific name has a special meaning in Tcl; it's how Tcl handles variable-length argument lists. > + global commitinfo env > + > + if {[info exists env(GIT_AUTHOR_NAME)]} { > + set old_name $env(GIT_AUTHOR_NAME) > + } > + if {[info exists env(GIT_AUTHOR_EMAIL)]} { > + set old_email $env(GIT_AUTHOR_EMAIL) > + } > + if {[info exists env(GIT_AUTHOR_DATE)]} { > + set old_date $env(GIT_AUTHOR_DATE) > + } > + > + if {$baseid ne {}} { > + if {![info exists commitinfo($baseid)]} { > + getcommit $baseid > + } > + set author [lindex $commitinfo($baseid) 1] > + set date [lindex $commitinfo($baseid) 2] > + if {[regexp {^\s*(\S.*\S|\S)\s*<(.*)>\s*$} \ > + $author author name email] > + && $date ne {}} { > + set env(GIT_AUTHOR_NAME) $name > + set env(GIT_AUTHOR_EMAIL) $email > + set env(GIT_AUTHOR_DATE) $date > + } > + } > + > + eval exec git citool $args & If we can assume the existence of a shell (which we do elsewhere), we can perhaps do this more simply by putting the environment variable settings in the command before the command name. It's a pity that git citool won't take the author name/email/date as command-line arguments or from a file, since it ends up being pretty verbose doing it the way you have. > @@ -7861,7 +7908,17 @@ proc cherrypick {} { > # no error occurs, and exec takes that as an indication of error... > if {[catch {exec sh -c "git cherry-pick -r $rowmenuid 2>&1"} err]} { > notbusy cherrypick > - error_popup $err > + if {[regexp -line \ > + {Entry '(.*)' would be overwritten by merge} $err msg fname]} { > + error_popup [mc "Cherry-pick failed: file '%s' had local modifications. > +Your working directory is in an inconsistent state." $fname] That message seems a bit too scary. It's not inconsistent, it's just got local modifications. If I remember correctly, in this situation git cherry-pick will back out all the changes it did and leave the working directory as it was before. > + } elseif {[regexp -line {^CONFLICT \(.*\):} $err msg]} { > + # Force citool to read MERGE_MSG > + file delete [file join [gitdir] "GITGUI_MSG"] > + exec_citool [list] $rowmenuid [list] as an idiom for the empty list is a little unusual (here and elsewhere in your patches); {} would be more usual. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts. 2008-10-09 7:42 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Paul Mackerras @ 2008-10-09 8:24 ` Alexander Gavrilov 2008-10-09 10:57 ` Paul Mackerras 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-09 8:24 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Thu, Oct 9, 2008 at 11:42 AM, Paul Mackerras <paulus@samba.org> wrote: >> +proc exec_citool {args {baseid {}}} { > > I'm a little nervous about you having a parameter called "args", since > that specific name has a special meaning in Tcl; it's how Tcl handles > variable-length argument lists. Yes, I'd better change that. Probably it works only because that name is special only as the last parameter. > If we can assume the existence of a shell (which we do elsewhere), we > can perhaps do this more simply by putting the environment variable > settings in the command before the command name. It's a pity that git > citool won't take the author name/email/date as command-line arguments > or from a file, since it ends up being pretty verbose doing it the way > you have. If I understand correctly, using a shell would require composing the command as a string, which itself requires quoting the author name & email, and other argument strings. I did not feel confident enough to do that, so chose a dumb but safe solution. >> @@ -7861,7 +7908,17 @@ proc cherrypick {} { >> # no error occurs, and exec takes that as an indication of error... >> if {[catch {exec sh -c "git cherry-pick -r $rowmenuid 2>&1"} err]} { >> notbusy cherrypick >> - error_popup $err >> + if {[regexp -line \ >> + {Entry '(.*)' would be overwritten by merge} $err msg fname]} { >> + error_popup [mc "Cherry-pick failed: file '%s' had local modifications. >> +Your working directory is in an inconsistent state." $fname] > > That message seems a bit too scary. It's not inconsistent, it's just > got local modifications. If I remember correctly, in this situation > git cherry-pick will back out all the changes it did and leave the > working directory as it was before. Yes, I'll have to reword it. > [list] as an idiom for the empty list is a little unusual (here and > elsewhere in your patches); {} would be more usual. I'm more used to languages where lists and strings are very different types... Even in perl you have to use [] for an empty list ref, and '' for an empty string. Alexander ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts. 2008-10-09 8:24 ` Alexander Gavrilov @ 2008-10-09 10:57 ` Paul Mackerras 0 siblings, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-09 10:57 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > If I understand correctly, using a shell would require composing the > command as a string, which itself requires quoting the author name & email, > and other argument strings. I did not feel confident enough to do that, so > chose a dumb but safe solution. You're right. I think we should do it basically the way you suggest, but the saving/restoring of the environment can be done a bit more concisely like this: proc exec_citool {args {baseid {}}} { global commitinfo env set save_env [array get env GIT_AUTHOR_*] if {$baseid ne {}} { # as before ... } eval exec git citool $args & catch {array unset env GIT_AUTHOR_*} array set env $save_env } > I'm more used to languages where lists and strings are very different types... > Even in perl you have to use [] for an empty list ref, and '' for an > empty string. In Tcl, everything is a string. :) Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 4/7] gitk: Fix file list context menu for merge commits. 2008-10-08 7:05 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Alexander Gavrilov @ 2008-10-21 11:39 ` Paul Mackerras 1 sibling, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-21 11:39 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > Currently it displays an ugly error box, because the > treediffs array is not filled for such commits. This > is clearly unacceptable. Applied, thanks, with a better patch description, one that actually described the remedial action. :) Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-08 7:05 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Alexander Gavrilov @ 2008-10-23 11:58 ` Paul Mackerras 2008-10-24 8:13 ` Alexander Gavrilov 1 sibling, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-23 11:58 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > Adds a context menu item to the diff viewer pane that > calls blame, focusing it on the clicked line. In case > of combined diffs, it also automatically deduces which > parent is to be blamed. I have some comments on this one, but I haven't finished reviewing it completely, so I may have more... :) > +proc find_hunk_blamespec {base line} { > + global ctext > + > + # Find and parse the hunk header > + set s_lix [$ctext search -backwards -regexp ^@@ "$line.0 lineend" $base.0] > + if {$s_lix eq {}} return > + > + set s_line [$ctext get $s_lix "$s_lix + 1 lines"] > + if {![regexp {^@@@?(( -\d+(,\d+)?)+) \+(\d+)(,\d+)? @@} $s_line \ In fact there can be many @ characters at the beginning of the line; the number of parents plus one, in fact. See commit c465a76af658b443075d6efee1c3131257643020 in the kernel tree for an example. I suggest starting with ^@@@* rather than ^@@@?. > + # Now scan the lines to determine offset within the hunk > + set parent {} > + set dline 0 > + set s_lno [lindex [split $s_lix "."] 0] > + > + for {set i $line} {$i > $s_lno} {incr i -1} { > + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] > + if {$parent eq {}} { > + # find first preceeding line that belongs to some parent > + for {set j 0} {$j < [llength $old_lines]} {incr j} { > + set code [string index $c_line $j] > + if {$code ne {-} && $code ne { }} continue > + if {$code eq { } && $parent ne {}} continue > + set parent $j > + if {$code eq {-}} break > + } > + } This part worries me a bit. If the user clicks on a line where all the $code values are "+" then I think we should blame the current commit. Either that, or we disable the context menu item before posting it if the user clicks on a line that starts with all "+" characters (as many "+" as there are parents). BTW, writing "-" rather than {-} in expressions is more idiomatic. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-23 11:58 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Paul Mackerras @ 2008-10-24 8:13 ` Alexander Gavrilov 2008-10-25 11:57 ` Paul Mackerras 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-24 8:13 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Thursday 23 October 2008 15:58:58 Paul Mackerras wrote: > > + # Now scan the lines to determine offset within the hunk > > + set parent {} > > + set dline 0 > > + set s_lno [lindex [split $s_lix "."] 0] > > + > > + for {set i $line} {$i > $s_lno} {incr i -1} { > > + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] > > + if {$parent eq {}} { > > + # find first preceeding line that belongs to some parent > > + for {set j 0} {$j < [llength $old_lines]} {incr j} { > > + set code [string index $c_line $j] > > + if {$code ne {-} && $code ne { }} continue > > + if {$code eq { } && $parent ne {}} continue > > + set parent $j > > + if {$code eq {-}} break > > + } > > + } > > This part worries me a bit. If the user clicks on a line where all > the $code values are "+" then I think we should blame the current > commit. Either that, or we disable the context menu item before > posting it if the user clicks on a line that starts with all "+" > characters (as many "+" as there are parents). Good point. How about this variant? I renamed the menu item, and changed the code to blame the current commit if: - The display is in the tree mode, or - The line is added relative to all parents, or - Diff analysis failed I also fixed a bug in processing of deleted lines in combined diffs, and made the parent selection code more readable (hopefully). --- >8 --- From: Alexander Gavrilov <angavrilov@gmail.com> Subject: [PATCH] gitk: Allow starting gui blame for a specific line. Adds a context menu item to the diff viewer pane that calls blame, focusing it on the clicked line. In case of combined diffs, it also automatically deduces which parent is to be blamed. Lines added by the diff are blamed on the current commit itself. The context menu itself is added by this patch. It is possible to populate it with commands from the flist menu. Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com> --- gitk | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 146 insertions(+), 2 deletions(-) diff --git a/gitk b/gitk index f6a3e10..6fbd6bb 100755 --- a/gitk +++ b/gitk @@ -2249,6 +2249,7 @@ proc makewindow {} { bind $cflist <ButtonRelease-1> {treeclick %W %x %y} global ctxbut bind $cflist $ctxbut {pop_flist_menu %W %X %Y %x %y} + bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y} set maincursor [. cget -cursor] set textcursor [$ctext cget -cursor] @@ -2291,6 +2292,13 @@ proc makewindow {} { {mc "Blame parent commit" command {external_blame 1}} } $flist_menu configure -tearoff 0 + + global diff_menu + set diff_menu .diffctxmenu + makemenu $diff_menu { + {mc "Blame this line" command {external_blame_diff}} + } + $diff_menu configure -tearoff 0 } # Windows sends all mouse wheel events to the current focused window, not @@ -2993,6 +3001,34 @@ proc pop_flist_menu {w X Y x y} { tk_popup $flist_menu $X $Y } +proc find_ctext_fileinfo {line} { + global ctext_file_names ctext_file_lines + + set ok [bsearch $ctext_file_lines $line] + set tline [lindex $ctext_file_lines $ok] + + if {$ok >= [llength $ctext_file_lines] || $line < $tline} { + return {} + } else { + return [list [lindex $ctext_file_names $ok] $tline] + } +} + +proc pop_diff_menu {w X Y x y} { + global ctext diff_menu flist_menu_file + global diff_menu_txtpos diff_menu_line + global diff_menu_filebase + + stopfinding + set diff_menu_txtpos [split [$w index "@$x,$y"] "."] + set diff_menu_line [lindex $diff_menu_txtpos 0] + set f [find_ctext_fileinfo $diff_menu_line] + if {$f eq {}} return + set flist_menu_file [lindex $f 0] + set diff_menu_filebase [lindex $f 1] + tk_popup $diff_menu $X $Y +} + proc flist_hl {only} { global flist_menu_file findstring gdttype @@ -3099,7 +3135,96 @@ proc external_diff {} { } } -proc external_blame {parent_idx} { +proc find_hunk_blamespec {base line} { + global ctext + + # Find and parse the hunk header + set s_lix [$ctext search -backwards -regexp ^@@ "$line.0 lineend" $base.0] + if {$s_lix eq {}} return + + set s_line [$ctext get $s_lix "$s_lix + 1 lines"] + if {![regexp {^@@@*(( -\d+(,\d+)?)+) \+(\d+)(,\d+)? @@} $s_line \ + s_line old_specs osz osz1 new_line nsz]} { + return + } + + # base lines for the parents + set base_lines [list $new_line] + foreach old_spec [lrange [split $old_specs " "] 1 end] { + if {![regexp -- {-(\d+)(,\d+)?} $old_spec \ + old_spec old_line osz]} { + return + } + lappend base_lines $old_line + } + + # Now scan the lines to determine offset within the hunk + set parent {} + set dline 0 + set s_lno [lindex [split $s_lix "."] 0] + + for {set i $line} {$i > $s_lno} {incr i -1} { + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] + # Determine if the line is removed + set chunk [string range $c_line 0 [llength $base_lines]-2] + set removed_idx [string first "-" $chunk] + # Choose a parent index + if {$parent eq {}} { + if {$removed_idx >= 0} { + set parent $removed_idx + incr parent + } else { + set unchanged_idx [string first " " $chunk] + if {$unchanged_idx >= 0} { + set parent $unchanged_idx + incr parent + } else { + # blame the current commit + set parent 0 + } + } + } + # then count other lines that belong to it + if {$parent > 0} { + set code [string index $c_line $parent-1] + if {$code eq "-" || ($removed_idx < 0 && $code ne "+")} { + incr dline + } + } else { + if {$removed_idx < 0} { + incr dline + } + } + } + + if {$parent eq {}} { set parent 0 } + incr dline [lindex $base_lines $parent] + return [list $parent $dline] +} + +proc external_blame_diff {} { + global currentid diffmergeid cmitmode + global diff_menu_txtpos diff_menu_line + global diff_menu_filebase flist_menu_file + + if {$cmitmode eq "tree"} { + set parent_idx 0 + set line [expr {$diff_menu_line - $diff_menu_filebase - 1}] + } else { + set hinfo [find_hunk_blamespec $diff_menu_filebase $diff_menu_line] + if {$hinfo ne {}} { + set parent_idx [lindex $hinfo 0] + set line [lindex $hinfo 1] + } else { + set parent_idx 0 + set line 0 + } + } + + external_blame $parent_idx $line +} + +proc external_blame {parent_idx {line {}}} { global flist_menu_file global nullid nullid2 global parentlist selectedline currentid @@ -3115,7 +3240,12 @@ proc external_blame {parent_idx} { return } - if {[catch {exec git gui blame $base_commit $flist_menu_file &} err]} { + set cmdline [list git gui blame] + if {$line ne {} && $line > 1} { + lappend cmdline "--line=$line" + } + lappend cmdline $base_commit $flist_menu_file + if {[catch {eval exec $cmdline &} err]} { error_popup "[mc "git gui blame: command failed:"] $err" } } @@ -6364,6 +6494,7 @@ proc gettreeline {gtf id} { proc showfile {f} { global treefilelist treeidlist diffids nullid nullid2 + global ctext_file_names ctext_file_lines global ctext commentend set i [lsearch -exact $treefilelist($diffids) $f] @@ -6387,6 +6518,8 @@ proc showfile {f} { filerun $bf [list getblobline $bf $diffids] $ctext config -state normal clear_ctext $commentend + lappend ctext_file_names $f + lappend ctext_file_lines [lindex [split $commentend "."] 0] $ctext insert end "\n" $ctext insert end "$f\n" filesep $ctext config -state disabled @@ -6447,6 +6580,7 @@ proc mergediff {id} { proc getmergediffline {mdf id np} { global diffmergeid ctext cflist mergemax global difffilestart mdifffd treediffs + global ctext_file_names ctext_file_lines global diffencoding $ctext conf -state normal @@ -6465,6 +6599,8 @@ proc getmergediffline {mdf id np} { lappend difffilestart $here lappend treediffs($id) $fname add_flist [list $fname] + lappend ctext_file_names $fname + lappend ctext_file_lines [lindex [split $here "."] 0] set diffencoding [get_path_encoding $fname] set l [expr {(78 - [string length $fname]) / 2}] set pad [string range "----------------------------------------" 1 $l] @@ -6733,11 +6869,13 @@ proc setinlist {var i val} { proc makediffhdr {fname ids} { global ctext curdiffstart treediffs + global ctext_file_names set i [lsearch -exact $treediffs($ids) $fname] if {$i >= 0} { setinlist difffilestart $i $curdiffstart } + set ctext_file_names [lreplace $ctext_file_names end end $fname] set l [expr {(78 - [string length $fname]) / 2}] set pad [string range "----------------------------------------" 1 $l] $ctext insert $curdiffstart "$pad $fname $pad" filesep @@ -6746,6 +6884,7 @@ proc makediffhdr {fname ids} { proc getblobdiffline {bdf ids} { global diffids blobdifffd ctext curdiffstart global diffnexthead diffnextnote difffilestart + global ctext_file_names ctext_file_lines global diffinhdr treediffs global diffencoding @@ -6763,6 +6902,8 @@ proc getblobdiffline {bdf ids} { # start of a new file $ctext insert end "\n" set curdiffstart [$ctext index "end - 1c"] + lappend ctext_file_names "" + lappend ctext_file_lines [lindex [split $curdiffstart "."] 0] $ctext insert end "\n" filesep # If the name hasn't changed the length will be odd, # the middle char will be a space, and the two bits either @@ -6899,6 +7040,7 @@ proc nextfile {} { proc clear_ctext {{first 1.0}} { global ctext smarktop smarkbot + global ctext_file_names ctext_file_lines global pendinglinks set l [lindex [split $first .] 0] @@ -6912,6 +7054,8 @@ proc clear_ctext {{first 1.0}} { if {$first eq "1.0"} { catch {unset pendinglinks} } + set ctext_file_names {} + set ctext_file_lines {} } proc settabs {{firstab {}}} { -- 1.6.0.20.g6148bc ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-24 8:13 ` Alexander Gavrilov @ 2008-10-25 11:57 ` Paul Mackerras 2008-10-25 16:45 ` Alexander Gavrilov 0 siblings, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-25 11:57 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > Good point. How about this variant? I renamed the menu item, and > changed the code to blame the current commit if: Sounds good, just a couple of minor nits... > + # Now scan the lines to determine offset within the hunk > + set parent {} > + set dline 0 > + set s_lno [lindex [split $s_lix "."] 0] > + > + for {set i $line} {$i > $s_lno} {incr i -1} { > + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] > + # Determine if the line is removed > + set chunk [string range $c_line 0 [llength $base_lines]-2] You need an [expr]: set chunk [string range $c_line 0 [expr {[llength $base_lines] - 2}]] > + set removed_idx [string first "-" $chunk] > + # Choose a parent index > + if {$parent eq {}} { > + if {$removed_idx >= 0} { > + set parent $removed_idx > + incr parent > + } else { > + set unchanged_idx [string first " " $chunk] > + if {$unchanged_idx >= 0} { > + set parent $unchanged_idx > + incr parent > + } else { > + # blame the current commit > + set parent 0 > + } > + } > + } I like this better than the previous version, but it would turn out a bit simpler if you use parent = -1 to indicate that we're blaming the current commit, and then increment it right at the end. > + # then count other lines that belong to it > + if {$parent > 0} { > + set code [string index $c_line $parent-1] Once again you need an [expr]. Apart from those things, it looks good. If you like I will fix those things and commit it. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-25 11:57 ` Paul Mackerras @ 2008-10-25 16:45 ` Alexander Gavrilov 2008-10-26 3:58 ` Paul Mackerras 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-25 16:45 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Saturday 25 October 2008 15:57:23 Paul Mackerras wrote: > > + # Now scan the lines to determine offset within the hunk > > + set parent {} > > + set dline 0 > > + set s_lno [lindex [split $s_lix "."] 0] > > + > > + for {set i $line} {$i > $s_lno} {incr i -1} { > > + set c_line [$ctext get $i.0 "$i.0 + 1 lines"] > > + # Determine if the line is removed > > + set chunk [string range $c_line 0 [llength $base_lines]-2] > > You need an [expr]: > > set chunk [string range $c_line 0 [expr {[llength $base_lines] - 2}]] Ugh. I guess I'll have to install docs from Tcl 8.4... > > + set removed_idx [string first "-" $chunk] > > + # Choose a parent index > > + if {$parent eq {}} { > > + if {$removed_idx >= 0} { > > + set parent $removed_idx > > + incr parent > > + } else { > > + set unchanged_idx [string first " " $chunk] > > + if {$unchanged_idx >= 0} { > > + set parent $unchanged_idx > > + incr parent > > + } else { > > + # blame the current commit > > + set parent 0 > > + } > > + } > > + } > > I like this better than the previous version, but it would turn out a > bit simpler if you use parent = -1 to indicate that we're blaming the > current commit, and then increment it right at the end. Yes, it's probably better to apply the following fixup. Alexander diff --git a/gitk b/gitk index 6fbd6bb..68f07c2 100755 --- a/gitk +++ b/gitk @@ -3160,33 +3160,32 @@ proc find_hunk_blamespec {base line} { # Now scan the lines to determine offset within the hunk set parent {} + set max_parent [expr {[llength $base_lines]-2}] set dline 0 set s_lno [lindex [split $s_lix "."] 0] for {set i $line} {$i > $s_lno} {incr i -1} { set c_line [$ctext get $i.0 "$i.0 + 1 lines"] # Determine if the line is removed - set chunk [string range $c_line 0 [llength $base_lines]-2] + set chunk [string range $c_line 0 $max_parent] set removed_idx [string first "-" $chunk] # Choose a parent index if {$parent eq {}} { if {$removed_idx >= 0} { set parent $removed_idx - incr parent } else { set unchanged_idx [string first " " $chunk] if {$unchanged_idx >= 0} { set parent $unchanged_idx - incr parent } else { # blame the current commit - set parent 0 + set parent -1 } } } # then count other lines that belong to it - if {$parent > 0} { - set code [string index $c_line $parent-1] + if {$parent >= 0} { + set code [string index $c_line $parent] if {$code eq "-" || ($removed_idx < 0 && $code ne "+")} { incr dline } @@ -3197,7 +3196,8 @@ proc find_hunk_blamespec {base line} { } } - if {$parent eq {}} { set parent 0 } + if {$parent eq {}} { set parent -1 } + incr parent incr dline [lindex $base_lines $parent] return [list $parent $dline] } ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 3/7] gitk: Allow starting gui blame for a specific line. 2008-10-25 16:45 ` Alexander Gavrilov @ 2008-10-26 3:58 ` Paul Mackerras 0 siblings, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-26 3:58 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > Ugh. I guess I'll have to install docs from Tcl 8.4... Yes, although I strongly encourage people to move to 8.5, I haven't made it a requirement (yet :). Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 2/7] gitk: Allow forcing branch creation if it already exists. 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Alexander Gavrilov @ 2008-10-21 11:38 ` Paul Mackerras 1 sibling, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-21 11:38 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > If gitk knows that the branch the user tries to create exists, > it should ask whether it should overwrite it. This way the user > can either decide to choose a new name, or move the head while > preserving the reflog. Applied, thanks. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov @ 2008-10-09 0:27 ` Paul Mackerras 2008-10-09 8:12 ` Alexander Gavrilov 2008-10-16 21:55 ` Paul Mackerras 2008-10-21 11:35 ` Paul Mackerras 3 siblings, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-09 0:27 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > - Popups are supposed to be marked transient, otherwise > the WM creates them in strange places. Besides, at > least under kwin, transients are automatically kept > above their parent. > - Accelerators for menu items should be listed directly > on the items, to make them more discoverable. > - Some more accelerators are added, e.g. F4 for Edit View. > - Finally, dialogs can now be accepted or dismissed using > the Return and Escape keys. Thanks for the patch series; a few specific comments follow. > + catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } What is this key, or why is this line needed? > @@ -2484,10 +2501,10 @@ proc keys {} { > } > toplevel $w > wm title $w [mc "Gitk key bindings"] > + wm transient $w . > message $w.m -text " > [mc "Gitk key bindings:"] > > -[mc "<%s-Q> Quit" $M1T] > [mc "<Home> Move to first commit"] > [mc "<End> Move to last commit"] > [mc "<Up>, p, i Move up one commit"] > @@ -2521,11 +2538,11 @@ proc keys {} { > [mc "<%s-plus> Increase font size" $M1T] > [mc "<%s-KP-> Decrease font size" $M1T] > [mc "<%s-minus> Decrease font size" $M1T] > -[mc "<F5> Update"] I think it is useful to have the accelerator keys listed in the key binding help. > @@ -7501,6 +7534,7 @@ proc domktag {} { > addedtag $id > dispneartags 0 > run refill_reflist > + return 1 > } > > proc redrawtags {id} { > @@ -7539,7 +7573,7 @@ proc mktagcan {} { > } > > proc mktaggo {} { > - domktag > + if {![domktag]} return You need to change the error returns in domktag to say "return 0", otherwise this will give a "can't use empty string as operand of "!"" Tcl error. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-09 0:27 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Paul Mackerras @ 2008-10-09 8:12 ` Alexander Gavrilov 2008-10-09 11:02 ` Paul Mackerras 0 siblings, 1 reply; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-09 8:12 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Thu, Oct 9, 2008 at 4:27 AM, Paul Mackerras <paulus@samba.org> wrote: >> + catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } > > What is this key, or why is this line needed? It is a workaround for an apparent bug in interaction between Tk and XKB on some systems. XKB configuration files bind those symbols to Ctrl-Alt-F* combinations, but Tk's keyboard handiling code sees them when Shift-F* is pressed. I'll be glad to find a better fix, but that's all I could do for now. The catch wrapper is there to avoid erroring out if that keysym does not exist. >> @@ -2484,10 +2501,10 @@ proc keys {} { >> >> -[mc "<%s-Q> Quit" $M1T] >> [mc "<Home> Move to first commit"] >> [mc "<End> Move to last commit"] >> [mc "<Up>, p, i Move up one commit"] >> @@ -2521,11 +2538,11 @@ proc keys {} { >> [mc "<%s-plus> Increase font size" $M1T] >> [mc "<%s-KP-> Decrease font size" $M1T] >> [mc "<%s-minus> Decrease font size" $M1T] >> -[mc "<F5> Update"] > > I think it is useful to have the accelerator keys listed in the key > binding help. I don't insist on this part of the patch, it just seemed to be redundant now. >> @@ -7501,6 +7534,7 @@ proc domktag {} { >> addedtag $id >> dispneartags 0 >> run refill_reflist >> + return 1 >> } >> >> proc redrawtags {id} { >> @@ -7539,7 +7573,7 @@ proc mktagcan {} { >> } >> >> proc mktaggo {} { >> - domktag >> + if {![domktag]} return > > You need to change the error returns in domktag to say "return 0", > otherwise this will give a "can't use empty string as operand of "!"" > Tcl error. I did not know this. I'm not that familiar with Tcl... Alexander ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-09 8:12 ` Alexander Gavrilov @ 2008-10-09 11:02 ` Paul Mackerras 0 siblings, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-09 11:02 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > On Thu, Oct 9, 2008 at 4:27 AM, Paul Mackerras <paulus@samba.org> wrote: > >> + catch { bind . <Shift-Key-XF86_Switch_VT_4> {newview 0} } > > > > What is this key, or why is this line needed? > > It is a workaround for an apparent bug in interaction between Tk and > XKB on some systems. > XKB configuration files bind those symbols to Ctrl-Alt-F* > combinations, but Tk's keyboard > handiling code sees them when Shift-F* is pressed. I'll be glad to > find a better fix, but that's > all I could do for now. OK, that information should go in the patch description. > > You need to change the error returns in domktag to say "return 0", > > otherwise this will give a "can't use empty string as operand of "!"" > > Tcl error. > > I did not know this. I'm not that familiar with Tcl... Then I am amazed at how much you have been able to accomplish... There's a lot of information available in the Tcl/Tk man pages. On Debian or Ubuntu, you need the tcl8.5-doc and tk8.5-doc packages installed. Then you can do e.g. "man 3tcl Tcl" to get a summary of the Tcl language syntax, etc. BTW, I haven't forgotten about your encoding support patches. The last month has been occupied with travelling for Kernel Summit and the Linux Plumbers Conference, followed by a vacation, and then catching up with work that has piled up, so I haven't had much time to spare for gitk hacking. Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov 2008-10-09 0:27 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Paul Mackerras @ 2008-10-16 21:55 ` Paul Mackerras 2008-10-16 22:08 ` Alexander Gavrilov 2008-10-21 11:35 ` Paul Mackerras 3 siblings, 1 reply; 26+ messages in thread From: Paul Mackerras @ 2008-10-16 21:55 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > - Popups are supposed to be marked transient, otherwise > the WM creates them in strange places. Besides, at > least under kwin, transients are automatically kept > above their parent. I agree with most of the places where you add wm transient commands, but in the case of the list of references (showrefs), I think of that as a long-lived window that one would normally place beside the main window. (In fact, it should be a pane in the main window, but I couldn't think of a place for it. Maybe I should split the bottom-right pane in two.) So I don't think the wm transient in showrefs is what we want. Comments? Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-16 21:55 ` Paul Mackerras @ 2008-10-16 22:08 ` Alexander Gavrilov 0 siblings, 0 replies; 26+ messages in thread From: Alexander Gavrilov @ 2008-10-16 22:08 UTC (permalink / raw) To: Paul Mackerras; +Cc: git On Fri, Oct 17, 2008 at 1:55 AM, Paul Mackerras <paulus@samba.org> wrote: > Alexander Gavrilov writes: >> - Popups are supposed to be marked transient, otherwise >> the WM creates them in strange places. Besides, at >> least under kwin, transients are automatically kept >> above their parent. > > I agree with most of the places where you add wm transient commands, > but in the case of the list of references (showrefs), I think of that > as a long-lived window that one would normally place beside the main > window. (In fact, it should be a pane in the main window, but I > couldn't think of a place for it. Maybe I should split the > bottom-right pane in two.) > > So I don't think the wm transient in showrefs is what we want. > Comments? On the other hand, wm transient makes it always stay on top of the main window. If the main window is maximized, it is useful. Btw, gitk probably should not save its geometry if the window is maximized, because when it is started again the window is too large. Alexander ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/7] gitk: Enhance UI popup and accelerator handling. 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov ` (2 preceding siblings ...) 2008-10-16 21:55 ` Paul Mackerras @ 2008-10-21 11:35 ` Paul Mackerras 3 siblings, 0 replies; 26+ messages in thread From: Paul Mackerras @ 2008-10-21 11:35 UTC (permalink / raw) To: Alexander Gavrilov; +Cc: git Alexander Gavrilov writes: > - Popups are supposed to be marked transient, otherwise > the WM creates them in strange places. Besides, at > least under kwin, transients are automatically kept > above their parent. > - Accelerators for menu items should be listed directly > on the items, to make them more discoverable. > - Some more accelerators are added, e.g. F4 for Edit View. > - Finally, dialogs can now be accepted or dismissed using > the Return and Escape keys. Could you rebase this and split it into 3 patches, one each for the transient popups, accelerators, and return/escape key bindings? Thanks, Paul. ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2008-10-26 5:44 UTC | newest] Thread overview: 26+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-10-08 7:05 [PATCH 0/7] gitk: UI enhancements Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 6/7] gitk: Implement a user-friendly Edit View dialog Alexander Gavrilov 2008-10-08 7:05 ` [PATCH 7/7] gitk: Explicitly position popup windows Alexander Gavrilov 2008-10-21 11:41 ` Paul Mackerras 2008-10-21 12:52 ` Alexander Gavrilov 2008-10-09 7:42 ` [PATCH 5/7] gitk: Make cherry-pick call git-citool on conflicts Paul Mackerras 2008-10-09 8:24 ` Alexander Gavrilov 2008-10-09 10:57 ` Paul Mackerras 2008-10-21 11:39 ` [PATCH 4/7] gitk: Fix file list context menu for merge commits Paul Mackerras 2008-10-23 11:58 ` [PATCH 3/7] gitk: Allow starting gui blame for a specific line Paul Mackerras 2008-10-24 8:13 ` Alexander Gavrilov 2008-10-25 11:57 ` Paul Mackerras 2008-10-25 16:45 ` Alexander Gavrilov 2008-10-26 3:58 ` Paul Mackerras 2008-10-21 11:38 ` [PATCH 2/7] gitk: Allow forcing branch creation if it already exists Paul Mackerras 2008-10-09 0:27 ` [PATCH 1/7] gitk: Enhance UI popup and accelerator handling Paul Mackerras 2008-10-09 8:12 ` Alexander Gavrilov 2008-10-09 11:02 ` Paul Mackerras 2008-10-16 21:55 ` Paul Mackerras 2008-10-16 22:08 ` Alexander Gavrilov 2008-10-21 11:35 ` Paul Mackerras
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 NNTP newsgroup(s).