summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 51a989b)
raw | patch | inline | side by side (parent: 51a989b)
author | Shawn O. Pearce <spearce@spearce.org> | |
Tue, 23 Jan 2007 09:40:21 +0000 (04:40 -0500) | ||
committer | Shawn O. Pearce <spearce@spearce.org> | |
Tue, 23 Jan 2007 09:40:21 +0000 (04:40 -0500) |
Git prefers that all log messages are encoding in UTF-8. So now when
git-gui generates the commit message it converts the commit message
text from the internal Tcl Unicode representation into a UTF-8 file.
The file is then fed as stdin to git-commit-tree. I had to start
using a file here rather than feeding the message in with << as
<< uses the system encoding, which we may not want.
When we reload a commit message via git-cat-file we are getting the
raw byte stream, with no encoding performed by Git itself. So unless
the new 'encoding' header appears in the message we should probably
assume it is utf-8 encoded; but if the header is present we need to
use whatever it claims.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui generates the commit message it converts the commit message
text from the internal Tcl Unicode representation into a UTF-8 file.
The file is then fed as stdin to git-commit-tree. I had to start
using a file here rather than feeding the message in with << as
<< uses the system encoding, which we may not want.
When we reload a commit message via git-cat-file we are getting the
raw byte stream, with no encoding performed by Git itself. So unless
the new 'encoding' header appears in the message we should probably
assume it is utf-8 encoded; but if the header is present we need to
use whatever it claims.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui.sh | patch | blob | history |
diff --git a/git-gui.sh b/git-gui.sh
index 386ae989b86c74667e28eccbeed21c4639e438f1..6a4086d4755f3d92fdc21ea6a6fe76bc4c3f78fc 100755 (executable)
--- a/git-gui.sh
+++ b/git-gui.sh
proc load_last_commit {} {
global HEAD PARENT MERGE_HEAD commit_type ui_comm
+ global repo_config
if {[llength $PARENT] == 0} {
error_popup {There is nothing to amend.
set parents [list]
if {[catch {
set fd [open "| git cat-file commit $curHEAD" r]
+ fconfigure $fd -encoding binary -translation lf
+ if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
+ set enc utf-8
+ }
while {[gets $fd line] > 0} {
if {[string match {parent *} $line]} {
lappend parents [string range $line 7 end]
+ } elseif {[string match {encoding *} $line]} {
+ set enc [string tolower [string range $line 9 end]]
}
}
+ fconfigure $fd -encoding $enc
set msg [string trim [read $fd]]
close $fd
} err]} {
global single_commit all_heads current_branch
global ui_status_value ui_comm selected_commit_type
global file_states selected_paths rescan_active
+ global repo_config
gets $fd_wt tree_id
if {$tree_id eq {} || [catch {close $fd_wt} err]} {
return
}
+ # -- Build the message.
+ #
+ set msg_p [gitdir COMMIT_EDITMSG]
+ set msg_wt [open $msg_p w]
+ if {[catch {set enc $repo_config(i18n.commitencoding)}]} {
+ set enc utf-8
+ }
+ fconfigure $msg_wt -encoding $enc -translation binary
+ puts -nonewline $msg_wt $msg
+ close $msg_wt
+
# -- Create the commit.
#
set cmd [list git commit-tree $tree_id]
# git commit-tree writes to stderr during initial commit.
lappend cmd 2>/dev/null
}
- lappend cmd << $msg
+ lappend cmd <$msg_p
if {[catch {set cmt_id [eval exec $cmd]} err]} {
error_popup "commit-tree failed:\n\n$err"
set ui_status_value {Commit failed.}
# -- Cleanup after ourselves.
#
+ catch {file delete $msg_p}
catch {file delete [gitdir MERGE_HEAD]}
catch {file delete [gitdir MERGE_MSG]}
catch {file delete [gitdir SQUASH_MSG]}