提交 1fbaccad 编写于 作者: C Clément Poulain 提交者: Pat Thoyts

git-gui: use textconv filter for diff and blame

Create a checkbox "Use Textconv For Diffs and Blame" in git-gui options.
If checked and if the driver for the concerned file exists, git-gui calls diff
and blame with --textconv option
Signed-off-by: NClément Poulain <clement.poulain@ensimag.imag.fr>
Signed-off-by: NDiane Gasselin <diane.gasselin@ensimag.imag.fr>
Signed-off-by: NAxel Bonnet <axel.bonnet@ensimag.imag.fr>
Signed-off-by: NMatthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: NPat Thoyts <patthoyts@users.sourceforge.net>
上级 85123549
......@@ -269,6 +269,17 @@ proc is_config_true {name} {
}
}
proc is_config_false {name} {
global repo_config
if {[catch {set v $repo_config($name)}]} {
return 0
} elseif {$v eq {false} || $v eq {0} || $v eq {no}} {
return 1
} else {
return 0
}
}
proc get_config {name} {
global repo_config
if {[catch {set v $repo_config($name)}]} {
......@@ -785,6 +796,7 @@ set default_config(user.email) {}
set default_config(gui.encoding) [encoding system]
set default_config(gui.matchtrackingbranch) false
set default_config(gui.textconv) true
set default_config(gui.pruneduringfetch) false
set default_config(gui.trustmtime) false
set default_config(gui.fastcopyblame) false
......@@ -3411,6 +3423,19 @@ lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
$ctxmsm add separator
create_common_diff_popup $ctxmsm
proc has_textconv {path} {
if {[is_config_false gui.textconv]} {
return 0
}
set filter [gitattr $path diff set]
set textconv [get_config [join [list diff $filter textconv] .]]
if {$filter ne {set} && $textconv ne {}} {
return 1
} else {
return 0
}
}
proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
global current_diff_path file_states
set ::cursorX $x
......@@ -3446,7 +3471,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
|| {__} eq $state
|| {_O} eq $state
|| {_T} eq $state
|| {T_} eq $state} {
|| {T_} eq $state
|| [has_textconv $current_diff_path]} {
set s disabled
} else {
set s normal
......
......@@ -449,11 +449,28 @@ method _load {jump} {
$status show [mc "Reading %s..." "$commit:[escape_path $path]"]
$w_path conf -text [escape_path $path]
set do_textconv 0
if {![is_config_false gui.textconv] && [git-version >= 1.7.2]} {
set filter [gitattr $path diff set]
set textconv [get_config [join [list diff $filter textconv] .]]
if {$filter ne {set} && $textconv ne {}} {
set do_textconv 1
}
}
if {$commit eq {}} {
set fd [open $path r]
if {$do_textconv ne 0} {
set fd [open |[list $textconv $path] r]
} else {
set fd [open $path r]
}
fconfigure $fd -eofchar {}
} else {
set fd [git_read cat-file blob "$commit:$path"]
if {$do_textconv ne 0} {
set fd [git_read cat-file --textconv "$commit:$path"]
} else {
set fd [git_read cat-file blob "$commit:$path"]
}
}
fconfigure $fd \
-blocking 0 \
......
......@@ -55,7 +55,7 @@ proc handle_empty_diff {} {
set path $current_diff_path
set s $file_states($path)
if {[lindex $s 0] ne {_M}} return
if {[lindex $s 0] ne {_M} || [has_textconv $path]} return
# Prevent infinite rescan loops
incr diff_empty_count
......@@ -280,6 +280,9 @@ proc start_show_diff {cont_info {add_opts {}}} {
lappend cmd diff-files
}
}
if {![is_config_false gui.textconv] && [git-version >= 1.6.1]} {
lappend cmd --textconv
}
if {[string match {160000 *} [lindex $s 2]]
|| [string match {160000 *} [lindex $s 3]]} {
......
......@@ -148,6 +148,7 @@ proc do_options {} {
{b gui.trustmtime {mc "Trust File Modification Timestamps"}}
{b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
{b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
{b gui.textconv {mc "Use Textconv For Diffs and Blames"}}
{b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
{i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
{i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册