From: Alexander Gavrilov Date: Wed, 17 Sep 2008 21:07:34 +0000 (+0400) Subject: git-gui: Allow forcing display encoding for diffs using a submenu. X-Git-Tag: v1.6.1-rc1~3^2~46 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=3fe0162362f80262ed1965f19c1f57f298931c94;p=git.git git-gui: Allow forcing display encoding for diffs using a submenu. Add a submenu to allow dynamically changing the encoding to use for diffs. Encoding settings are remembered while git-gui runs. The rules are: 1) Encoding set for a specific file overrides gitattributes. 2) Last explicitly set value of the encoding overrides gui.encoding Signed-off-by: Alexander Gavrilov Tested-by: Johannes Sixt Signed-off-by: Shawn O. Pearce --- diff --git a/git-gui.sh b/git-gui.sh index b37148b7b..03c450d73 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -3010,6 +3010,14 @@ proc create_common_diff_popup {ctxm} { -command {incr_font_size font_diff 1} lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] $ctxm add separator + set emenu $ctxm.enc + menu $emenu + build_encoding_menu $emenu [list force_diff_encoding] + $ctxm add cascade \ + -label [mc "Encoding"] \ + -menu $emenu + lappend diff_actions [list $ctxm entryconf [$ctxm index last] -state] + $ctxm add separator $ctxm add command -label [mc "Options..."] \ -command do_options } diff --git a/lib/diff.tcl b/lib/diff.tcl index 8fefc5d9a..b61629676 100644 --- a/lib/diff.tcl +++ b/lib/diff.tcl @@ -40,6 +40,15 @@ proc reshow_diff {} { } } +proc force_diff_encoding {enc} { + global current_diff_path + + if {$current_diff_path ne {}} { + force_path_encoding $current_diff_path $enc + reshow_diff + } +} + proc handle_empty_diff {} { global current_diff_path file_states file_lists diff --git a/lib/encoding.tcl b/lib/encoding.tcl index 2c1eda33e..b2ee38cc8 100644 --- a/lib/encoding.tcl +++ b/lib/encoding.tcl @@ -321,13 +321,38 @@ proc tcl_encoding {enc} { return {} } +proc force_path_encoding {path enc} { + global path_encoding_overrides last_encoding_override + + set enc [tcl_encoding $enc] + if {$enc eq {}} { + catch { unset last_encoding_override } + catch { unset path_encoding_overrides($path) } + } else { + set last_encoding_override $enc + if {$path ne {}} { + set path_encoding_overrides($path) $enc + } + } +} + proc get_path_encoding {path} { - set tcl_enc [tcl_encoding [get_config gui.encoding]] + global path_encoding_overrides last_encoding_override + + if {[info exists last_encoding_override]} { + set tcl_enc $last_encoding_override + } else { + set tcl_enc [tcl_encoding [get_config gui.encoding]] + } if {$tcl_enc eq {}} { set tcl_enc [encoding system] } if {$path ne {}} { - set enc2 [tcl_encoding [gitattr $path encoding $tcl_enc]] + if {[info exists path_encoding_overrides($path)]} { + set enc2 $path_encoding_overrides($path) + } else { + set enc2 [tcl_encoding [gitattr $path encoding $tcl_enc]] + } if {$enc2 ne {}} { set tcl_enc $enc2 }