]> source.dussan.org Git - jgit.git/commitdiff
Fix apply patch which did not work with non-ascii characters 69/62269/2
authorXinTong Wang <xintong@ca.ibm.com>
Tue, 8 Dec 2015 20:03:26 +0000 (15:03 -0500)
committerMatthias Sohn <matthias.sohn@sap.com>
Thu, 3 Mar 2016 00:43:02 +0000 (01:43 +0100)
Bug: 483943
Change-Id: If28f64053d20ab1bee54245f223e952dc2fe392c
Signed-off-by: XinTong Wang <xintong@ca.ibm.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
16 files changed:
org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PreImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PreImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel_PreImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PreImage [new file with mode: 0644]
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java

index 0db71f7cbcf6a80c6ba2dc7e3a11e11f34cc89d7..86b87b40755acfc1ca1e9fea35725e22ceef37ab 100644 (file)
@@ -144,10 +144,10 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
 
        protected static void checkFile(File f, final String checkData)
                        throws IOException {
-               Reader r = new InputStreamReader(new FileInputStream(f), "ISO-8859-1");
+               Reader r = new InputStreamReader(new FileInputStream(f), "UTF-8");
                try {
-                       char[] data = new char[(int) f.length()];
-                       if (f.length() !=  r.read(data))
+                       char[] data = new char[checkData.length()];
+                       if (checkData.length() != r.read(data))
                                throw new IOException("Internal error reading file data from "+f);
                        assertEquals(checkData, new String(data));
                } finally {
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII.patch
new file mode 100644 (file)
index 0000000..d6408c9
--- /dev/null
@@ -0,0 +1,8 @@
+diff --git a/NonASCII b/NonASCII
+index 2e65efe..7898192 100644
+--- a/NonASCII
++++ b/NonASCII
+@@ -1 +1 @@
+-あ
+\ No newline at end of file
++あ
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2.patch
new file mode 100644 (file)
index 0000000..cea6cfd
--- /dev/null
@@ -0,0 +1,9 @@
+diff --git a/NonASCII2 b/NonASCII2
+index 2e65efe..7898192 100644
+--- a/NonASCII2
++++ b/NonASCII2
+@@ -1 +1 @@
+-你好, 世界!
+\ No newline at end of file
++再见
+\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PostImage
new file mode 100644 (file)
index 0000000..5c8e34d
--- /dev/null
@@ -0,0 +1 @@
+再见
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PreImage
new file mode 100644 (file)
index 0000000..4369661
--- /dev/null
@@ -0,0 +1 @@
+你好, 世界!
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd.patch
new file mode 100644 (file)
index 0000000..de31a9e
--- /dev/null
@@ -0,0 +1,7 @@
+diff --git a/NonASCIIAdd b/NonASCIIAdd
+index 2e65efe..7898192 100644
+--- a/NonASCIIAdd
++++ b/NonASCIIAdd
+@@ -0,0 +1 @@
++あ
+\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2.patch
new file mode 100644 (file)
index 0000000..5b41e9c
--- /dev/null
@@ -0,0 +1,8 @@
+diff --git a/NonASCIIAdd2 b/NonASCIIAdd2
+new file mode 100644
+index 2e65efe..7898192 100644
+--- /dev/null
++++ b/NonASCIIAdd2
+@@ -0,0 +1 @@
++あ
+\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2_PostImage
new file mode 100644 (file)
index 0000000..0575c79
--- /dev/null
@@ -0,0 +1 @@
+あ
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PostImage
new file mode 100644 (file)
index 0000000..0575c79
--- /dev/null
@@ -0,0 +1 @@
+あ
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PreImage
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel.patch
new file mode 100644 (file)
index 0000000..80e8f82
--- /dev/null
@@ -0,0 +1,9 @@
+diff --git a/NonASCIIDel b/NonASCIIDel
+deleted file mode 100644
+new file mode 100644
+index 2e65efe..7898192 100644
+--- a/NonASCIIDel
++++ /dev/null
+@@ -1 +0,0 @@
+-あ
+\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel_PreImage
new file mode 100644 (file)
index 0000000..0575c79
--- /dev/null
@@ -0,0 +1 @@
+あ
\ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PostImage
new file mode 100644 (file)
index 0000000..f2435a2
--- /dev/null
@@ -0,0 +1 @@
+あ
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PreImage
new file mode 100644 (file)
index 0000000..0575c79
--- /dev/null
@@ -0,0 +1 @@
+あ
\ No newline at end of file
index d842046bb762b921fb6550e0c7c74754c9708669..239c844c332d1ce0dc6a78287abda75d7da0bef4 100644 (file)
@@ -186,6 +186,55 @@ public class ApplyCommandTest extends RepositoryTestCase {
                                b.getString(0, b.size(), false));
        }
 
+       @Test
+       public void testNonASCII() throws Exception {
+               ApplyResult result = init("NonASCII");
+               assertEquals(1, result.getUpdatedFiles().size());
+               assertEquals(new File(db.getWorkTree(), "NonASCII"),
+                               result.getUpdatedFiles().get(0));
+               checkFile(new File(db.getWorkTree(), "NonASCII"),
+                               b.getString(0, b.size(), false));
+       }
+
+       @Test
+       public void testNonASCII2() throws Exception {
+               ApplyResult result = init("NonASCII2");
+               assertEquals(1, result.getUpdatedFiles().size());
+               assertEquals(new File(db.getWorkTree(), "NonASCII2"),
+                               result.getUpdatedFiles().get(0));
+               checkFile(new File(db.getWorkTree(), "NonASCII2"),
+                               b.getString(0, b.size(), false));
+       }
+
+       @Test
+       public void testNonASCIIAdd() throws Exception {
+               ApplyResult result = init("NonASCIIAdd");
+               assertEquals(1, result.getUpdatedFiles().size());
+               assertEquals(new File(db.getWorkTree(), "NonASCIIAdd"),
+                               result.getUpdatedFiles().get(0));
+               checkFile(new File(db.getWorkTree(), "NonASCIIAdd"),
+                               b.getString(0, b.size(), false));
+       }
+
+       @Test
+       public void testNonASCIIAdd2() throws Exception {
+               ApplyResult result = init("NonASCIIAdd2", false, true);
+               assertEquals(1, result.getUpdatedFiles().size());
+               assertEquals(new File(db.getWorkTree(), "NonASCIIAdd2"),
+                               result.getUpdatedFiles().get(0));
+               checkFile(new File(db.getWorkTree(), "NonASCIIAdd2"),
+                               b.getString(0, b.size(), false));
+       }
+
+       @Test
+       public void testNonASCIIDel() throws Exception {
+               ApplyResult result = init("NonASCIIDel", true, false);
+               assertEquals(1, result.getUpdatedFiles().size());
+               assertEquals(new File(db.getWorkTree(), "NonASCIIDel"),
+                               result.getUpdatedFiles().get(0));
+               assertFalse(new File(db.getWorkTree(), "NonASCIIDel").exists());
+       }
+
        private static byte[] readFile(final String patchFile) throws IOException {
                final InputStream in = getTestResource(patchFile);
                if (in == null) {
index 676ae03009dec688a8acfb01091f84ced6b1f385..bde450f99d7077a29511a8c353c99f7c1333a16b 100644 (file)
@@ -201,10 +201,12 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
                        oldLines.add(rt.getString(i));
                List<String> newLines = new ArrayList<String>(oldLines);
                for (HunkHeader hh : fh.getHunks()) {
-                       StringBuilder hunk = new StringBuilder();
-                       for (int j = hh.getStartOffset(); j < hh.getEndOffset(); j++)
-                               hunk.append((char) hh.getBuffer()[j]);
-                       RawText hrt = new RawText(hunk.toString().getBytes());
+
+                       byte[] b = new byte[hh.getEndOffset() - hh.getStartOffset()];
+                       System.arraycopy(hh.getBuffer(), hh.getStartOffset(), b, 0,
+                                       b.length);
+                       RawText hrt = new RawText(b);
+
                        List<String> hunkLines = new ArrayList<String>(hrt.size());
                        for (int i = 0; i < hrt.size(); i++)
                                hunkLines.add(hrt.getString(i));