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: Clément Poulain <clement.poulain@ensimag.imag.fr> Signed-off-by: Diane Gasselin <diane.gasselin@ensimag.imag.fr> Signed-off-by: Axel Bonnet <axel.bonnet@ensimag.imag.fr> Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
This commit is contained in:

committed by
Pat Thoyts

parent
85123549f0
commit
1fbaccad4d
28
git-gui.sh
28
git-gui.sh
@ -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} {
|
proc get_config {name} {
|
||||||
global repo_config
|
global repo_config
|
||||||
if {[catch {set v $repo_config($name)}]} {
|
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.encoding) [encoding system]
|
||||||
set default_config(gui.matchtrackingbranch) false
|
set default_config(gui.matchtrackingbranch) false
|
||||||
|
set default_config(gui.textconv) true
|
||||||
set default_config(gui.pruneduringfetch) false
|
set default_config(gui.pruneduringfetch) false
|
||||||
set default_config(gui.trustmtime) false
|
set default_config(gui.trustmtime) false
|
||||||
set default_config(gui.fastcopyblame) false
|
set default_config(gui.fastcopyblame) false
|
||||||
@ -3411,6 +3423,19 @@ lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
|
|||||||
$ctxmsm add separator
|
$ctxmsm add separator
|
||||||
create_common_diff_popup $ctxmsm
|
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} {
|
proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
|
||||||
global current_diff_path file_states
|
global current_diff_path file_states
|
||||||
set ::cursorX $x
|
set ::cursorX $x
|
||||||
@ -3446,7 +3471,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
|
|||||||
|| {__} eq $state
|
|| {__} eq $state
|
||||||
|| {_O} eq $state
|
|| {_O} eq $state
|
||||||
|| {_T} eq $state
|
|| {_T} eq $state
|
||||||
|| {T_} eq $state} {
|
|| {T_} eq $state
|
||||||
|
|| [has_textconv $current_diff_path]} {
|
||||||
set s disabled
|
set s disabled
|
||||||
} else {
|
} else {
|
||||||
set s normal
|
set s normal
|
||||||
|
@ -449,11 +449,28 @@ method _load {jump} {
|
|||||||
|
|
||||||
$status show [mc "Reading %s..." "$commit:[escape_path $path]"]
|
$status show [mc "Reading %s..." "$commit:[escape_path $path]"]
|
||||||
$w_path conf -text [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 {}} {
|
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 {}
|
fconfigure $fd -eofchar {}
|
||||||
} else {
|
} 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 \
|
fconfigure $fd \
|
||||||
-blocking 0 \
|
-blocking 0 \
|
||||||
|
@ -55,7 +55,7 @@ proc handle_empty_diff {} {
|
|||||||
|
|
||||||
set path $current_diff_path
|
set path $current_diff_path
|
||||||
set s $file_states($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
|
# Prevent infinite rescan loops
|
||||||
incr diff_empty_count
|
incr diff_empty_count
|
||||||
@ -280,6 +280,9 @@ proc start_show_diff {cont_info {add_opts {}}} {
|
|||||||
lappend cmd diff-files
|
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]]
|
if {[string match {160000 *} [lindex $s 2]]
|
||||||
|| [string match {160000 *} [lindex $s 3]]} {
|
|| [string match {160000 *} [lindex $s 3]]} {
|
||||||
|
@ -148,6 +148,7 @@ proc do_options {} {
|
|||||||
{b gui.trustmtime {mc "Trust File Modification Timestamps"}}
|
{b gui.trustmtime {mc "Trust File Modification Timestamps"}}
|
||||||
{b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
|
{b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
|
||||||
{b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
|
{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"}}
|
{b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
|
||||||
{i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
|
{i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
|
||||||
{i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}
|
{i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}
|
||||||
|
Reference in New Issue
Block a user