git-gui: use -profile tcl8 on encoding conversions

git-gui in the prior commit learned to apply -profile tcl8 when reading files, avoiding errors on non-binary data streams whose encoding is not utf-8. But, git-gui also consumes binary data streams (generally blobs from commits) as the output of commands, and internally decodes this to support various displays. With Tcl9, errors occur in this decoding for the same reasons described in the previous commit: basically, the underlying data may contain extended ascii characters violating the assumption of utf-8 encoding. This problem has a similar fix to the prior issue: we must use the tlc8 profile when converting this data to the internal unicode format. Do so, again only on Tcl9 as Tcl8.6 does not recognize -profile, and only Tcl 9.0 makes strict the default. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>

Mark Levedahl committed May 31, 2025 at 15:18 UTC cc41d374fa9e130cf9b89da5cbcf7694257b7df1
3 files changed +14 -7
git-gui.sh
+10 -3
@@ -84,6 +84,13 @@ if {[package vcompare $::tcl_version 9.0] >= 0} {
84 chan configure $f -profile tcl8
85 return $f
86 }
87 + proc convertfrom args {
88 + return [encoding convertfrom -profile tcl8 {*}$args]
89 + }
90 +} else {
91 + proc convertfrom args {
92 + return [encoding convertfrom {*}$args]
93 + }
94 }
95
96 ######################################################################
@@ -1543,7 +1550,7 @@ proc read_diff_index {fd after} {
1550 set i [split [string range $buf_rdi $c [expr {$z1 - 2}]] { }]
1551 set p [string range $buf_rdi $z1 [expr {$z2 - 1}]]
1552 merge_state \
1546 - [encoding convertfrom utf-8 $p] \
1553 + [convertfrom utf-8 $p] \
1554 [lindex $i 4]? \
1555 [list [lindex $i 0] [lindex $i 2]] \
1556 [list]
@@ -1576,7 +1583,7 @@ proc read_diff_files {fd after} {
1583 set i [split [string range $buf_rdf $c [expr {$z1 - 2}]] { }]
1584 set p [string range $buf_rdf $z1 [expr {$z2 - 1}]]
1585 merge_state \
1579 - [encoding convertfrom utf-8 $p] \
1586 + [convertfrom utf-8 $p] \
1587 ?[lindex $i 4] \
1588 [list] \
1589 [list [lindex $i 0] [lindex $i 2]]
@@ -1599,7 +1606,7 @@ proc read_ls_others {fd after} {
1606 set pck [split $buf_rlo "\0"]
1607 set buf_rlo [lindex $pck end]
1608 foreach p [lrange $pck 0 end-1] {
1602 - set p [encoding convertfrom utf-8 $p]
1609 + set p [convertfrom utf-8 $p]
1610 if {[string index $p end] eq {/}} {
1611 set p [string range $p 0 end-1]
1612 }
lib/blame.tcl
+1 -1
@@ -997,7 +997,7 @@ method _showcommit {cur_w lno} {
997
998 set enc [tcl_encoding $enc]
999 if {$enc ne {}} {
1000 - set msg [encoding convertfrom $enc $msg]
1000 + set msg [convertfrom $enc $msg]
1001 }
1002 set msg [string trim $msg]
1003 }
lib/commit.tcl
+3 -3
@@ -43,9 +43,9 @@ You are currently in the middle of a merge that has not been fully completed. Y
43
44 set enc [tcl_encoding $enc]
45 if {$enc ne {}} {
46 - set msg [encoding convertfrom $enc $msg]
47 - set name [encoding convertfrom $enc $name]
48 - set email [encoding convertfrom $enc $email]
46 + set msg [convertfrom $enc $msg]
47 + set name [convertfrom $enc $name]
48 + set email [convertfrom $enc $email]
49 }
50 if {$name ne {} && $email ne {}} {
51 set commit_author [list name $name email $email date $time]