From: "Shawn O. Pearce" <spearce@spearce.org>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Jakub Narebski <jnareb@gmail.com>,
Finn Arne Gangstad <finnag@pvv.org>,
Michele Ballabio <barra_cuda@katamail.com>
Subject: [RFC/PATCH] git-gui: Use gitattribute "encoding" for file content display
Date: Wed, 23 Jan 2008 00:47:09 -0500 [thread overview]
Message-ID: <20080123054709.GA13166@spearce.org> (raw)
I've got the following change in my "pu" right now and am considering
adding it to git-gui 0.9.2, which would be in git 1.5.4.
I've CC'd a number of people who have emailed me in the past
about git-gui's diff or blame failing to display a non US-ASCII
file content correctly and I am interested to hear if this would
resolve the issue for you. Its configurable on a per-path basis
by an "encoding" attribute in .gitattributes (see git-gui's own
example below).
If we go this route we'll also want to have core Git document in
its gitattributes manpage what this "encoding" attribute is for...
--8>--
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>
---
.gitattributes | 3 +++
git-gui.sh | 13 +++++++++++++
lib/blame.tcl | 5 ++++-
lib/diff.tcl | 9 ++++++---
4 files changed, 26 insertions(+), 4 deletions(-)
create mode 100644 .gitattributes
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..f96112d
--- /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 f42e461..adc25d0 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -466,6 +466,19 @@ proc githook_read {hook_name args} {
return {}
}
+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 00ecf21..f33d48f 100644
--- a/lib/blame.tcl
+++ b/lib/blame.tcl
@@ -374,7 +374,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 d04f6db..0f030e3 100644
--- a/lib/diff.tcl
+++ b/lib/diff.tcl
@@ -98,8 +98,11 @@ proc show_diff {path w {lno {}}} {
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]
@@ -188,8 +191,8 @@ proc show_diff {path w {lno {}}} {
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]
}
--
1.5.4.rc4.1130.g9ad85
next reply other threads:[~2008-01-23 5:47 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-23 5:47 Shawn O. Pearce [this message]
2008-01-23 5:55 ` [RFC/PATCH] git-gui: Use gitattribute "encoding" for file content display Junio C Hamano
2008-01-23 8:41 ` Steffen Prohaska
2008-01-23 10:28 ` Jakub Narebski
2008-01-24 3:36 ` Shawn O. Pearce
2008-01-23 7:02 ` Pedro Melo
[not found] ` <4FF40048-FCF4-4BAD-AD08-6ADAD30E7B6A@simplicidade.org>
2008-01-24 3:39 ` Shawn O. Pearce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080123054709.GA13166@spearce.org \
--to=spearce@spearce.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=barra_cuda@katamail.com \
--cc=finnag@pvv.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jnareb@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).