summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2cd1fd1)
raw | patch | inline | side by side (parent: 2cd1fd1)
author | Shawn O. Pearce <spearce@spearce.org> | |
Wed, 23 Jan 2008 05:37:10 +0000 (00:37 -0500) | ||
committer | Shawn O. Pearce <spearce@spearce.org> | |
Wed, 24 Sep 2008 19:48:31 +0000 (12:48 -0700) |
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>
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>
.gitattributes | [new file with mode: 0644] | patch | blob |
git-gui.sh | patch | blob | history | |
lib/blame.tcl | patch | blob | history | |
lib/diff.tcl | patch | blob | history |
diff --git a/.gitattributes b/.gitattributes
--- /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 cb0fcac99fa25348bb2ea195c08e5e339ea8e050..4a762355d64f41e89af3aa1ceab713ba16eae380 100755 (executable)
--- a/git-gui.sh
+++ b/git-gui.sh
}
}
+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 0d635cd3a7152402e2363d8f9fb041bdd4835f14..9464a599dca8b0bcf16a9f6e10bc6f43a6bb5270 100644 (file)
--- a/lib/blame.tcl
+++ b/lib/blame.tcl
} 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 a30c80a935b58ce0c783dfffde196a85eadca9a2..b0ecfbcb5931ee160dbf24dee49940102029e8f5 100644 (file)
--- a/lib/diff.tcl
+++ b/lib/diff.tcl
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]
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]
}