The default encoding for reading commits is UTF-8 rather than system default
PATCH 1/1 The default encoding for reading commits is UTF-8 rather than system default
When reading commits the system default encoding was used if no encoding was specified in the commit. The patch modifies test to add a check that commit message was encoded correctly (the test fails on old implementation if system encoding is not UTF-8) and fixes Commit.decode() method to use UTF-8 is encoding is not specified in the commit object.
---
See man git-commit (the section "DISCUSSION"), for justification why UTF-8 should be used. Note that this was already correctly implemented in ObjectWriter.writeCommit(...) method. But Commit.decode() was not implemented in the same way for some reason.
.../tst/org/spearce/jgit/lib/T0003_Basic.java | 3 +++ .../src/org/spearce/jgit/lib/Commit.java | 18 +++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-)
org.spearce.jgit.test/tst/org/spearce/jgit/lib/T0003_Basic.java +3 -0
@@ -348,6 +348,9 @@ public void test023_createCommitNonAnullii() throws IOException { commit.setMessage("\u00dcbergeeks"); ObjectId cid = new ObjectWriter(db).writeCommit(commit); assertEquals("4680908112778718f37e686cbebcc912730b3154", cid.name()); + Commit loadedCommit = db.mapCommit(cid); + assertNotSame(loadedCommit, commit); + assertEquals(commit.getMessage(), loadedCommit.getMessage()); } public void test024_createCommitNonAscii() throws IOException {
org.spearce.jgit/src/org/spearce/jgit/lib/Commit.java +7 -11
@@ -299,17 +299,13 @@ private void decode() { br.read(readBuf); int msgstart = readBuf.length != 0 ? ( readBuf[0] == '\n' ? 1 : 0 ) : 0; - if (encoding != null) { - // TODO: this isn't reliable so we need to guess the encoding from the actual content - author = new PersonIdent(new String(rawAuthor.getBytes(),encoding.name())); - committer = new PersonIdent(new String(rawCommitter.getBytes(),encoding.name())); - message = new String(readBuf,msgstart, readBuf.length-msgstart, encoding.name()); - } else { - // TODO: use config setting / platform / ascii / iso-latin - author = new PersonIdent(new String(rawAuthor.getBytes())); - committer = new PersonIdent(new String(rawCommitter.getBytes())); - message = new String(readBuf, msgstart, readBuf.length-msgstart); - } + // If encoding is not specified, the default for commit is UTF-8 + if (encoding == null) encoding = Constants.CHARSET; + + // TODO: this isn't reliable so we need to guess the encoding from the actual content + author = new PersonIdent(new String(rawAuthor.getBytes(),encoding.name())); + committer = new PersonIdent(new String(rawCommitter.getBytes(),encoding.name())); + message = new String(readBuf,msgstart, readBuf.length-msgstart, encoding.name()); } catch (IOException e) { e.printStackTrace(); } finally {
Signature · 1 line
1.6.1.2
Quoted 4 lines · Constantine Plotnikov
See man git-commit (the section "DISCUSSION"), for justification why UTF-8 should be used. Note that this was already correctly implemented in
ObjectWriter.writeCommit(...)method. ButCommit.decode()was not implemented in the same way for some reason.
Commit predates that encoding code in ObjectWriter.writeCommit and it looks like we just forgot to go back and fix it. A very old bug.
Since our move to the Eclipse Foundation we really need to follow their IP process, which for non-committers means creating a new bug in their Bugzilla system:
https://bugs.eclipse.org/bugs/enter_bug.cgi?product=EGit
See also:
http://wiki.eclipse.org/EGit/Contributor_Guide#Contributing_Patches
Quoted 3 lines
.../tst/org/spearce/jgit/lib/T0003_Basic.java | 3 +++ .../src/org/spearce/jgit/lib/Commit.java | 18 +++++++----------- 2 files changed, 10 insertions(+), 11 deletions(-)
Signature · 1 line
Shawn.