From 79b2c75e043ad85f9a6b1a8d890b601a2f761a0e Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Sun, 2 Apr 2006 20:47:40 +1000 Subject: [PATCH 01/11] gitk: replace parent and children arrays with lists This will make it easier to switch between views efficiently, and turns out to be slightly faster as well. Signed-off-by: Paul Mackerras --- gitk | 188 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 95 insertions(+), 93 deletions(-) diff --git a/gitk b/gitk index fa1e83c494..90afec92df 100755 --- a/gitk +++ b/gitk @@ -75,6 +75,7 @@ proc getcommitlines {commfd} { global commitlisted nextupdate global leftover global displayorder commitidx commitrow commitdata + global parentlist childlist children set stuff [read $commfd] if {$stuff == {}} { @@ -140,15 +141,26 @@ proc getcommitlines {commfd} { set id [lindex $ids 0] if {$listed} { set olds [lrange $ids 1 end] - set commitlisted($id) 1 + if {[llength $olds] > 1} { + set olds [lsort -unique $olds] + } + foreach p $olds { + lappend children($p) $id + } } else { set olds {} } - updatechildren $id $olds + lappend parentlist $olds + if {[info exists children($id)]} { + lappend childlist $children($id) + } else { + lappend childlist {} + } set commitdata($id) [string range $cmit [expr {$j + 1}] end] set commitrow($id) $commitidx incr commitidx lappend displayorder $id + lappend commitlisted $listed set gotsome 1 } if {$gotsome} { @@ -181,14 +193,12 @@ proc doupdate {reading} { proc readcommit {id} { if {[catch {set contents [exec git-cat-file commit $id]}]} return - updatechildren $id {} parsecommit $id $contents 0 } proc updatecommits {rargs} { stopfindproc - foreach v {children nchildren parents nparents commitlisted - colormap selectedline matchinglines treediffs + foreach v {colormap selectedline matchinglines treediffs mergefilelist currentid rowtextx commitrow rowidlist rowoffsets idrowranges idrangedrawn iddrawn linesegends crossings cornercrossings} { @@ -200,26 +210,6 @@ proc updatecommits {rargs} { getcommits $rargs } -proc updatechildren {id olds} { - global children nchildren parents nparents - - if {![info exists nchildren($id)]} { - set children($id) {} - set nchildren($id) 0 - } - set parents($id) $olds - set nparents($id) [llength $olds] - foreach p $olds { - if {![info exists nchildren($p)]} { - set children($p) [list $id] - set nchildren($p) 1 - } elseif {[lsearch -exact $children($p) $id] < 0} { - lappend children($p) $id - incr nchildren($p) - } - } -} - proc parsecommit {id contents listed} { global commitinfo cdate @@ -274,7 +264,7 @@ proc parsecommit {id contents listed} { } proc getcommit {id} { - global commitdata commitinfo nparents + global commitdata commitinfo if {[info exists commitdata($id)]} { parsecommit $id $commitdata($id) 1 @@ -282,7 +272,6 @@ proc getcommit {id} { readcommit $id if {![info exists commitinfo($id)]} { set commitinfo($id) {"No commit information available"} - set nparents($id) 0 } } return 1 @@ -843,15 +832,20 @@ proc makeuparrow {oid x y z} { } proc initlayout {} { - global rowidlist rowoffsets displayorder + global rowidlist rowoffsets displayorder commitlisted global rowlaidout rowoptim global idinlist rowchk global commitidx numcommits canvxmax canv global nextcolor + global parentlist childlist children set commitidx 0 set numcommits 0 set displayorder {} + set commitlisted {} + set parentlist {} + set childlist {} + catch {unset children} set nextcolor 0 set rowidlist {{}} set rowoffsets {{}} @@ -950,7 +944,7 @@ proc showstuff {canshow} { proc layoutrows {row endrow last} { global rowidlist rowoffsets displayorder global uparrowlen downarrowlen maxwidth mingaplen - global nchildren parents nparents + global childlist parentlist global idrowranges linesegends global commitidx global idinlist rowchk @@ -961,7 +955,7 @@ proc layoutrows {row endrow last} { set id [lindex $displayorder $row] set oldolds {} set newolds {} - foreach p $parents($id) { + foreach p [lindex $parentlist $row] { if {![info exists idinlist($p)]} { lappend newolds $p } elseif {!$idinlist($p)} { @@ -1000,7 +994,7 @@ proc layoutrows {row endrow last} { lappend idlist $id lset rowidlist $row $idlist set z {} - if {$nchildren($id) > 0} { + if {[lindex $childlist $row] ne {}} { set z [expr {[llength [lindex $rowidlist [expr {$row-1}]]] - $col}] unset idinlist($id) } @@ -1053,16 +1047,22 @@ proc layoutrows {row endrow last} { } proc addextraid {id row} { - global displayorder commitrow commitinfo nparents + global displayorder commitrow commitinfo global commitidx + global parentlist childlist children incr commitidx lappend displayorder $id + lappend parentlist {} set commitrow($id) $row readcommit $id if {![info exists commitinfo($id)]} { set commitinfo($id) {"No commit information available"} - set nparents($id) 0 + } + if {[info exists children($id)]} { + lappend childlist $children($id) + } else { + lappend childlist {} } } @@ -1365,7 +1365,7 @@ proc drawparentlinks {id row col olds} { proc drawlines {id} { global colormap canv global idrowranges idrangedrawn - global children iddrawn commitrow rowidlist + global childlist iddrawn commitrow rowidlist $canv delete lines.$id set nr [expr {[llength $idrowranges($id)] / 2}] @@ -1374,14 +1374,12 @@ proc drawlines {id} { drawlineseg $id $i } } - if {[info exists children($id)]} { - foreach child $children($id) { - if {[info exists iddrawn($child)]} { - set row $commitrow($child) - set col [lsearch -exact [lindex $rowidlist $row] $child] - if {$col >= 0} { - drawparentlinks $child $row $col [list $id] - } + foreach child [lindex $childlist $commitrow($id)] { + if {[info exists iddrawn($child)]} { + set row $commitrow($child) + set col [lsearch -exact [lindex $rowidlist $row] $child] + if {$col >= 0} { + drawparentlinks $child $row $col [list $id] } } } @@ -1394,7 +1392,7 @@ proc drawcmittext {id row col rmx} { global linehtag linentag linedtag global mainfont namefont canvxmax - set ofill [expr {[info exists commitlisted($id)]? "blue": "white"}] + set ofill [expr {[lindex $commitlisted $row]? "blue": "white"}] set x [xc $row $col] set y [yc $row] set orad [expr {$linespc / 3}] @@ -1434,7 +1432,7 @@ proc drawcmittext {id row col rmx} { proc drawcmitrow {row} { global displayorder rowidlist global idrowranges idrangedrawn iddrawn - global commitinfo commitlisted parents numcommits + global commitinfo commitlisted parentlist numcommits if {$row >= $numcommits} return foreach id [lindex $rowidlist $row] { @@ -1465,9 +1463,9 @@ proc drawcmitrow {row} { getcommit $id } assigncolor $id - if {[info exists commitlisted($id)] && [info exists parents($id)] - && $parents($id) ne {}} { - set rmx [drawparentlinks $id $row $col $parents($id)] + set olds [lindex $parentlist $row] + if {$olds ne {}} { + set rmx [drawparentlinks $id $row $col $olds] } else { set rmx 0 } @@ -1511,15 +1509,22 @@ proc clear_display {} { proc assigncolor {id} { global colormap colors nextcolor - global parents nparents children nchildren + global commitrow parentlist children childlist global cornercrossings crossings if {[info exists colormap($id)]} return set ncolors [llength $colors] - if {$nchildren($id) == 1} { - set child [lindex $children($id) 0] + if {[info exists commitrow($id)]} { + set kids [lindex $childlist $commitrow($id)] + } elseif {[info exists children($id)]} { + set kids $children($id) + } else { + set kids {} + } + if {[llength $kids] == 1} { + set child [lindex $kids 0] if {[info exists colormap($child)] - && $nparents($child) == 1} { + && [llength [lindex $parentlist $commitrow($child)]] == 1} { set colormap($id) $colormap($child) return } @@ -1552,17 +1557,15 @@ proc assigncolor {id} { set origbad $badcolors } if {[llength $badcolors] < $ncolors - 1} { - foreach child $children($id) { + foreach child $kids { if {[info exists colormap($child)] && [lsearch -exact $badcolors $colormap($child)] < 0} { lappend badcolors $colormap($child) } - if {[info exists parents($child)]} { - foreach p $parents($child) { - if {[info exists colormap($p)] - && [lsearch -exact $badcolors $colormap($p)] < 0} { - lappend badcolors $colormap($p) - } + foreach p [lindex $parentlist $commitrow($child)] { + if {[info exists colormap($p)] + && [lsearch -exact $badcolors $colormap($p)] < 0} { + lappend badcolors $colormap($p) } } } @@ -1657,14 +1660,14 @@ proc drawtags {id x xt y1} { } proc checkcrossings {row endrow} { - global displayorder parents rowidlist + global displayorder parentlist rowidlist for {} {$row < $endrow} {incr row} { set id [lindex $displayorder $row] set i [lsearch -exact [lindex $rowidlist $row] $id] if {$i < 0} continue set idlist [lindex $rowidlist [expr {$row+1}]] - foreach p $parents($id) { + foreach p [lindex $parentlist $row] { set j [lsearch -exact $idlist $p] if {$j > 0} { if {$j < $i - 1} { @@ -1760,7 +1763,7 @@ proc drawrest {} { showstuff $commitidx set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}] - #puts "overall $drawmsecs ms for $numcommits commits" + puts "overall $drawmsecs ms for $numcommits commits" } proc findmatches {f} { @@ -2046,7 +2049,7 @@ proc insertmatch {l id} { proc findfiles {} { global selectedline numcommits displayorder ctext - global ffileline finddidsel parents nparents + global ffileline finddidsel parentlist global findinprogress findstartline findinsertpos global treediffs fdiffid fdiffsneeded fdiffpos global findmergefiles @@ -2064,7 +2067,7 @@ proc findfiles {} { set fdiffsneeded {} while 1 { set id [lindex $displayorder $l] - if {$findmergefiles || $nparents($id) == 1} { + if {$findmergefiles || [llength [lindex $parentlist $l]] == 1} { if {![info exists treediffs($id)]} { append diffsneeded "$id\n" lappend fdiffsneeded $id @@ -2096,7 +2099,7 @@ proc findfiles {} { . config -cursor watch settextcursor watch set findinprogress 1 - findcont $id + findcont update } @@ -2143,7 +2146,7 @@ proc donefilediff {} { set treediffs($nullid) {} if {[info exists findid] && $nullid eq $findid} { unset findid - findcont $nullid + findcont } incr fdiffpos } @@ -2154,20 +2157,21 @@ proc donefilediff {} { } if {[info exists findid] && $fdiffid eq $findid} { unset findid - findcont $fdiffid + findcont } } } proc findcont {id} { - global findid treediffs parents nparents + global findid treediffs parentlist global ffileline findstartline finddidsel global displayorder numcommits matchinglines findinprogress global findmergefiles set l $ffileline - while 1 { - if {$findmergefiles || $nparents($id) == 1} { + while {1} { + set id [lindex $displayorder $l] + if {$findmergefiles || [llength [lindex $parentlist $l]] == 1} { if {![info exists treediffs($id)]} { set findid $id set ffileline $l @@ -2189,7 +2193,6 @@ proc findcont {id} { set l 0 } if {$l == $findstartline} break - set id [lindex $displayorder $l] } stopfindproc if {!$finddidsel} { @@ -2289,7 +2292,7 @@ proc appendwithlinks {text} { proc selectline {l isnew} { global canv canv2 canv3 ctext commitinfo selectedline global displayorder linehtag linentag linedtag - global canvy0 linespc parents nparents children + global canvy0 linespc parentlist childlist global cflist currentid sha1entry global commentend idtags linknum global mergemax numcommits @@ -2379,9 +2382,10 @@ proc selectline {l isnew} { } set comment {} - if {$nparents($id) > 1} { + set olds [lindex $parentlist $l] + if {[llength $olds] > 1} { set np 0 - foreach p $parents($id) { + foreach p $olds { if {$np >= $mergemax} { set tag mmax } else { @@ -2392,17 +2396,13 @@ proc selectline {l isnew} { incr np } } else { - if {[info exists parents($id)]} { - foreach p $parents($id) { - append comment "Parent: [commit_descriptor $p]\n" - } + foreach p $olds { + append comment "Parent: [commit_descriptor $p]\n" } } - if {[info exists children($id)]} { - foreach c $children($id) { - append comment "Child: [commit_descriptor $c]\n" - } + foreach c [lindex $childlist $l] { + append comment "Child: [commit_descriptor $c]\n" } append comment "\n" append comment [lindex $info 5] @@ -2417,10 +2417,10 @@ proc selectline {l isnew} { $cflist delete 0 end $cflist insert end "Comments" - if {$nparents($id) <= 1} { + if {[llength $olds] <= 1} { startdiff $id } else { - mergediff $id + mergediff $id $l } } @@ -2489,9 +2489,10 @@ proc goforw {} { } } -proc mergediff {id} { - global parents diffmergeid diffopts mdifffd +proc mergediff {id l} { + global diffmergeid diffopts mdifffd global difffilestart diffids + global parentlist set diffmergeid $id set diffids $id @@ -2505,12 +2506,13 @@ proc mergediff {id} { } fconfigure $mdf -blocking 0 set mdifffd($id) $mdf - fileevent $mdf readable [list getmergediffline $mdf $id] + set np [llength [lindex $parentlist $l]] + fileevent $mdf readable [list getmergediffline $mdf $id $np] set nextupdate [expr {[clock clicks -milliseconds] + 100}] } -proc getmergediffline {mdf id} { - global diffmergeid ctext cflist nextupdate nparents mergemax +proc getmergediffline {mdf id np} { + global diffmergeid ctext cflist nextupdate mergemax global difffilestart mdifffd set n [gets $mdf line] @@ -2543,7 +2545,6 @@ proc getmergediffline {mdf id} { # do nothing } else { # parse the prefix - one ' ', '-' or '+' for each parent - set np $nparents($id) set spaces {} set minuses {} set pluses {} @@ -2611,7 +2612,7 @@ proc addtocflist {ids} { } proc gettreediffs {ids} { - global treediff parents treepending + global treediff treepending set treepending $ids set treediff {} if {[catch \ @@ -2979,7 +2980,7 @@ proc arrowjump {id n y} { } proc lineclick {x y id isnew} { - global ctext commitinfo children cflist canv thickerline + global ctext commitinfo childlist commitrow cflist canv thickerline if {![info exists commitinfo($id)] && ![getcommit $id]} return unmarkmatches @@ -3018,10 +3019,11 @@ proc lineclick {x y id isnew} { $ctext insert end "\tAuthor:\t[lindex $info 1]\n" set date [formatdate [lindex $info 2]] $ctext insert end "\tDate:\t$date\n" - if {[info exists children($id)]} { + set kids [lindex $childlist $commitrow($id)] + if {$kids ne {}} { $ctext insert end "\nChildren:" set i 0 - foreach child $children($id) { + foreach child $kids { incr i if {![info exists commitinfo($child)] && ![getcommit $child]} continue set info $commitinfo($child) From e100712968cb781183a549f164e34596d6e7fcb2 Mon Sep 17 00:00:00 2001 From: Stephen Rothwell Date: Thu, 30 Mar 2006 16:13:12 +1100 Subject: [PATCH 02/11] [PATCH] gitk: allow goto heads This patch allows you to enter a head name in the SHA1 id: field. It also removes some unnecessary global declarations. Signed-off-by: Stephen Rothwell Signed-off-by: Paul Mackerras --- gitk | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gitk b/gitk index 90afec92df..4bc7946aee 100755 --- a/gitk +++ b/gitk @@ -2847,13 +2847,15 @@ proc sha1change {n1 n2 op} { } proc gotocommit {} { - global sha1string currentid commitrow tagids + global sha1string currentid commitrow tagids headids global displayorder numcommits if {$sha1string == {} || ([info exists currentid] && $sha1string == $currentid)} return if {[info exists tagids($sha1string)]} { set id $tagids($sha1string) + } elseif {[info exists headids($sha1string)]} { + set id $headids($sha1string) } else { set id [string tolower $sha1string] if {[regexp {^[0-9a-f]{4,39}$} $id]} { @@ -2879,7 +2881,7 @@ proc gotocommit {} { if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} { set type "SHA1 id" } else { - set type "Tag" + set type "Tag/Head" } error_popup "$type $sha1string is not known" } @@ -3370,7 +3372,6 @@ proc listrefs {id} { proc rereadrefs {} { global idtags idheads idotherrefs - global tagids headids otherrefids set refids [concat [array names idtags] \ [array names idheads] [array names idotherrefs]] From 4e95e1f738720e2f768098f73e76109c15a4e1ff Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Wed, 5 Apr 2006 09:39:51 +1000 Subject: [PATCH 03/11] gitk: Add a help menu item to display key bindings Suggested by Paul Schulz. I made it a separate entry under the Help menu rather than putting it in the About box, though. Signed-off-by: Paul Mackerras --- gitk | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/gitk b/gitk index 4bc7946aee..472c12afcb 100755 --- a/gitk +++ b/gitk @@ -353,6 +353,7 @@ proc makewindow {rargs} { menu .bar.help .bar add cascade -label "Help" -menu .bar.help .bar.help add command -label "About gitk" -command about + .bar.help add command -label "Key bindings" -command keys . configure -menu .bar if {![info exists geometry(canv1)]} { @@ -718,6 +719,47 @@ Use and redistribute under the terms of the GNU General Public License} \ pack $w.ok -side bottom } +proc keys {} { + set w .keys + if {[winfo exists $w]} { + raise $w + return + } + toplevel $w + wm title $w "Gitk key bindings" + message $w.m -text { +Gitk key bindings: + + Quit +, p, i Move up one commit +, n, k Move down one commit +, z, j Go back in history list +, x, l Go forward in history list + Scroll commit list up one page + Scroll commit list down one page +, b Scroll diff view up one page + Scroll diff view up one page + Scroll diff view down one page +u Scroll diff view up 18 lines +d Scroll diff view down 18 lines + Find + Move to next find hit + Move to previous find hit + Move to next find hit +/ Move to next find hit, or redo find +? Move to previous find hit +f Scroll diff view to next file + Increase font size + Increase font size + Decrease font size + Decrease font size +} \ + -justify left -bg white -border 2 -relief sunken + pack $w.m -side top -fill both + button $w.ok -text Close -command "destroy $w" + pack $w.ok -side bottom +} + proc shortids {ids} { set res {} foreach id $ids { @@ -1763,7 +1805,7 @@ proc drawrest {} { showstuff $commitidx set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}] - puts "overall $drawmsecs ms for $numcommits commits" + #puts "overall $drawmsecs ms for $numcommits commits" } proc findmatches {f} { From 6e5f7203de440fd46c6709a9f71a7e0641363a5c Mon Sep 17 00:00:00 2001 From: Rutger Nijlunsing Date: Wed, 5 Apr 2006 10:24:03 +1000 Subject: [PATCH 04/11] [PATCH] gitk: add key bindings for selecting first and last commit For a keyboard addict like me some keys are still missing from gitk. Especially a key to select a commit when no commit is selected, like just after startup. While we're at it, complete the bindings for moving the view seperately from the selected line. Currently, the up and down keys act on the selected line while pageup and pagedown act on the commits viewed. The idea is to have to normal keys change the selected line: - Home selects first commit - End selects last commit - Up selects previous commit - Down selects next commit - PageUp moves selected line one page up - PageDown moves selected line one page down ...and together with the Control key, it moves the commits view: - Control-Home views first page of commits - Control-End views last page of commits - Control-Up moves commit view one line up - Control-Down moves commit view one line down - Control-PageUp moves commit view one page up - Control-PageDown moves commit view one page down Signed-off-By: Rutger Nijlunsing and with some cleanups and simplifications... Signed-off-by: Paul Mackerras --- gitk | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/gitk b/gitk index 472c12afcb..8aff933e43 100755 --- a/gitk +++ b/gitk @@ -504,12 +504,20 @@ proc makewindow {rargs} { bindall "allcanvs yview scroll 5 units" bindall <2> "canvscan mark %W %x %y" bindall "canvscan dragto %W %x %y" + bindkey selfirstline + bindkey sellastline bind . "selnextline -1" bind . "selnextline 1" - bind . "goforw" - bind . "goback" - bind . "allcanvs yview scroll -1 pages" - bind . "allcanvs yview scroll 1 pages" + bindkey "goforw" + bindkey "goback" + bind . "selnextpage -1" + bind . "selnextpage 1" + bind . "allcanvs yview moveto 0.0" + bind . "allcanvs yview moveto 1.0" + bind . "allcanvs yview scroll -1 units" + bind . "allcanvs yview scroll 1 units" + bind . "allcanvs yview scroll -1 pages" + bind . "allcanvs yview scroll 1 pages" bindkey "$ctext yview scroll -1 pages" bindkey "$ctext yview scroll -1 pages" bindkey "$ctext yview scroll 1 pages" @@ -731,12 +739,20 @@ proc keys {} { Gitk key bindings: Quit + Move to first commit + Move to last commit , p, i Move up one commit , n, k Move down one commit , z, j Go back in history list , x, l Go forward in history list - Scroll commit list up one page - Scroll commit list down one page + Move up one page in commit list + Move down one page in commit list + Scroll to top of commit list + Scroll to bottom of commit list + Scroll commit list up one line + Scroll commit list down one line + Scroll commit list up one page + Scroll commit list down one page , b Scroll diff view up one page Scroll diff view up one page Scroll diff view down one page @@ -2331,6 +2347,22 @@ proc appendwithlinks {text} { $ctext tag bind link { %W configure -cursor $curtextcursor } } +proc viewnextline {dir} { + global canv linespc + + $canv delete hover + set ymax [lindex [$canv cget -scrollregion] 3] + set wnow [$canv yview] + set wtop [expr {[lindex $wnow 0] * $ymax}] + set newtop [expr {$wtop + $dir * $linespc}] + if {$newtop < 0} { + set newtop 0 + } elseif {$newtop > $ymax} { + set newtop $ymax + } + allcanvs yview moveto [expr {$newtop * 1.0 / $ymax}] +} + proc selectline {l isnew} { global canv canv2 canv3 ctext commitinfo selectedline global displayorder linehtag linentag linedtag @@ -2466,6 +2498,18 @@ proc selectline {l isnew} { } } +proc selfirstline {} { + unmarkmatches + selectline 0 1 +} + +proc sellastline {} { + global numcommits + unmarkmatches + set l [expr {$numcommits - 1}] + selectline $l 1 +} + proc selnextline {dir} { global selectedline if {![info exists selectedline]} return @@ -2474,6 +2518,25 @@ proc selnextline {dir} { selectline $l 1 } +proc selnextpage {dir} { + global canv linespc selectedline numcommits + + set lpp [expr {([winfo height $canv] - 2) / $linespc}] + if {$lpp < 1} { + set lpp 1 + } + allcanvs yview scroll [expr {$dir * $lpp}] units + if {![info exists selectedline]} return + set l [expr {$selectedline + $dir * $lpp}] + if {$l < 0} { + set l 0 + } elseif {$l >= $numcommits} { + set l [expr $numcommits - 1] + } + unmarkmatches + selectline $l 1 +} + proc unselectline {} { global selectedline From ce08872259d3036f424070cb5a9a4d5ec67f1f7a Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 3 Apr 2006 23:24:55 -0700 Subject: [PATCH 05/11] [PATCH] gitk: Use git wrapper to run git-ls-remote. For some reason, the Cygwin Tcl's `exec' command has trouble running scripts. Fix this by using the C `git' wrapper. Other GIT programs run by gitk are written in C already, so we don't need to incur a performance hit of going via the wrapper (which I'll bet isn't pretty under Cygwin). Signed-off-by: Mark Wooding Acked-by: Junio C Hamano Signed-off-by: Paul Mackerras --- gitk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitk b/gitk index 8aff933e43..26099215ae 100755 --- a/gitk +++ b/gitk @@ -284,7 +284,7 @@ proc readrefs {} { foreach v {tagids idtags headids idheads otherrefids idotherrefs} { catch {unset $v} } - set refd [open [list | git-ls-remote [gitdir]] r] + set refd [open [list | git ls-remote [gitdir]] r] while {0 <= [set n [gets $refd line]]} { if {![regexp {^([0-9a-f]{40}) refs/([^^]*)$} $line \ match id path]} { From 4840be66b10fd5e5d67e27a8d0c67a96d5b8356a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 4 Apr 2006 00:19:45 -0700 Subject: [PATCH 06/11] [PATCH] Provide configurable UI font for gitk This makes the font used in the UI elements of gitk configurable in the same way the other fonts are. The default fonts used in the Xft build of tk8.5 are particularily horrific, making this change more important there. Signed-off-by: Keith Packard Acked-by: Junio C Hamano Signed-off-by: Paul Mackerras --- gitk | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/gitk b/gitk index 26099215ae..26fa79af7a 100755 --- a/gitk +++ b/gitk @@ -335,7 +335,7 @@ proc error_popup msg { } proc makewindow {rargs} { - global canv canv2 canv3 linespc charspc ctext cflist textfont + global canv canv2 canv3 linespc charspc ctext cflist textfont mainfont uifont global findtype findtypemenu findloc findstring fstring geometry global entries sha1entry sha1string sha1but global maincursor textcursor curtextcursor @@ -343,17 +343,21 @@ proc makewindow {rargs} { menu .bar .bar add cascade -label "File" -menu .bar.file + .bar configure -font $uifont menu .bar.file .bar.file add command -label "Update" -command [list updatecommits $rargs] .bar.file add command -label "Reread references" -command rereadrefs .bar.file add command -label "Quit" -command doquit + .bar.file configure -font $uifont menu .bar.edit .bar add cascade -label "Edit" -menu .bar.edit .bar.edit add command -label "Preferences" -command doprefs + .bar.edit configure -font $uifont menu .bar.help .bar add cascade -label "Help" -menu .bar.help .bar.help add command -label "About gitk" -command about .bar.help add command -label "Key bindings" -command keys + .bar.help configure -font $uifont . configure -menu .bar if {![info exists geometry(canv1)]} { @@ -400,7 +404,7 @@ proc makewindow {rargs} { set entries $sha1entry set sha1but .ctop.top.bar.sha1label button $sha1but -text "SHA1 ID: " -state disabled -relief flat \ - -command gotocommit -width 8 + -command gotocommit -width 8 -font $uifont $sha1but conf -disabledforeground [$sha1but cget -foreground] pack .ctop.top.bar.sha1label -side left entry $sha1entry -width 40 -font $textfont -textvariable sha1string @@ -430,19 +434,24 @@ proc makewindow {rargs} { -state disabled -width 26 pack .ctop.top.bar.rightbut -side left -fill y - button .ctop.top.bar.findbut -text "Find" -command dofind + button .ctop.top.bar.findbut -text "Find" -command dofind -font $uifont pack .ctop.top.bar.findbut -side left set findstring {} set fstring .ctop.top.bar.findstring lappend entries $fstring - entry $fstring -width 30 -font $textfont -textvariable findstring + entry $fstring -width 30 -font $textfont -textvariable findstring -font $textfont pack $fstring -side left -expand 1 -fill x set findtype Exact set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \ findtype Exact IgnCase Regexp] + .ctop.top.bar.findtype configure -font $uifont + .ctop.top.bar.findtype.menu configure -font $uifont set findloc "All fields" tk_optionMenu .ctop.top.bar.findloc findloc "All fields" Headline \ Comments Author Committer Files Pickaxe + .ctop.top.bar.findloc configure -font $uifont + .ctop.top.bar.findloc.menu configure -font $uifont + pack .ctop.top.bar.findloc -side right pack .ctop.top.bar.findtype -side right # for making sure type==Exact whenever loc==Pickaxe @@ -489,7 +498,7 @@ proc makewindow {rargs} { frame .ctop.cdet.right set cflist .ctop.cdet.right.cfiles listbox $cflist -bg white -selectmode extended -width $geometry(cflistw) \ - -yscrollcommand ".ctop.cdet.right.sb set" + -yscrollcommand ".ctop.cdet.right.sb set" -font $mainfont scrollbar .ctop.cdet.right.sb -command "$cflist yview" pack .ctop.cdet.right.sb -side right -fill y pack $cflist -side left -fill both -expand 1 @@ -610,7 +619,7 @@ proc click {w} { } proc savestuff {w} { - global canv canv2 canv3 ctext cflist mainfont textfont + global canv canv2 canv3 ctext cflist mainfont textfont uifont global stuffsaved findmergefiles maxgraphpct global maxwidth @@ -620,6 +629,7 @@ proc savestuff {w} { set f [open "~/.gitk-new" w] puts $f [list set mainfont $mainfont] puts $f [list set textfont $textfont] + puts $f [list set uifont $uifont] puts $f [list set findmergefiles $findmergefiles] puts $f [list set maxgraphpct $maxgraphpct] puts $f [list set maxwidth $maxwidth] @@ -3885,6 +3895,7 @@ if {$tclencoding == {}} { set mainfont {Helvetica 9} set textfont {Courier 9} +set uifont {Helvetica 9 bold} set findmergefiles 0 set maxgraphpct 50 set maxwidth 16 From 1cd88cc9e6d6f83fed554419166a52a900e6f9a5 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Wed, 5 Apr 2006 23:22:52 +0900 Subject: [PATCH 07/11] Avoid a divide by zero if there's no messages to send. Signed-off-by: Junio C Hamano --- imap-send.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/imap-send.c b/imap-send.c index f3cb79b1f8..ea56dc9ae5 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1332,6 +1332,12 @@ main(int argc, char **argv) return 1; } + total = count_messages( &all_msgs ); + if (!total) { + fprintf(stderr,"no messages to send\n"); + return 1; + } + /* write it to the imap server */ ctx = imap_open_store( &server ); if (!ctx) { @@ -1339,7 +1345,6 @@ main(int argc, char **argv) return 1; } - total = count_messages( &all_msgs ); fprintf( stderr, "sending %d message%s\n", total, (total!=1)?"s":"" ); ctx->name = imap_folder; while (1) { From 34c5a9e284c88d415559586b79487411ece6f69c Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Wed, 5 Apr 2006 23:22:19 +0900 Subject: [PATCH 08/11] Avoid a crash if realloc returns a different pointer. Signed-off-by: Junio C Hamano --- imap-send.c | 1 + 1 file changed, 1 insertion(+) diff --git a/imap-send.c b/imap-send.c index ea56dc9ae5..52e2400b57 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1202,6 +1202,7 @@ read_message( FILE *f, msg_data_t *msg ) p = xrealloc(msg->data, len+1); if (!p) break; + msg->data = p; } r = fread( &msg->data[msg->len], 1, len - msg->len, f ); if (r <= 0) From ae5d8470f6b8e1abdef19bf033472c63fb72b735 Mon Sep 17 00:00:00 2001 From: Marco Roeland Date: Wed, 5 Apr 2006 22:28:28 +0200 Subject: [PATCH 09/11] git-commit: document --amend The "--amend" option is used to amend the tip of the current branch. This documentation text was copied straight from the commit that implemented it. Some minor format tweaks for asciidoc were taken from work by Francis Daly in commit b0d08a5.. It looks good now also in the html page. [jc: amended further to follow the recommendation by Francis in commit 3070b60]. Signed-off-by: Marco Roeland Signed-off-by: Junio C Hamano --- Documentation/git-commit.txt | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index d04b342a95..2af472a569 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -9,7 +9,8 @@ SYNOPSIS -------- [verse] 'git-commit' [-a] [-s] [-v] [(-c | -C) | -F | -m ] - [-e] [--author ] [--] [[-i | -o ]...] + [--no-verify] [--amend] [-e] [--author ] + [--] [[-i | -o ]...] DESCRIPTION ----------- @@ -71,6 +72,27 @@ OPTIONS commit log message unmodified. This option lets you further edit the message taken from these sources. +--amend:: + + Used to amend the tip of the current branch. Prepare the tree + object you would want to replace the latest commit as usual + (this includes the usual -i/-o and explicit paths), and the + commit log editor is seeded with the commit message from the + tip of the current branch. The commit you create replaces the + current tip -- if it was a merge, it will have the parents of + the current tip as parents -- so the current top commit is + discarded. ++ +It is a rough equivalent for: ++ +------------ + $ git reset --soft HEAD^ + $ ... do something else to come up with the right tree ... + $ git commit -c ORIG_HEAD +------------ ++ +but can be used to amend a merge commit. + -i|--include:: Instead of committing only the files specified on the command line, update them in the index file and then From 6cbd5d7d79f5751828397558e7c3611b048565fb Mon Sep 17 00:00:00 2001 From: Francis Daly Date: Wed, 5 Apr 2006 23:25:17 +0100 Subject: [PATCH 10/11] Tweaks to make asciidoc play nice. Once the content has been generated, the formatting elves can reorder it to be pretty... Signed-off-by: Francis Daly Signed-off-by: Junio C Hamano --- Documentation/git-commit.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 2af472a569..0a7365b9a8 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -83,15 +83,16 @@ OPTIONS the current tip as parents -- so the current top commit is discarded. + +-- It is a rough equivalent for: -+ ------------- +------ $ git reset --soft HEAD^ $ ... do something else to come up with the right tree ... $ git commit -c ORIG_HEAD ------------- -+ + +------ but can be used to amend a merge commit. +-- -i|--include:: Instead of committing only the files specified on the From 38035cf4a51c48cccf6c5e3977130261bc0c03a7 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 5 Apr 2006 15:31:12 -0700 Subject: [PATCH 11/11] date parsing: be friendlier to our European friends. This does three things, only applies to cases where the user manually tries to override the author/commit time by environment variables, with non-ISO, non-2822 format date-string: - Refuses to use the interpretation to put the date in the future; recent kernel history has a commit made with 10/03/2006 which is recorded as October 3rd. - Adds '.' as the possible year-month-date separator. We learned from our European friends on the #git channel that dd.mm.yyyy is the norm there. - When the separator is '.', we prefer dd.mm.yyyy over mm.dd.yyyy; otherwise mm/dd/yy[yy] takes precedence over dd/mm/yy[yy]. Signed-off-by: Junio C Hamano --- date.c | 83 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/date.c b/date.c index 376d25d241..034d7228bf 100644 --- a/date.c +++ b/date.c @@ -197,26 +197,43 @@ static int match_alpha(const char *date, struct tm *tm, int *offset) return skip_alpha(date); } -static int is_date(int year, int month, int day, struct tm *tm) +static int is_date(int year, int month, int day, struct tm *now_tm, time_t now, struct tm *tm) { if (month > 0 && month < 13 && day > 0 && day < 32) { - if (year == -1) { - tm->tm_mon = month-1; - tm->tm_mday = day; - return 1; - } - if (year >= 1970 && year < 2100) { - year -= 1900; - } else if (year > 70 && year < 100) { - /* ok */ - } else if (year < 38) { - year += 100; - } else - return 0; + struct tm check = *tm; + struct tm *r = (now_tm ? &check : tm); + time_t specified; - tm->tm_mon = month-1; - tm->tm_mday = day; - tm->tm_year = year; + r->tm_mon = month - 1; + r->tm_mday = day; + if (year == -1) { + if (!now_tm) + return 1; + r->tm_year = now_tm->tm_year; + } + else if (year >= 1970 && year < 2100) + r->tm_year = year - 1900; + else if (year > 70 && year < 100) + r->tm_year = year; + else if (year < 38) + r->tm_year = year + 100; + else + return 0; + if (!now_tm) + return 1; + + specified = my_mktime(r); + + /* Be it commit time or author time, it does not make + * sense to specify timestamp way into the future. Make + * sure it is not later than ten days from now... + */ + if (now + 10*24*3600 < specified) + return 0; + tm->tm_mon = r->tm_mon; + tm->tm_mday = r->tm_mday; + if (year != -1) + tm->tm_year = r->tm_year; return 1; } return 0; @@ -224,6 +241,9 @@ static int is_date(int year, int month, int day, struct tm *tm) static int match_multi_number(unsigned long num, char c, const char *date, char *end, struct tm *tm) { + time_t now; + struct tm now_tm; + struct tm *refuse_future; long num2, num3; num2 = strtol(end+1, &end, 10); @@ -246,19 +266,33 @@ static int match_multi_number(unsigned long num, char c, const char *date, char case '-': case '/': + case '.': + now = time(NULL); + refuse_future = NULL; + if (gmtime_r(&now, &now_tm)) + refuse_future = &now_tm; + if (num > 70) { /* yyyy-mm-dd? */ - if (is_date(num, num2, num3, tm)) + if (is_date(num, num2, num3, refuse_future, now, tm)) break; /* yyyy-dd-mm? */ - if (is_date(num, num3, num2, tm)) + if (is_date(num, num3, num2, refuse_future, now, tm)) break; } - /* mm/dd/yy ? */ - if (is_date(num3, num, num2, tm)) + /* Our eastern European friends say dd.mm.yy[yy] + * is the norm there, so giving precedence to + * mm/dd/yy[yy] form only when separator is not '.' + */ + if (c != '.' && + is_date(num3, num, num2, refuse_future, now, tm)) break; - /* dd/mm/yy ? */ - if (is_date(num3, num2, num, tm)) + /* European dd.mm.yy[yy] or funny US dd/mm/yy[yy] */ + if (is_date(num3, num2, num, refuse_future, now, tm)) + break; + /* Funny European mm.dd.yy */ + if (c == '.' && + is_date(num3, num, num2, refuse_future, now, tm)) break; return 0; } @@ -288,10 +322,11 @@ static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt } /* - * Check for special formats: num[:-/]num[same]num + * Check for special formats: num[-.:/]num[same]num */ switch (*end) { case ':': + case '.': case '/': case '-': if (isdigit(end[1])) {