Merge branch 'master' of git://git.kernel.org/pub/scm/gitk/gitk
* 'master' of git://git.kernel.org/pub/scm/gitk/gitk: gitk: Fix bugs in the Find function gitk: Wait for the window to become visible after creating it [PATCH] gitk: Bind keyboard actions to the command key on Mac OS [PATCH] gitk: Ignore ctrl-z as EOF on windows gitk: Make the fake commit for the index changes green rather than magenta gitk: Show changes in index and changes in working directory separatelymaint
						commit
						11bb2d4fa9
					
				
							
								
								
									
										364
									
								
								gitk
								
								
								
								
							
							
						
						
									
										364
									
								
								gitk
								
								
								
								
							|  | @ -101,7 +101,7 @@ proc start_rev_list {view} { | |||
|     set commfd($view) $fd | ||||
|     set leftover($view) {} | ||||
|     set lookingforhead $showlocalchanges | ||||
|     fconfigure $fd -blocking 0 -translation lf | ||||
|     fconfigure $fd -blocking 0 -translation lf -eofchar {} | ||||
|     if {$tclencoding != {}} { | ||||
| 	fconfigure $fd -encoding $tclencoding | ||||
|     } | ||||
|  | @ -139,6 +139,10 @@ proc getcommitlines {fd view}  { | |||
|     global vparentlist vdisporder vcmitlisted | ||||
|  | ||||
|     set stuff [read $fd 500000] | ||||
|     # git log doesn't terminate the last commit with a null... | ||||
|     if {$stuff == {} && $leftover($view) ne {} && [eof $fd]} { | ||||
| 	set stuff "\0" | ||||
|     } | ||||
|     if {$stuff == {}} { | ||||
| 	if {![eof $fd]} { | ||||
| 	    return 1 | ||||
|  | @ -262,11 +266,11 @@ proc chewcommits {view} { | |||
| 	set tlimit [expr {[clock clicks -milliseconds] + 50}] | ||||
| 	set more [layoutmore $tlimit $allread] | ||||
| 	if {$allread && !$more} { | ||||
| 	    global displayorder nullid commitidx phase | ||||
| 	    global displayorder commitidx phase | ||||
| 	    global numcommits startmsecs | ||||
|  | ||||
| 	    if {[info exists pending_select]} { | ||||
| 		set row [expr {[lindex $displayorder 0] eq $nullid}] | ||||
| 		set row [first_real_row] | ||||
| 		selectline $row 1 | ||||
| 	    } | ||||
| 	    if {$commitidx($curview) > 0} { | ||||
|  | @ -437,6 +441,19 @@ proc readrefs {} { | |||
|     } | ||||
| } | ||||
|  | ||||
| # skip over fake commits | ||||
| proc first_real_row {} { | ||||
|     global nullid nullid2 displayorder numcommits | ||||
|  | ||||
|     for {set row 0} {$row < $numcommits} {incr row} { | ||||
| 	set id [lindex $displayorder $row] | ||||
| 	if {$id ne $nullid && $id ne $nullid2} { | ||||
| 	    break | ||||
| 	} | ||||
|     } | ||||
|     return $row | ||||
| } | ||||
|  | ||||
| # update things for a head moved to a child of its previous location | ||||
| proc movehead {id name} { | ||||
|     global headids idheads | ||||
|  | @ -796,6 +813,12 @@ proc makewindow {} { | |||
|         wm geometry . "$geometry(main)" | ||||
|     } | ||||
|  | ||||
|     if {[tk windowingsystem] eq {aqua}} { | ||||
|         set M1B M1 | ||||
|     } else { | ||||
|         set M1B Control | ||||
|     } | ||||
|  | ||||
|     bind .pwbottom <Configure> {resizecdetpanes %W %w} | ||||
|     pack .ctop -fill both -expand 1 | ||||
|     bindall <1> {selcanvline %W %x %y} | ||||
|  | @ -814,12 +837,12 @@ proc makewindow {} { | |||
|     bindkey <Key-Left> "goback" | ||||
|     bind . <Key-Prior> "selnextpage -1" | ||||
|     bind . <Key-Next> "selnextpage 1" | ||||
|     bind . <Control-Home> "allcanvs yview moveto 0.0" | ||||
|     bind . <Control-End> "allcanvs yview moveto 1.0" | ||||
|     bind . <Control-Key-Up> "allcanvs yview scroll -1 units" | ||||
|     bind . <Control-Key-Down> "allcanvs yview scroll 1 units" | ||||
|     bind . <Control-Key-Prior> "allcanvs yview scroll -1 pages" | ||||
|     bind . <Control-Key-Next> "allcanvs yview scroll 1 pages" | ||||
|     bind . <$M1B-Home> "allcanvs yview moveto 0.0" | ||||
|     bind . <$M1B-End> "allcanvs yview moveto 1.0" | ||||
|     bind . <$M1B-Key-Up> "allcanvs yview scroll -1 units" | ||||
|     bind . <$M1B-Key-Down> "allcanvs yview scroll 1 units" | ||||
|     bind . <$M1B-Key-Prior> "allcanvs yview scroll -1 pages" | ||||
|     bind . <$M1B-Key-Next> "allcanvs yview scroll 1 pages" | ||||
|     bindkey <Key-Delete> "$ctext yview scroll -1 pages" | ||||
|     bindkey <Key-BackSpace> "$ctext yview scroll -1 pages" | ||||
|     bindkey <Key-space> "$ctext yview scroll 1 pages" | ||||
|  | @ -839,15 +862,15 @@ proc makewindow {} { | |||
|     bindkey ? findprev | ||||
|     bindkey f nextfile | ||||
|     bindkey <F5> updatecommits | ||||
|     bind . <Control-q> doquit | ||||
|     bind . <Control-f> dofind | ||||
|     bind . <Control-g> {findnext 0} | ||||
|     bind . <Control-r> dosearchback | ||||
|     bind . <Control-s> dosearch | ||||
|     bind . <Control-equal> {incrfont 1} | ||||
|     bind . <Control-KP_Add> {incrfont 1} | ||||
|     bind . <Control-minus> {incrfont -1} | ||||
|     bind . <Control-KP_Subtract> {incrfont -1} | ||||
|     bind . <$M1B-q> doquit | ||||
|     bind . <$M1B-f> dofind | ||||
|     bind . <$M1B-g> {findnext 0} | ||||
|     bind . <$M1B-r> dosearchback | ||||
|     bind . <$M1B-s> dosearch | ||||
|     bind . <$M1B-equal> {incrfont 1} | ||||
|     bind . <$M1B-KP_Add> {incrfont 1} | ||||
|     bind . <$M1B-minus> {incrfont -1} | ||||
|     bind . <$M1B-KP_Subtract> {incrfont -1} | ||||
|     wm protocol . WM_DELETE_WINDOW doquit | ||||
|     bind . <Button-1> "click %W" | ||||
|     bind $fstring <Key-Return> dofind | ||||
|  | @ -1088,12 +1111,17 @@ proc keys {} { | |||
| 	raise $w | ||||
| 	return | ||||
|     } | ||||
|     if {[tk windowingsystem] eq {aqua}} { | ||||
| 	set M1T Cmd | ||||
|     } else { | ||||
| 	set M1T Ctrl | ||||
|     } | ||||
|     toplevel $w | ||||
|     wm title $w "Gitk key bindings" | ||||
|     message $w.m -text { | ||||
|     message $w.m -text " | ||||
| Gitk key bindings: | ||||
|  | ||||
| <Ctrl-Q>		Quit | ||||
| <$M1T-Q>		Quit | ||||
| <Home>		Move to first commit | ||||
| <End>		Move to last commit | ||||
| <Up>, p, i	Move up one commit | ||||
|  | @ -1102,12 +1130,12 @@ Gitk key bindings: | |||
| <Right>, x, l	Go forward in history list | ||||
| <PageUp>	Move up one page in commit list | ||||
| <PageDown>	Move down one page in commit list | ||||
| <Ctrl-Home>	Scroll to top of commit list | ||||
| <Ctrl-End>	Scroll to bottom of commit list | ||||
| <Ctrl-Up>	Scroll commit list up one line | ||||
| <Ctrl-Down>	Scroll commit list down one line | ||||
| <Ctrl-PageUp>	Scroll commit list up one page | ||||
| <Ctrl-PageDown>	Scroll commit list down one page | ||||
| <$M1T-Home>	Scroll to top of commit list | ||||
| <$M1T-End>	Scroll to bottom of commit list | ||||
| <$M1T-Up>	Scroll commit list up one line | ||||
| <$M1T-Down>	Scroll commit list down one line | ||||
| <$M1T-PageUp>	Scroll commit list up one page | ||||
| <$M1T-PageDown>	Scroll commit list down one page | ||||
| <Shift-Up>	Move to previous highlighted line | ||||
| <Shift-Down>	Move to next highlighted line | ||||
| <Delete>, b	Scroll diff view up one page | ||||
|  | @ -1115,20 +1143,20 @@ Gitk key bindings: | |||
| <Space>		Scroll diff view down one page | ||||
| u		Scroll diff view up 18 lines | ||||
| d		Scroll diff view down 18 lines | ||||
| <Ctrl-F>		Find | ||||
| <Ctrl-G>		Move to next find hit | ||||
| <$M1T-F>		Find | ||||
| <$M1T-G>		Move to next find hit | ||||
| <Return>	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 | ||||
| <Ctrl-S>		Search for next hit in diff view | ||||
| <Ctrl-R>		Search for previous hit in diff view | ||||
| <Ctrl-KP+>	Increase font size | ||||
| <Ctrl-plus>	Increase font size | ||||
| <Ctrl-KP->	Decrease font size | ||||
| <Ctrl-minus>	Decrease font size | ||||
| <$M1T-S>		Search for next hit in diff view | ||||
| <$M1T-R>		Search for previous hit in diff view | ||||
| <$M1T-KP+>	Increase font size | ||||
| <$M1T-plus>	Increase font size | ||||
| <$M1T-KP->	Decrease font size | ||||
| <$M1T-minus>	Decrease font size | ||||
| <F5>		Update | ||||
| } \ | ||||
| " \ | ||||
| 	    -justify left -bg white -border 2 -relief groove | ||||
|     pack $w.m -side top -fill both -padx 2 -pady 2 | ||||
|     $w.m configure -font $uifont | ||||
|  | @ -1871,7 +1899,7 @@ proc showview {n} { | |||
|     } elseif {$selid ne {}} { | ||||
| 	set pending_select $selid | ||||
|     } else { | ||||
| 	set row [expr {[lindex $displayorder 0] eq $nullid}] | ||||
| 	set row [first_real_row] | ||||
| 	if {$row < $numcommits} { | ||||
| 	    selectline $row 0 | ||||
| 	} else { | ||||
|  | @ -2133,7 +2161,7 @@ proc readfhighlight {} { | |||
|  | ||||
| proc find_change {name ix op} { | ||||
|     global nhighlights mainfont boldnamerows | ||||
|     global findstring findpattern findtype markingmatches | ||||
|     global findstring findpattern findtype | ||||
|  | ||||
|     # delete previous highlights, if any | ||||
|     foreach row $boldnamerows { | ||||
|  | @ -2148,7 +2176,6 @@ proc find_change {name ix op} { | |||
| 		   $findstring] | ||||
| 	set findpattern "*$e*" | ||||
|     } | ||||
|     set markingmatches [expr {$findstring ne {}}] | ||||
|     drawvisible | ||||
| } | ||||
|  | ||||
|  | @ -2194,26 +2221,32 @@ proc askfindhighlight {row id} { | |||
| 	    } | ||||
| 	} | ||||
| 	if {$markingmatches} { | ||||
| 	    markrowmatches $row [lindex $info 0] [lindex $info 1] | ||||
| 	    markrowmatches $row $id | ||||
| 	} | ||||
|     } | ||||
|     set nhighlights($row) $isbold | ||||
| } | ||||
|  | ||||
| proc markrowmatches {row headline author} { | ||||
|     global canv canv2 linehtag linentag | ||||
| proc markrowmatches {row id} { | ||||
|     global canv canv2 linehtag linentag commitinfo findloc | ||||
|  | ||||
|     set headline [lindex $commitinfo($id) 0] | ||||
|     set author [lindex $commitinfo($id) 1] | ||||
|     $canv delete match$row | ||||
|     $canv2 delete match$row | ||||
|     set m [findmatches $headline] | ||||
|     if {$m ne {}} { | ||||
| 	markmatches $canv $row $headline $linehtag($row) $m \ | ||||
| 	    [$canv itemcget $linehtag($row) -font] | ||||
|     if {$findloc eq "All fields" || $findloc eq "Headline"} { | ||||
| 	set m [findmatches $headline] | ||||
| 	if {$m ne {}} { | ||||
| 	    markmatches $canv $row $headline $linehtag($row) $m \ | ||||
| 		[$canv itemcget $linehtag($row) -font] $row | ||||
| 	} | ||||
|     } | ||||
|     set m [findmatches $author] | ||||
|     if {$m ne {}} { | ||||
| 	markmatches $canv2 $row $author $linentag($row) $m \ | ||||
| 	    [$canv2 itemcget $linentag($row) -font] | ||||
|     if {$findloc eq "All fields" || $findloc eq "Author"} { | ||||
| 	set m [findmatches $author] | ||||
| 	if {$m ne {}} { | ||||
| 	    markmatches $canv2 $row $author $linentag($row) $m \ | ||||
| 		[$canv2 itemcget $linentag($row) -font] $row | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | @ -2643,7 +2676,7 @@ proc layoutmore {tmax allread} { | |||
|  | ||||
| proc showstuff {canshow last} { | ||||
|     global numcommits commitrow pending_select selectedline curview | ||||
|     global lookingforhead mainheadid displayorder nullid selectfirst | ||||
|     global lookingforhead mainheadid displayorder selectfirst | ||||
|     global lastscrollset | ||||
|  | ||||
|     if {$numcommits == 0} { | ||||
|  | @ -2676,7 +2709,7 @@ proc showstuff {canshow last} { | |||
| 	if {[info exists selectedline] || [info exists pending_select]} { | ||||
| 	    set selectfirst 0 | ||||
| 	} else { | ||||
| 	    set l [expr {[lindex $displayorder 0] eq $nullid}] | ||||
| 	    set l [first_real_row] | ||||
| 	    selectline $l 1 | ||||
| 	    set selectfirst 0 | ||||
| 	} | ||||
|  | @ -2700,48 +2733,93 @@ proc doshowlocalchanges {} { | |||
| } | ||||
|  | ||||
| proc dohidelocalchanges {} { | ||||
|     global lookingforhead localrow lserial | ||||
|     global lookingforhead localfrow localirow lserial | ||||
|  | ||||
|     set lookingforhead 0 | ||||
|     if {$localrow >= 0} { | ||||
| 	removerow $localrow | ||||
| 	set localrow -1 | ||||
|     if {$localfrow >= 0} { | ||||
| 	removerow $localfrow | ||||
| 	set localfrow -1 | ||||
| 	if {$localirow > 0} { | ||||
| 	    incr localirow -1 | ||||
| 	} | ||||
|     } | ||||
|     if {$localirow >= 0} { | ||||
| 	removerow $localirow | ||||
| 	set localirow -1 | ||||
|     } | ||||
|     incr lserial | ||||
| } | ||||
|  | ||||
| # spawn off a process to do git diff-index HEAD | ||||
| # spawn off a process to do git diff-index --cached HEAD | ||||
| proc dodiffindex {} { | ||||
|     global localrow lserial | ||||
|     global localirow localfrow lserial | ||||
|  | ||||
|     incr lserial | ||||
|     set localrow -1 | ||||
|     set fd [open "|git diff-index HEAD" r] | ||||
|     set localfrow -1 | ||||
|     set localirow -1 | ||||
|     set fd [open "|git diff-index --cached HEAD" r] | ||||
|     fconfigure $fd -blocking 0 | ||||
|     filerun $fd [list readdiffindex $fd $lserial] | ||||
| } | ||||
|  | ||||
| proc readdiffindex {fd serial} { | ||||
|     global localrow commitrow mainheadid nullid curview | ||||
|     global localirow commitrow mainheadid nullid2 curview | ||||
|     global commitinfo commitdata lserial | ||||
|  | ||||
|     set isdiff 1 | ||||
|     if {[gets $fd line] < 0} { | ||||
| 	if {[eof $fd]} { | ||||
| 	    close $fd | ||||
| 	    return 0 | ||||
| 	if {![eof $fd]} { | ||||
| 	    return 1 | ||||
| 	} | ||||
| 	return 1 | ||||
| 	set isdiff 0 | ||||
|     } | ||||
|     # we only need to see one line and we don't really care what it says... | ||||
|     close $fd | ||||
|  | ||||
|     if {$serial == $lserial && $localrow == -1} { | ||||
|     # now see if there are any local changes not checked in to the index | ||||
|     if {$serial == $lserial} { | ||||
| 	set fd [open "|git diff-files" r] | ||||
| 	fconfigure $fd -blocking 0 | ||||
| 	filerun $fd [list readdifffiles $fd $serial] | ||||
|     } | ||||
|  | ||||
|     if {$isdiff && $serial == $lserial && $localirow == -1} { | ||||
| 	# add the line for the changes in the index to the graph | ||||
| 	set localirow $commitrow($curview,$mainheadid) | ||||
| 	set hl "Local changes checked in to index but not committed" | ||||
| 	set commitinfo($nullid2) [list  $hl {} {} {} {} "    $hl\n"] | ||||
| 	set commitdata($nullid2) "\n    $hl\n" | ||||
| 	insertrow $localirow $nullid2 | ||||
|     } | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| proc readdifffiles {fd serial} { | ||||
|     global localirow localfrow commitrow mainheadid nullid curview | ||||
|     global commitinfo commitdata lserial | ||||
|  | ||||
|     set isdiff 1 | ||||
|     if {[gets $fd line] < 0} { | ||||
| 	if {![eof $fd]} { | ||||
| 	    return 1 | ||||
| 	} | ||||
| 	set isdiff 0 | ||||
|     } | ||||
|     # we only need to see one line and we don't really care what it says... | ||||
|     close $fd | ||||
|  | ||||
|     if {$isdiff && $serial == $lserial && $localfrow == -1} { | ||||
| 	# add the line for the local diff to the graph | ||||
| 	set localrow $commitrow($curview,$mainheadid) | ||||
| 	set hl "Local uncommitted changes" | ||||
| 	if {$localirow >= 0} { | ||||
| 	    set localfrow $localirow | ||||
| 	    incr localirow | ||||
| 	} else { | ||||
| 	    set localfrow $commitrow($curview,$mainheadid) | ||||
| 	} | ||||
| 	set hl "Local uncommitted changes, not checked in to index" | ||||
| 	set commitinfo($nullid) [list  $hl {} {} {} {} "    $hl\n"] | ||||
| 	set commitdata($nullid) "\n    $hl\n" | ||||
| 	insertrow $localrow $nullid | ||||
| 	insertrow $localfrow $nullid | ||||
|     } | ||||
|     return 0 | ||||
| } | ||||
|  | @ -3337,13 +3415,15 @@ proc drawcmittext {id row col} { | |||
|     global linespc canv canv2 canv3 canvy0 fgcolor curview | ||||
|     global commitlisted commitinfo rowidlist parentlist | ||||
|     global rowtextx idpos idtags idheads idotherrefs | ||||
|     global linehtag linentag linedtag markingmatches | ||||
|     global mainfont canvxmax boldrows boldnamerows fgcolor nullid | ||||
|     global linehtag linentag linedtag | ||||
|     global mainfont canvxmax boldrows boldnamerows fgcolor nullid nullid2 | ||||
|  | ||||
|     # listed is 0 for boundary, 1 for normal, 2 for left, 3 for right | ||||
|     set listed [lindex $commitlisted $row] | ||||
|     if {$id eq $nullid} { | ||||
| 	set ofill red | ||||
|     } elseif {$id eq $nullid2} { | ||||
| 	set ofill green | ||||
|     } else { | ||||
| 	set ofill [expr {$listed != 0? "blue": "white"}] | ||||
|     } | ||||
|  | @ -3412,9 +3492,6 @@ proc drawcmittext {id row col} { | |||
|     set linedtag($row) [$canv3 create text 3 $y -anchor w -fill $fgcolor \ | ||||
| 			    -text $date -font $mainfont -tags text] | ||||
|     set xr [expr {$xt + [font measure $mainfont $headline]}] | ||||
|     if {$markingmatches} { | ||||
| 	markrowmatches $row $headline $name | ||||
|     } | ||||
|     if {$xr > $canvxmax} { | ||||
| 	set canvxmax $xr | ||||
| 	setcanvscroll | ||||
|  | @ -3423,7 +3500,7 @@ proc drawcmittext {id row col} { | |||
|  | ||||
| proc drawcmitrow {row} { | ||||
|     global displayorder rowidlist | ||||
|     global iddrawn | ||||
|     global iddrawn markingmatches | ||||
|     global commitinfo parentlist numcommits | ||||
|     global filehighlight fhighlights findstring nhighlights | ||||
|     global hlview vhighlights | ||||
|  | @ -3444,18 +3521,22 @@ proc drawcmitrow {row} { | |||
|     if {$highlight_related ne "None" && ![info exists rhighlights($row)]} { | ||||
| 	askrelhighlight $row $id | ||||
|     } | ||||
|     if {[info exists iddrawn($id)]} return | ||||
|     set col [lsearch -exact [lindex $rowidlist $row] $id] | ||||
|     if {$col < 0} { | ||||
| 	puts "oops, row $row id $id not in list" | ||||
| 	return | ||||
|     if {![info exists iddrawn($id)]} { | ||||
| 	set col [lsearch -exact [lindex $rowidlist $row] $id] | ||||
| 	if {$col < 0} { | ||||
| 	    puts "oops, row $row id $id not in list" | ||||
| 	    return | ||||
| 	} | ||||
| 	if {![info exists commitinfo($id)]} { | ||||
| 	    getcommit $id | ||||
| 	} | ||||
| 	assigncolor $id | ||||
| 	drawcmittext $id $row $col | ||||
| 	set iddrawn($id) 1 | ||||
|     } | ||||
|     if {![info exists commitinfo($id)]} { | ||||
| 	getcommit $id | ||||
|     if {$markingmatches} { | ||||
| 	markrowmatches $row $id | ||||
|     } | ||||
|     assigncolor $id | ||||
|     drawcmittext $id $row $col | ||||
|     set iddrawn($id) 1 | ||||
| } | ||||
|  | ||||
| proc drawcommits {row {endrow {}}} { | ||||
|  | @ -3973,7 +4054,6 @@ proc dofind {{rev 0}} { | |||
|     if {!$rev} { | ||||
| 	run findmore | ||||
|     } else { | ||||
| 	set findcurline $findstartline | ||||
| 	if {$findcurline == 0} { | ||||
| 	    set findcurline $numcommits | ||||
| 	} | ||||
|  | @ -4008,7 +4088,7 @@ proc findprev {} { | |||
|  | ||||
| proc findmore {} { | ||||
|     global commitdata commitinfo numcommits findstring findpattern findloc | ||||
|     global findstartline findcurline markingmatches displayorder | ||||
|     global findstartline findcurline displayorder | ||||
|  | ||||
|     set fldtypes {Headline Author Date Committer CDate Comments} | ||||
|     set l [expr {$findcurline + 1}] | ||||
|  | @ -4026,6 +4106,8 @@ proc findmore {} { | |||
|     set last 0 | ||||
|     for {} {$l < $lim} {incr l} { | ||||
| 	set id [lindex $displayorder $l] | ||||
| 	# shouldn't happen unless git log doesn't give all the commits... | ||||
| 	if {![info exists commitdata($id)]} continue | ||||
| 	if {![doesmatch $commitdata($id)]} continue | ||||
| 	if {![info exists commitinfo($id)]} { | ||||
| 	    getcommit $id | ||||
|  | @ -4034,7 +4116,6 @@ proc findmore {} { | |||
| 	foreach f $info ty $fldtypes { | ||||
| 	    if {($findloc eq "All fields" || $findloc eq $ty) && | ||||
| 		[doesmatch $f]} { | ||||
| 		set markingmatches 1 | ||||
| 		findselectline $l | ||||
| 		notbusy finding | ||||
| 		return 0 | ||||
|  | @ -4053,7 +4134,7 @@ proc findmore {} { | |||
|  | ||||
| proc findmorerev {} { | ||||
|     global commitdata commitinfo numcommits findstring findpattern findloc | ||||
|     global findstartline findcurline markingmatches displayorder | ||||
|     global findstartline findcurline displayorder | ||||
|  | ||||
|     set fldtypes {Headline Author Date Committer CDate Comments} | ||||
|     set l $findcurline | ||||
|  | @ -4080,7 +4161,6 @@ proc findmorerev {} { | |||
| 	foreach f $info ty $fldtypes { | ||||
| 	    if {($findloc eq "All fields" || $findloc eq $ty) && | ||||
| 		[doesmatch $f]} { | ||||
| 		set markingmatches 1 | ||||
| 		findselectline $l | ||||
| 		notbusy finding | ||||
| 		return 0 | ||||
|  | @ -4098,7 +4178,10 @@ proc findmorerev {} { | |||
| } | ||||
|  | ||||
| proc findselectline {l} { | ||||
|     global findloc commentend ctext | ||||
|     global findloc commentend ctext findcurline markingmatches | ||||
|  | ||||
|     set markingmatches 1 | ||||
|     set findcurline $l | ||||
|     selectline $l 1 | ||||
|     if {$findloc == "All fields" || $findloc == "Comments"} { | ||||
| 	# highlight the matches in the comments | ||||
|  | @ -4110,10 +4193,13 @@ proc findselectline {l} { | |||
| 	    $ctext tag add found "1.0 + $start c" "1.0 + $end c" | ||||
| 	} | ||||
|     } | ||||
|     drawvisible | ||||
| } | ||||
|  | ||||
| # mark the bits of a headline or author that match a find string | ||||
| proc markmatches {canv l str tag matches font} { | ||||
| proc markmatches {canv l str tag matches font row} { | ||||
|     global selectedline | ||||
|  | ||||
|     set bbox [$canv bbox $tag] | ||||
|     set x0 [lindex $bbox 0] | ||||
|     set y0 [lindex $bbox 1] | ||||
|  | @ -4128,6 +4214,9 @@ proc markmatches {canv l str tag matches font} { | |||
| 		   [expr {$x0+$xlen+2}] $y1 \ | ||||
| 		   -outline {} -tags [list match$l matches] -fill yellow] | ||||
| 	$canv lower $t | ||||
| 	if {[info exists selectedline] && $row == $selectedline} { | ||||
| 	    $canv raise $t secsel | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | @ -4582,16 +4671,19 @@ proc goforw {} { | |||
| } | ||||
|  | ||||
| proc gettree {id} { | ||||
|     global treefilelist treeidlist diffids diffmergeid treepending nullid | ||||
|     global treefilelist treeidlist diffids diffmergeid treepending | ||||
|     global nullid nullid2 | ||||
|  | ||||
|     set diffids $id | ||||
|     catch {unset diffmergeid} | ||||
|     if {![info exists treefilelist($id)]} { | ||||
| 	if {![info exists treepending]} { | ||||
| 	    if {$id ne $nullid} { | ||||
| 		set cmd [concat | git ls-tree -r $id] | ||||
| 	    if {$id eq $nullid} { | ||||
| 		set cmd [list | git ls-files] | ||||
| 	    } elseif {$id eq $nullid2} { | ||||
| 		set cmd [list | git ls-files --stage -t] | ||||
| 	    } else { | ||||
| 		set cmd [concat | git ls-files] | ||||
| 		set cmd [list | git ls-tree -r $id] | ||||
| 	    } | ||||
| 	    if {[catch {set gtf [open $cmd r]}]} { | ||||
| 		return | ||||
|  | @ -4608,12 +4700,14 @@ proc gettree {id} { | |||
| } | ||||
|  | ||||
| proc gettreeline {gtf id} { | ||||
|     global treefilelist treeidlist treepending cmitmode diffids nullid | ||||
|     global treefilelist treeidlist treepending cmitmode diffids nullid nullid2 | ||||
|  | ||||
|     set nl 0 | ||||
|     while {[incr nl] <= 1000 && [gets $gtf line] >= 0} { | ||||
| 	if {$diffids ne $nullid} { | ||||
| 	    if {[lindex $line 1] ne "blob"} continue | ||||
| 	if {$diffids eq $nullid} { | ||||
| 	    set fname $line | ||||
| 	} else { | ||||
| 	    if {$diffids ne $nullid2 && [lindex $line 1] ne "blob"} continue | ||||
| 	    set i [string first "\t" $line] | ||||
| 	    if {$i < 0} continue | ||||
| 	    set sha1 [lindex $line 2] | ||||
|  | @ -4622,8 +4716,6 @@ proc gettreeline {gtf id} { | |||
| 		set fname [lindex $fname 0] | ||||
| 	    } | ||||
| 	    lappend treeidlist($id) $sha1 | ||||
| 	} else { | ||||
| 	    set fname $line | ||||
| 	} | ||||
| 	lappend treefilelist($id) $fname | ||||
|     } | ||||
|  | @ -4645,7 +4737,7 @@ proc gettreeline {gtf id} { | |||
| } | ||||
|  | ||||
| proc showfile {f} { | ||||
|     global treefilelist treeidlist diffids nullid | ||||
|     global treefilelist treeidlist diffids nullid nullid2 | ||||
|     global ctext commentend | ||||
|  | ||||
|     set i [lsearch -exact $treefilelist($diffids) $f] | ||||
|  | @ -4653,15 +4745,15 @@ proc showfile {f} { | |||
| 	puts "oops, $f not in list for id $diffids" | ||||
| 	return | ||||
|     } | ||||
|     if {$diffids ne $nullid} { | ||||
| 	set blob [lindex $treeidlist($diffids) $i] | ||||
| 	if {[catch {set bf [open [concat | git cat-file blob $blob] r]} err]} { | ||||
| 	    puts "oops, error reading blob $blob: $err" | ||||
|     if {$diffids eq $nullid} { | ||||
| 	if {[catch {set bf [open $f r]} err]} { | ||||
| 	    puts "oops, can't read $f: $err" | ||||
| 	    return | ||||
| 	} | ||||
|     } else { | ||||
| 	if {[catch {set bf [open $f r]} err]} { | ||||
| 	    puts "oops, can't read $f: $err" | ||||
| 	set blob [lindex $treeidlist($diffids) $i] | ||||
| 	if {[catch {set bf [open [concat | git cat-file blob $blob] r]} err]} { | ||||
| 	    puts "oops, error reading blob $blob: $err" | ||||
| 	    return | ||||
| 	} | ||||
|     } | ||||
|  | @ -4789,11 +4881,13 @@ proc getmergediffline {mdf id np} { | |||
| } | ||||
|  | ||||
| proc startdiff {ids} { | ||||
|     global treediffs diffids treepending diffmergeid nullid | ||||
|     global treediffs diffids treepending diffmergeid nullid nullid2 | ||||
|  | ||||
|     set diffids $ids | ||||
|     catch {unset diffmergeid} | ||||
|     if {![info exists treediffs($ids)] || [lsearch -exact $ids $nullid] >= 0} { | ||||
|     if {![info exists treediffs($ids)] || | ||||
| 	[lsearch -exact $ids $nullid] >= 0 || | ||||
| 	[lsearch -exact $ids $nullid2] >= 0} { | ||||
| 	if {![info exists treepending]} { | ||||
| 	    gettreediffs $ids | ||||
| 	} | ||||
|  | @ -4809,22 +4903,41 @@ proc addtocflist {ids} { | |||
| } | ||||
|  | ||||
| proc diffcmd {ids flags} { | ||||
|     global nullid | ||||
|     global nullid nullid2 | ||||
|  | ||||
|     set i [lsearch -exact $ids $nullid] | ||||
|     set j [lsearch -exact $ids $nullid2] | ||||
|     if {$i >= 0} { | ||||
| 	set cmd [concat | git diff-index $flags] | ||||
| 	if {[llength $ids] > 1} { | ||||
| 	if {[llength $ids] > 1 && $j < 0} { | ||||
| 	    # comparing working directory with some specific revision | ||||
| 	    set cmd [concat | git diff-index $flags] | ||||
| 	    if {$i == 0} { | ||||
| 		lappend cmd -R [lindex $ids 1] | ||||
| 	    } else { | ||||
| 		lappend cmd [lindex $ids 0] | ||||
| 	    } | ||||
| 	} else { | ||||
| 	    # comparing working directory with index | ||||
| 	    set cmd [concat | git diff-files $flags] | ||||
| 	    if {$j == 1} { | ||||
| 		lappend cmd -R | ||||
| 	    } | ||||
| 	} | ||||
|     } elseif {$j >= 0} { | ||||
| 	set cmd [concat | git diff-index --cached $flags] | ||||
| 	if {[llength $ids] > 1} { | ||||
| 	    # comparing index with specific revision | ||||
| 	    if {$i == 0} { | ||||
| 		lappend cmd -R [lindex $ids 1] | ||||
| 	    } else { | ||||
| 		lappend cmd [lindex $ids 0] | ||||
| 	    } | ||||
| 	} else { | ||||
| 	    # comparing index with HEAD | ||||
| 	    lappend cmd HEAD | ||||
| 	} | ||||
|     } else { | ||||
| 	set cmd [concat | git diff-tree --no-commit-id -r $flags $ids] | ||||
| 	set cmd [concat | git diff-tree -r $flags $ids] | ||||
|     } | ||||
|     return $cmd | ||||
| } | ||||
|  | @ -4834,7 +4947,7 @@ proc gettreediffs {ids} { | |||
|  | ||||
|     set treepending $ids | ||||
|     set treediff {} | ||||
|     if {[catch {set gdtf [open [diffcmd $ids {}] r]}]} return | ||||
|     if {[catch {set gdtf [open [diffcmd $ids {--no-commit-id}] r]}]} return | ||||
|     fconfigure $gdtf -blocking 0 | ||||
|     filerun $gdtf [list gettreediffline $gdtf $ids] | ||||
| } | ||||
|  | @ -4877,7 +4990,7 @@ proc getblobdiffs {ids} { | |||
|     global diffinhdr treediffs | ||||
|  | ||||
|     set env(GIT_DIFF_OPTS) $diffopts | ||||
|     if {[catch {set bdf [open [diffcmd $ids {-p -C}] r]} err]} { | ||||
|     if {[catch {set bdf [open [diffcmd $ids {-p -C --no-commit-id}] r]} err]} { | ||||
| 	puts "error getting diffs: $err" | ||||
| 	return | ||||
|     } | ||||
|  | @ -5468,7 +5581,7 @@ proc mstime {} { | |||
|  | ||||
| proc rowmenu {x y id} { | ||||
|     global rowctxmenu commitrow selectedline rowmenuid curview | ||||
|     global nullid fakerowmenu mainhead | ||||
|     global nullid nullid2 fakerowmenu mainhead | ||||
|  | ||||
|     set rowmenuid $id | ||||
|     if {![info exists selectedline] | ||||
|  | @ -5477,7 +5590,7 @@ proc rowmenu {x y id} { | |||
|     } else { | ||||
| 	set state normal | ||||
|     } | ||||
|     if {$id ne $nullid} { | ||||
|     if {$id ne $nullid && $id ne $nullid2} { | ||||
| 	set menu $rowctxmenu | ||||
| 	$menu entryconfigure 7 -label "Reset $mainhead branch to here" | ||||
|     } else { | ||||
|  | @ -5596,18 +5709,12 @@ proc mkpatchrev {} { | |||
| } | ||||
|  | ||||
| proc mkpatchgo {} { | ||||
|     global patchtop nullid | ||||
|     global patchtop nullid nullid2 | ||||
|  | ||||
|     set oldid [$patchtop.fromsha1 get] | ||||
|     set newid [$patchtop.tosha1 get] | ||||
|     set fname [$patchtop.fname get] | ||||
|     if {$newid eq $nullid} { | ||||
| 	set cmd [list git diff-index -p $oldid] | ||||
|     } elseif {$oldid eq $nullid} { | ||||
| 	set cmd [list git diff-index -p -R $newid] | ||||
|     } else { | ||||
| 	set cmd [list git diff-tree -p $oldid $newid] | ||||
|     } | ||||
|     set cmd [diffcmd [list $oldid $newid] -p] | ||||
|     lappend cmd >$fname & | ||||
|     if {[catch {eval exec $cmd} err]} { | ||||
| 	error_popup "Error creating patch: $err" | ||||
|  | @ -7522,6 +7629,8 @@ if {$i >= [llength $argv] && $revtreeargs ne {}} { | |||
| } | ||||
|  | ||||
| set nullid "0000000000000000000000000000000000000000" | ||||
| set nullid2 "0000000000000000000000000000000000000001" | ||||
|  | ||||
|  | ||||
| set runq {} | ||||
| set history {} | ||||
|  | @ -7550,10 +7659,13 @@ set stopped 0 | |||
| set stuffsaved 0 | ||||
| set patchnum 0 | ||||
| set lookingforhead 0 | ||||
| set localrow -1 | ||||
| set localirow -1 | ||||
| set localfrow -1 | ||||
| set lserial 0 | ||||
| setcoords | ||||
| makewindow | ||||
| # wait for the window to become visible | ||||
| tkwait visibility . | ||||
| wm title . "[file tail $argv0]: [file tail [pwd]]" | ||||
| readrefs | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano