gitk: Unicode file name support

Assumes file names in git tree objects are UTF-8 encoded. On most unix systems, the system encoding (and thus the TCL system encoding) will be UTF-8, so file names will be displayed correctly. On Windows, it is impossible to set the system encoding to UTF-8. Changing the TCL system encoding (via 'encoding system ...', e.g. in the startup code) is explicitly discouraged by the TCL docs. Change gitk functions dealing with file names to always convert from and to UTF-8. Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>

Karsten Blees committed Feb 4, 2012 at 21:54 UTC 5eb02dd8f08fc3b7ff22320c3311cd1da6a5ab4d
1 file changed +8 -7
gitk
+8 -7
@@ -7855,7 +7855,7 @@ proc gettreeline {gtf id} {
7855 if {[string index $fname 0] eq "\""} {
7856 set fname [lindex $fname 0]
7857 }
7858 - set fname [encoding convertfrom $fname]
7858 + set fname [encoding convertfrom utf-8 $fname]
7859 lappend treefilelist($id) $fname
7860 }
7861 if {![eof $gtf]} {
@@ -8117,7 +8117,7 @@ proc gettreediffline {gdtf ids} {
8117 if {[string index $file 0] eq "\""} {
8118 set file [lindex $file 0]
8119 }
8120 - set file [encoding convertfrom $file]
8120 + set file [encoding convertfrom utf-8 $file]
8121 if {$file ne [lindex $treediff end]} {
8122 lappend treediff $file
8123 lappend sublist $file
@@ -8262,7 +8262,7 @@ proc makediffhdr {fname ids} {
8262 global ctext curdiffstart treediffs diffencoding
8263 global ctext_file_names jump_to_here targetline diffline
8264
8265 - set fname [encoding convertfrom $fname]
8265 + set fname [encoding convertfrom utf-8 $fname]
8266 set diffencoding [get_path_encoding $fname]
8267 set i [lsearch -exact $treediffs($ids) $fname]
8268 if {$i >= 0} {
@@ -8324,7 +8324,7 @@ proc parseblobdiffline {ids line} {
8324
8325 if {![string compare -length 5 "diff " $line]} {
8326 if {![regexp {^diff (--cc|--git) } $line m type]} {
8327 - set line [encoding convertfrom $line]
8327 + set line [encoding convertfrom utf-8 $line]
8328 $ctext insert end "$line\n" hunksep
8329 continue
8330 }
@@ -8373,7 +8373,7 @@ proc parseblobdiffline {ids line} {
8373 makediffhdr $fname $ids
8374
8375 } elseif {![string compare -length 16 "* Unmerged path " $line]} {
8376 - set fname [encoding convertfrom [string range $line 16 end]]
8376 + set fname [encoding convertfrom utf-8 [string range $line 16 end]]
8377 $ctext insert end "\n"
8378 set curdiffstart [$ctext index "end - 1c"]
8379 lappend ctext_file_names $fname
@@ -8426,7 +8426,7 @@ proc parseblobdiffline {ids line} {
8426 if {[string index $fname 0] eq "\""} {
8427 set fname [lindex $fname 0]
8428 }
8429 - set fname [encoding convertfrom $fname]
8429 + set fname [encoding convertfrom utf-8 $fname]
8430 set i [lsearch -exact $treediffs($ids) $fname]
8431 if {$i >= 0} {
8432 setinlist difffilestart $i $curdiffstart
@@ -8445,6 +8445,7 @@ proc parseblobdiffline {ids line} {
8445 set diffinhdr 0
8446 return
8447 }
8448 + set line [encoding convertfrom utf-8 $line]
8449 $ctext insert end "$line\n" filesep
8450
8451 } else {
@@ -12440,7 +12441,7 @@ proc cache_gitattr {attr pathlist} {
12441 foreach row [split $rlist "\n"] {
12442 if {[regexp "(.*): $attr: (.*)" $row m path value]} {
12443 if {[string index $path 0] eq "\""} {
12443 - set path [encoding convertfrom [lindex $path 0]]
12444 + set path [encoding convertfrom utf-8 [lindex $path 0]]
12445 }
12446 set path_attr_cache($attr,$path) $value
12447 }