git-gui: Allow forcing display encoding for diffs using a submenu.
authorAlexander Gavrilov <angavrilov@gmail.com>
Wed, 17 Sep 2008 21:07:34 +0000 (01:07 +0400)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 24 Sep 2008 19:48:32 +0000 (12:48 -0700)
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 <angavrilov@gmail.com>
Tested-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui.sh
lib/diff.tcl
lib/encoding.tcl

index b37148b7b234f4c0b97ee0b955908272d83128e5..03c450d73f06574381b2a2dc8e765237fbcfc03e 100755 (executable)
@@ -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
 }
index 8fefc5d9ae9cad3be93946b67f20bf82f09d0c89..b61629676f69a4bcb5c6a42af72e0c82a69cea73 100644 (file)
@@ -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
 
index 2c1eda33e0b56da3823b4e103fa6b0d821932400..b2ee38cc8aa11a453de19f4cfe0d07bf9940cd22 100644 (file)
@@ -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
                }