Skip to contentSkip to conversation

The default encoding for reading commits is UTF-8 rather than system default

PATCH In review Constantine Plotnikov 2 participants 2 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

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
index c2b1b91..4702aaf 100644
@@ -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
index 030d4a4..933b929 100644
@@ -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
#1 lore raw
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. But Commit.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.