aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2008-01-23 00:37:10 -0500
committerShawn O. Pearce <spearce@spearce.org>2008-09-24 12:48:31 -0700
commit1ffca60f0b0395e1e593e64d66e7ed3c47d8517e (patch)
treef7f1c65e1908661cf12ea33ecd92e116e19fd090
parent2cd1fd1f6da5243226779acb17be9132d53ec4a9 (diff)
downloadgit-1ffca60f0b0395e1e593e64d66e7ed3c47d8517e.tar.gz
git-1ffca60f0b0395e1e593e64d66e7ed3c47d8517e.tar.xz
git-gui: Use gitattribute "encoding" for file content display
Most folks using git-gui on internationalized files have complained that it doesn't recognize UTF-8 correctly. In the past we have just ignored the problem and showed the file contents as binary/US-ASCII, which is wrong no matter how you look at it. This really should be a per-file attribute, managed by .gitattributes, so we now pull the "encoding" attribute data for the given path from the .gitattributes (if available) and use that, falling back to UTF-8 if the attributes are unavailable, git-check-attr is broken, or an encoding for this path not specified. We apply the encoding anytime we show file content, which currently is limited to only the diff viewer and the blame viewer. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--.gitattributes3
-rwxr-xr-xgit-gui.sh13
-rw-r--r--lib/blame.tcl5
-rw-r--r--lib/diff.tcl9
4 files changed, 26 insertions, 4 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..f96112d47
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+* encoding=US-ASCII
+git-gui.sh encoding=UTF-8
+/po/*.po encoding=UTF-8
diff --git a/git-gui.sh b/git-gui.sh
index cb0fcac99..4a762355d 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -521,6 +521,19 @@ proc kill_file_process {fd} {
}
}
+proc gitattr {path attr default} {
+ if {[catch {set r [git check-attr $attr -- $path]}]} {
+ set r unspecified
+ } else {
+ set r [join [lrange [split $r :] 2 end] :]
+ regsub {^ } $r {} r
+ }
+ if {$r eq {unspecified}} {
+ return $default
+ }
+ return $r
+}
+
proc sq {value} {
regsub -all ' $value "'\\''" value
return "'$value'"
diff --git a/lib/blame.tcl b/lib/blame.tcl
index 0d635cd3a..9464a599d 100644
--- a/lib/blame.tcl
+++ b/lib/blame.tcl
@@ -399,7 +399,10 @@ method _load {jump} {
} else {
set fd [git_read cat-file blob "$commit:$path"]
}
- fconfigure $fd -blocking 0 -translation lf -encoding binary
+ fconfigure $fd \
+ -blocking 0 \
+ -translation lf \
+ -encoding [tcl_encoding [gitattr $path encoding UTF-8]]
fileevent $fd readable [cb _read_file $fd $jump]
set current_fd $fd
}
diff --git a/lib/diff.tcl b/lib/diff.tcl
index a30c80a93..b0ecfbcb5 100644
--- a/lib/diff.tcl
+++ b/lib/diff.tcl
@@ -164,8 +164,11 @@ proc show_other_diff {path w m scroll_pos} {
set sz [string length $content]
}
file {
+ set enc [gitattr $path encoding UTF-8]
set fd [open $path r]
- fconfigure $fd -eofchar {}
+ fconfigure $fd \
+ -eofchar {} \
+ -encoding [tcl_encoding $enc]
set content [read $fd $max_sz]
close $fd
set sz [file size $path]
@@ -279,8 +282,8 @@ proc start_show_diff {scroll_pos {add_opts {}}} {
set ::current_diff_inheader 1
fconfigure $fd \
-blocking 0 \
- -encoding binary \
- -translation binary
+ -encoding [tcl_encoding [gitattr $path encoding UTF-8]] \
+ -translation lf
fileevent $fd readable [list read_diff $fd $scroll_pos]
}