gitk: Add the equivalent of diff --color-words
Use the newly added 'diff --word-diff=porcelain' to teach gitk a color-words mode, with two different modes analogous to the --word-diff=plain and --word-diff=color settings. These are selected by a dropdown box. As an extra twist, automatically enable this word-diff support when the user mentions a word-diff related option on the command line. These options were previously ignored because they would break diff parsing. Both of these features are only enabled if we have a version of git that supports --word-diff=porcelain, meaning at least 1.7.2. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:

committed by
Paul Mackerras

parent
1cca16eca9
commit
ae4e3ff93d
64
gitk
64
gitk
@ -131,6 +131,7 @@ proc unmerged_files {files} {
|
||||
|
||||
proc parseviewargs {n arglist} {
|
||||
global vdatemode vmergeonly vflags vdflags vrevs vfiltered vorigargs env
|
||||
global worddiff git_version
|
||||
|
||||
set vdatemode($n) 0
|
||||
set vmergeonly($n) 0
|
||||
@ -168,7 +169,7 @@ proc parseviewargs {n arglist} {
|
||||
lappend diffargs $arg
|
||||
}
|
||||
"--raw" - "--patch-with-raw" - "--patch-with-stat" -
|
||||
"--name-only" - "--name-status" - "--color" - "--color-words" -
|
||||
"--name-only" - "--name-status" - "--color" -
|
||||
"--log-size" - "--pretty=*" - "--decorate" - "--abbrev-commit" -
|
||||
"--cc" - "-z" - "--header" - "--parents" - "--boundary" -
|
||||
"--no-color" - "-g" - "--walk-reflogs" - "--no-walk" -
|
||||
@ -177,6 +178,18 @@ proc parseviewargs {n arglist} {
|
||||
# These cause our parsing of git log's output to fail, or else
|
||||
# they're options we want to set ourselves, so ignore them.
|
||||
}
|
||||
"--color-words*" - "--word-diff=color" {
|
||||
# These trigger a word diff in the console interface,
|
||||
# so help the user by enabling our own support
|
||||
if {[package vcompare $git_version "1.7.2"] >= 0} {
|
||||
set worddiff [mc "Color words"]
|
||||
}
|
||||
}
|
||||
"--word-diff*" {
|
||||
if {[package vcompare $git_version "1.7.2"] >= 0} {
|
||||
set worddiff [mc "Markup words"]
|
||||
}
|
||||
}
|
||||
"--stat=*" - "--numstat" - "--shortstat" - "--summary" -
|
||||
"--check" - "--exit-code" - "--quiet" - "--topo-order" -
|
||||
"--full-history" - "--dense" - "--sparse" -
|
||||
@ -1972,6 +1985,8 @@ proc makewindow {} {
|
||||
global fprogitem fprogcoord lastprogupdate progupdatepending
|
||||
global rprogitem rprogcoord rownumsel numcommits
|
||||
global have_tk85 use_ttk NS
|
||||
global git_version
|
||||
global worddiff
|
||||
|
||||
# The "mc" arguments here are purely so that xgettext
|
||||
# sees the following string as needing to be translated
|
||||
@ -2245,6 +2260,15 @@ proc makewindow {} {
|
||||
${NS}::checkbutton .bleft.mid.ignspace -text [mc "Ignore space change"] \
|
||||
-command changeignorespace -variable ignorespace
|
||||
pack .bleft.mid.ignspace -side left -padx 5
|
||||
|
||||
set worddiff [mc "Line diff"]
|
||||
if {[package vcompare $git_version "1.7.2"] >= 0} {
|
||||
makedroplist .bleft.mid.worddiff worddiff [mc "Line diff"] \
|
||||
[mc "Markup words"] [mc "Color words"]
|
||||
trace add variable worddiff write changeworddiff
|
||||
pack .bleft.mid.worddiff -side left -padx 5
|
||||
}
|
||||
|
||||
set ctext .bleft.bottom.ctext
|
||||
text $ctext -background $bgcolor -foreground $fgcolor \
|
||||
-state disabled -font textfont \
|
||||
@ -7504,11 +7528,16 @@ proc changeignorespace {} {
|
||||
reselectline
|
||||
}
|
||||
|
||||
proc changeworddiff {name ix op} {
|
||||
reselectline
|
||||
}
|
||||
|
||||
proc getblobdiffs {ids} {
|
||||
global blobdifffd diffids env
|
||||
global diffinhdr treediffs
|
||||
global diffcontext
|
||||
global ignorespace
|
||||
global worddiff
|
||||
global limitdiffs vfilelimit curview
|
||||
global diffencoding targetline diffnparents
|
||||
global git_version currdiffsubmod
|
||||
@ -7525,6 +7554,9 @@ proc getblobdiffs {ids} {
|
||||
if {$ignorespace} {
|
||||
append cmd " -w"
|
||||
}
|
||||
if {$worddiff ne [mc "Line diff"]} {
|
||||
append cmd " --word-diff=porcelain"
|
||||
}
|
||||
if {$limitdiffs && $vfilelimit($curview) ne {}} {
|
||||
set cmd [concat $cmd -- $vfilelimit($curview)]
|
||||
}
|
||||
@ -7610,6 +7642,7 @@ proc getblobdiffline {bdf ids} {
|
||||
global ctext_file_names ctext_file_lines
|
||||
global diffinhdr treediffs mergemax diffnparents
|
||||
global diffencoding jump_to_here targetline diffline currdiffsubmod
|
||||
global worddiff
|
||||
|
||||
set nr 0
|
||||
$ctext conf -state normal
|
||||
@ -7749,15 +7782,28 @@ proc getblobdiffline {bdf ids} {
|
||||
# parse the prefix - one ' ', '-' or '+' for each parent
|
||||
set prefix [string range $line 0 [expr {$diffnparents - 1}]]
|
||||
set tag [expr {$diffnparents > 1? "m": "d"}]
|
||||
set dowords [expr {$worddiff ne [mc "Line diff"] && $diffnparents == 1}]
|
||||
set words_pre_markup ""
|
||||
set words_post_markup ""
|
||||
if {[string trim $prefix " -+"] eq {}} {
|
||||
# prefix only has " ", "-" and "+" in it: normal diff line
|
||||
set num [string first "-" $prefix]
|
||||
if {$dowords} {
|
||||
set line [string range $line 1 end]
|
||||
}
|
||||
if {$num >= 0} {
|
||||
# removed line, first parent with line is $num
|
||||
if {$num >= $mergemax} {
|
||||
set num "max"
|
||||
}
|
||||
$ctext insert end "$line\n" $tag$num
|
||||
if {$dowords && $worddiff eq [mc "Markup words"]} {
|
||||
$ctext insert end "\[-$line-\]" $tag$num
|
||||
} else {
|
||||
$ctext insert end "$line" $tag$num
|
||||
}
|
||||
if {!$dowords} {
|
||||
$ctext insert end "\n" $tag$num
|
||||
}
|
||||
} else {
|
||||
set tags {}
|
||||
if {[string first "+" $prefix] >= 0} {
|
||||
@ -7772,6 +7818,8 @@ proc getblobdiffline {bdf ids} {
|
||||
lappend tags m$num
|
||||
}
|
||||
}
|
||||
set words_pre_markup "{+"
|
||||
set words_post_markup "+}"
|
||||
}
|
||||
if {$targetline ne {}} {
|
||||
if {$diffline == $targetline} {
|
||||
@ -7781,8 +7829,17 @@ proc getblobdiffline {bdf ids} {
|
||||
incr diffline
|
||||
}
|
||||
}
|
||||
$ctext insert end "$line\n" $tags
|
||||
if {$dowords && $worddiff eq [mc "Markup words"]} {
|
||||
$ctext insert end "$words_pre_markup$line$words_post_markup" $tags
|
||||
} else {
|
||||
$ctext insert end "$line" $tags
|
||||
}
|
||||
if {!$dowords} {
|
||||
$ctext insert end "\n" $tags
|
||||
}
|
||||
}
|
||||
} elseif {$dowords && $prefix eq "~"} {
|
||||
$ctext insert end "\n" {}
|
||||
} else {
|
||||
# "\ No newline at end of file",
|
||||
# or something else we don't recognize
|
||||
@ -11393,6 +11450,7 @@ if {[tk windowingsystem] eq "win32"} {
|
||||
set diffcolors {red "#00a000" blue}
|
||||
set diffcontext 3
|
||||
set ignorespace 0
|
||||
set worddiff ""
|
||||
set markbgcolor "#e0e0ff"
|
||||
|
||||
set circlecolors {white blue gray blue blue}
|
||||
|
Reference in New Issue
Block a user