Browse Source

Merge branch 'dev'

maint
Paul Mackerras 16 years ago
parent
commit
dbc4941fac
  1. 354
      gitk

354
gitk

@ -2103,7 +2103,7 @@ proc makewindow {} { @@ -2103,7 +2103,7 @@ proc makewindow {} {
$ctext tag conf filesep -font textfontbold -back "#aaaaaa"
$ctext tag conf hunksep -fore [lindex $diffcolors 2]
$ctext tag conf d0 -fore [lindex $diffcolors 0]
$ctext tag conf d1 -fore [lindex $diffcolors 1]
$ctext tag conf dresult -fore [lindex $diffcolors 1]
$ctext tag conf m0 -fore red
$ctext tag conf m1 -fore blue
$ctext tag conf m2 -fore green
@ -3225,7 +3225,7 @@ proc find_hunk_blamespec {base line} { @@ -3225,7 +3225,7 @@ proc find_hunk_blamespec {base line} {
}

proc external_blame_diff {} {
global currentid diffmergeid cmitmode
global currentid cmitmode
global diff_menu_txtpos diff_menu_line
global diff_menu_filebase flist_menu_file

@ -3246,6 +3246,22 @@ proc external_blame_diff {} { @@ -3246,6 +3246,22 @@ proc external_blame_diff {} {
external_blame $parent_idx $line
}

# Find the SHA1 ID of the blob for file $fname in the index
# at stage 0 or 2
proc index_sha1 {fname} {
set f [open [list | git ls-files -s $fname] r]
while {[gets $f line] >= 0} {
set info [lindex [split $line "\t"] 0]
set stage [lindex $info 2]
if {$stage eq "0" || $stage eq "2"} {
close $f
return [lindex $info 1]
}
}
close $f
return {}
}

proc external_blame {parent_idx {line {}}} {
global flist_menu_file
global nullid nullid2
@ -3275,7 +3291,9 @@ proc external_blame {parent_idx {line {}}} { @@ -3275,7 +3291,9 @@ proc external_blame {parent_idx {line {}}} {
proc show_line_source {} {
global cmitmode currentid parents curview blamestuff blameinst
global diff_menu_line diff_menu_filebase flist_menu_file
global nullid nullid2 gitdir

set from_index {}
if {$cmitmode eq "tree"} {
set id $currentid
set line [expr {$diff_menu_line - $diff_menu_filebase}]
@ -3287,11 +3305,46 @@ proc show_line_source {} { @@ -3287,11 +3305,46 @@ proc show_line_source {} {
mark_ctext_line $diff_menu_line
return
}
set id [lindex $parents($curview,$currentid) [expr {$pi - 1}]]
incr pi -1
if {$currentid eq $nullid} {
if {$pi > 0} {
# must be a merge in progress...
if {[catch {
# get the last line from .git/MERGE_HEAD
set f [open [file join $gitdir MERGE_HEAD] r]
set id [lindex [split [read $f] "\n"] end-1]
close $f
} err]} {
error_popup [mc "Couldn't read merge head: %s" $err]
return
}
} elseif {$parents($curview,$currentid) eq $nullid2} {
# need to do the blame from the index
if {[catch {
set from_index [index_sha1 $flist_menu_file]
} err]} {
error_popup [mc "Error reading index: %s" $err]
return
}
}
} else {
set id [lindex $parents($curview,$currentid) $pi]
}
set line [lindex $h 1]
}
set blameargs {}
if {$from_index ne {}} {
lappend blameargs | git cat-file blob $from_index
}
lappend blameargs | git blame -p -L$line,+1
if {$from_index ne {}} {
lappend blameargs --contents -
} else {
lappend blameargs $id
}
lappend blameargs -- $flist_menu_file
if {[catch {
set f [open [list | git blame -p -L$line,+1 $id -- $flist_menu_file] r]
set f [open $blameargs r]
} err]} {
error_popup [mc "Couldn't start git blame: %s" $err]
return
@ -3313,7 +3366,7 @@ proc stopblaming {} { @@ -3313,7 +3366,7 @@ proc stopblaming {} {
}

proc read_line_source {fd inst} {
global blamestuff curview commfd blameinst
global blamestuff curview commfd blameinst nullid nullid2

while {[gets $fd line] >= 0} {
lappend blamestuff($inst) $line
@ -3345,6 +3398,11 @@ proc read_line_source {fd inst} { @@ -3345,6 +3398,11 @@ proc read_line_source {fd inst} {
}
if {$fname ne {}} {
# all looks good, select it
if {$id eq $nullid} {
# blame uses all-zeroes to mean not committed,
# which would mean a change in the index
set id $nullid2
}
if {[commitinview $id $curview]} {
selectline [rowofcommit $id] 1 [list $fname $lnum]
} else {
@ -6795,130 +6853,16 @@ proc mark_ctext_line {lnum} { @@ -6795,130 +6853,16 @@ proc mark_ctext_line {lnum} {
}

proc mergediff {id} {
global diffmergeid mdifffd
global diffmergeid
global diffids treediffs
global parents
global diffcontext
global diffencoding
global limitdiffs vfilelimit curview
global targetline
global parents curview

set diffmergeid $id
set diffids $id
set treediffs($id) {}
set targetline {}
# this doesn't seem to actually affect anything...
set cmd [concat | git diff-tree --no-commit-id --cc -U$diffcontext $id]
if {$limitdiffs && $vfilelimit($curview) ne {}} {
set cmd [concat $cmd -- $vfilelimit($curview)]
}
if {[catch {set mdf [open $cmd r]} err]} {
error_popup "[mc "Error getting merge diffs:"] $err"
return
}
fconfigure $mdf -blocking 0 -encoding binary
set mdifffd($id) $mdf
set np [llength $parents($curview,$id)]
set diffencoding [get_path_encoding {}]
settabs $np
filerun $mdf [list getmergediffline $mdf $id $np]
}

proc getmergediffline {mdf id np} {
global diffmergeid ctext cflist mergemax
global difffilestart mdifffd treediffs
global ctext_file_names ctext_file_lines
global diffencoding jump_to_here targetline diffline

$ctext conf -state normal
set nr 0
while {[incr nr] <= 1000 && [gets $mdf line] >= 0} {
if {![info exists diffmergeid] || $id != $diffmergeid
|| $mdf != $mdifffd($id)} {
close $mdf
return 0
}
if {[regexp {^diff --cc (.*)} $line match fname]} {
# start of a new file
set fname [encoding convertfrom $fname]
$ctext insert end "\n"
set here [$ctext index "end - 1c"]
lappend difffilestart $here
lappend treediffs($id) $fname
add_flist [list $fname]
lappend ctext_file_names $fname
lappend ctext_file_lines [lindex [split $here "."] 0]
set diffencoding [get_path_encoding $fname]
set l [expr {(78 - [string length $fname]) / 2}]
set pad [string range "----------------------------------------" 1 $l]
$ctext insert end "$pad $fname $pad\n" filesep
set targetline {}
if {$jump_to_here ne {} && [lindex $jump_to_here 0] eq $fname} {
set targetline [lindex $jump_to_here 1]
}
set diffline 0
} elseif {[regexp {^@@} $line]} {
set line [encoding convertfrom $diffencoding $line]
$ctext insert end "$line\n" hunksep
if {[regexp { \+(\d+),\d+ @@} $line m nl]} {
set diffline $nl
}
} elseif {[regexp {^[0-9a-f]{40}$} $line] || [regexp {^index} $line]} {
# do nothing
} else {
set line [encoding convertfrom $diffencoding $line]
# parse the prefix - one ' ', '-' or '+' for each parent
set spaces {}
set minuses {}
set pluses {}
set isbad 0
for {set j 0} {$j < $np} {incr j} {
set c [string range $line $j $j]
if {$c == " "} {
lappend spaces $j
} elseif {$c == "-"} {
lappend minuses $j
} elseif {$c == "+"} {
lappend pluses $j
} else {
set isbad 1
break
}
}
set tags {}
set num {}
if {!$isbad && $minuses ne {} && $pluses eq {}} {
# line doesn't appear in result, parents in $minuses have the line
set num [lindex $minuses 0]
} elseif {!$isbad && $pluses ne {} && $minuses eq {}} {
# line appears in result, parents in $pluses don't have the line
lappend tags mresult
set num [lindex $spaces 0]
}
if {$num ne {}} {
if {$num >= $mergemax} {
set num "max"
}
lappend tags m$num
}
$ctext insert end "$line\n" $tags
if {$targetline ne {} && $minuses eq {}} {
if {$diffline == $targetline} {
set here [$ctext index "end - 1 line"]
mark_ctext_line [lindex [split $here .] 0]
set targetline {}
} else {
incr diffline
}
}
}
}
$ctext conf -state disabled
if {[eof $mdf]} {
close $mdf
return 0
}
return [expr {$nr >= 1000? 2: 1}]
getblobdiffs $id
}

proc startdiff {ids} {
@ -7037,8 +6981,10 @@ proc gettreediffline {gdtf ids} { @@ -7037,8 +6981,10 @@ proc gettreediffline {gdtf ids} {
set file [lindex $file 0]
}
set file [encoding convertfrom $file]
lappend treediff $file
lappend sublist $file
if {$file ne [lindex $treediff end]} {
lappend treediff $file
lappend sublist $file
}
}
}
if {$perfile_attrs} {
@ -7098,9 +7044,9 @@ proc getblobdiffs {ids} { @@ -7098,9 +7044,9 @@ proc getblobdiffs {ids} {
global diffcontext
global ignorespace
global limitdiffs vfilelimit curview
global diffencoding targetline
global diffencoding targetline diffnparents

set cmd [diffcmd $ids "-p -C --no-commit-id -U$diffcontext"]
set cmd [diffcmd $ids "-p -C --cc --no-commit-id -U$diffcontext"]
if {$ignorespace} {
append cmd " -w"
}
@ -7108,10 +7054,11 @@ proc getblobdiffs {ids} { @@ -7108,10 +7054,11 @@ proc getblobdiffs {ids} {
set cmd [concat $cmd -- $vfilelimit($curview)]
}
if {[catch {set bdf [open $cmd r]} err]} {
puts "error getting diffs: $err"
error_popup [mc "Error getting diffs: %s" $err]
return
}
set targetline {}
set diffnparents 0
set diffinhdr 0
set diffencoding [get_path_encoding {}]
fconfigure $bdf -blocking 0 -encoding binary
@ -7133,14 +7080,16 @@ proc setinlist {var i val} { @@ -7133,14 +7080,16 @@ proc setinlist {var i val} {
}

proc makediffhdr {fname ids} {
global ctext curdiffstart treediffs
global ctext curdiffstart treediffs diffencoding
global ctext_file_names jump_to_here targetline diffline

set fname [encoding convertfrom $fname]
set diffencoding [get_path_encoding $fname]
set i [lsearch -exact $treediffs($ids) $fname]
if {$i >= 0} {
setinlist difffilestart $i $curdiffstart
}
set ctext_file_names [lreplace $ctext_file_names end end $fname]
lset ctext_file_names end $fname
set l [expr {(78 - [string length $fname]) / 2}]
set pad [string range "----------------------------------------" 1 $l]
$ctext insert $curdiffstart "$pad $fname $pad" filesep
@ -7155,7 +7104,7 @@ proc getblobdiffline {bdf ids} { @@ -7155,7 +7104,7 @@ proc getblobdiffline {bdf ids} {
global diffids blobdifffd ctext curdiffstart
global diffnexthead diffnextnote difffilestart
global ctext_file_names ctext_file_lines
global diffinhdr treediffs
global diffinhdr treediffs mergemax diffnparents
global diffencoding jump_to_here targetline diffline

set nr 0
@ -7165,47 +7114,75 @@ proc getblobdiffline {bdf ids} { @@ -7165,47 +7114,75 @@ proc getblobdiffline {bdf ids} {
close $bdf
return 0
}
if {![string compare -length 11 "diff --git " $line]} {
# trim off "diff --git "
set line [string range $line 11 end]
set diffinhdr 1
if {![string compare -length 5 "diff " $line]} {
if {![regexp {^diff (--cc|--git) } $line m type]} {
set line [encoding convertfrom $line]
$ctext insert end "$line\n" hunksep
continue
}
# start of a new file
set diffinhdr 1
$ctext insert end "\n"
set curdiffstart [$ctext index "end - 1c"]
lappend ctext_file_names ""
lappend ctext_file_lines [lindex [split $curdiffstart "."] 0]
$ctext insert end "\n" filesep
# If the name hasn't changed the length will be odd,
# the middle char will be a space, and the two bits either
# side will be a/name and b/name, or "a/name" and "b/name".
# If the name has changed we'll get "rename from" and
# "rename to" or "copy from" and "copy to" lines following this,
# and we'll use them to get the filenames.
# This complexity is necessary because spaces in the filename(s)
# don't get escaped.
set l [string length $line]
set i [expr {$l / 2}]
if {!(($l & 1) && [string index $line $i] eq " " &&
[string range $line 2 [expr {$i - 1}]] eq \
[string range $line [expr {$i + 3}] end])} {
continue
}
# unescape if quoted and chop off the a/ from the front
if {[string index $line 0] eq "\""} {
set fname [string range [lindex $line 0] 2 end]

if {$type eq "--cc"} {
# start of a new file in a merge diff
set fname [string range $line 10 end]
if {[lsearch -exact $treediffs($ids) $fname] < 0} {
lappend treediffs($ids) $fname
add_flist [list $fname]
}

} else {
set fname [string range $line 2 [expr {$i - 1}]]
set line [string range $line 11 end]
# If the name hasn't changed the length will be odd,
# the middle char will be a space, and the two bits either
# side will be a/name and b/name, or "a/name" and "b/name".
# If the name has changed we'll get "rename from" and
# "rename to" or "copy from" and "copy to" lines following
# this, and we'll use them to get the filenames.
# This complexity is necessary because spaces in the
# filename(s) don't get escaped.
set l [string length $line]
set i [expr {$l / 2}]
if {!(($l & 1) && [string index $line $i] eq " " &&
[string range $line 2 [expr {$i - 1}]] eq \
[string range $line [expr {$i + 3}] end])} {
continue
}
# unescape if quoted and chop off the a/ from the front
if {[string index $line 0] eq "\""} {
set fname [string range [lindex $line 0] 2 end]
} else {
set fname [string range $line 2 [expr {$i - 1}]]
}
}
set fname [encoding convertfrom $fname]
set diffencoding [get_path_encoding $fname]
makediffhdr $fname $ids

} elseif {[regexp {^@@ -([0-9]+)(,[0-9]+)? \+([0-9]+)(,[0-9]+)? @@(.*)} \
$line match f1l f1c f2l f2c rest]} {
} elseif {![string compare -length 16 "* Unmerged path " $line]} {
set fname [encoding convertfrom [string range $line 16 end]]
$ctext insert end "\n"
set curdiffstart [$ctext index "end - 1c"]
lappend ctext_file_names $fname
lappend ctext_file_lines [lindex [split $curdiffstart "."] 0]
$ctext insert end "$line\n" filesep
set i [lsearch -exact $treediffs($ids) $fname]
if {$i >= 0} {
setinlist difffilestart $i $curdiffstart
}

} elseif {![string compare -length 2 "@@" $line]} {
regexp {^@@+} $line ats
set line [encoding convertfrom $diffencoding $line]
$ctext insert end "$line\n" hunksep
if {[regexp { \+(\d+),\d+ @@} $line m nl]} {
set diffline $nl
}
set diffnparents [expr {[string length $ats] - 1}]
set diffinhdr 0
set diffline $f2l

} elseif {$diffinhdr} {
if {![string compare -length 12 "rename from " $line]} {
@ -7224,8 +7201,6 @@ proc getblobdiffline {bdf ids} { @@ -7224,8 +7201,6 @@ proc getblobdiffline {bdf ids} {
if {[string index $fname 0] eq "\""} {
set fname [lindex $fname 0]
}
set fname [encoding convertfrom $fname]
set diffencoding [get_path_encoding $fname]
makediffhdr $fname $ids
} elseif {[string compare -length 3 $line "---"] == 0} {
# do nothing
@ -7238,28 +7213,53 @@ proc getblobdiffline {bdf ids} { @@ -7238,28 +7213,53 @@ proc getblobdiffline {bdf ids} {

} else {
set line [encoding convertfrom $diffencoding $line]
set x [string range $line 0 0]
set here [$ctext index "end - 1 chars"]
if {$x == "-" || $x == "+"} {
set tag [expr {$x == "+"}]
$ctext insert end "$line\n" d$tag
} elseif {$x == " "} {
$ctext insert end "$line\n"
# parse the prefix - one ' ', '-' or '+' for each parent
set prefix [string range $line 0 [expr {$diffnparents - 1}]]
set tag [expr {$diffnparents > 1? "m": "d"}]
if {[string trim $prefix " -+"] eq {}} {
# prefix only has " ", "-" and "+" in it: normal diff line
set num [string first "-" $prefix]
if {$num >= 0} {
# removed line, first parent with line is $num
if {$num >= $mergemax} {
set num "max"
}
$ctext insert end "$line\n" $tag$num
} else {
set tags {}
if {[string first "+" $prefix] >= 0} {
# added line
lappend tags ${tag}result
if {$diffnparents > 1} {
set num [string first " " $prefix]
if {$num >= 0} {
if {$num >= $mergemax} {
set num "max"
}
lappend tags m$num
}
}
}
if {$targetline ne {}} {
if {$diffline == $targetline} {
set seehere [$ctext index "end - 1 chars"]
set targetline {}
} else {
incr diffline
}
}
$ctext insert end "$line\n" $tags
}
} else {
# "\ No newline at end of file",
# or something else we don't recognize
$ctext insert end "$line\n" hunksep
}
if {$targetline ne {} && ($x eq " " || $x eq "+")} {
if {$diffline == $targetline} {
mark_ctext_line [lindex [split $here .] 0]
set targetline {}
} else {
incr diffline
}
}
}
}
if {[info exists seehere]} {
mark_ctext_line [lindex [split $seehere .] 0]
}
$ctext conf -state disabled
if {[eof $bdf]} {
close $bdf
@ -7272,7 +7272,7 @@ proc changediffdisp {} { @@ -7272,7 +7272,7 @@ proc changediffdisp {} {
global ctext diffelide

$ctext tag conf d0 -elide [lindex $diffelide 0]
$ctext tag conf d1 -elide [lindex $diffelide 1]
$ctext tag conf dresult -elide [lindex $diffelide 1]
}

proc highlightfile {loc cline} {
@ -10010,7 +10010,7 @@ proc doprefs {} { @@ -10010,7 +10010,7 @@ proc doprefs {} {
label $top.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1]
button $top.diffnewbut -text [mc "Diff: new lines"] -font optionfont \
-command [list choosecolor diffcolors 1 $top.diffnew "diff new lines" \
[list $ctext tag conf d1 -foreground]]
[list $ctext tag conf dresult -foreground]]
grid x $top.diffnewbut $top.diffnew -sticky w
label $top.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2]
button $top.hunksepbut -text [mc "Diff: hunk header"] -font optionfont \

Loading…
Cancel
Save