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 separately
This commit is contained in:
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
Block a user