From 770d36c8bafba2ad20686c161246a3a239cdf1d9 Mon Sep 17 00:00:00 2001 From: XinTong Wang Date: Tue, 8 Dec 2015 15:03:26 -0500 Subject: [PATCH] Fix apply patch which did not work with non-ascii characters Bug: 483943 Change-Id: If28f64053d20ab1bee54245f223e952dc2fe392c Signed-off-by: XinTong Wang Signed-off-by: Matthias Sohn --- .../jgit/junit/RepositoryTestCase.java | 6 +-- .../org/eclipse/jgit/diff/NonASCII.patch | Bin 0 -> 143 bytes .../org/eclipse/jgit/diff/NonASCII2.patch | Bin 0 -> 194 bytes .../org/eclipse/jgit/diff/NonASCII2_PostImage | Bin 0 -> 6 bytes .../org/eclipse/jgit/diff/NonASCII2_PreImage | Bin 0 -> 19 bytes .../org/eclipse/jgit/diff/NonASCIIAdd.patch | Bin 0 -> 152 bytes .../org/eclipse/jgit/diff/NonASCIIAdd2.patch | Bin 0 -> 172 bytes .../eclipse/jgit/diff/NonASCIIAdd2_PostImage | Bin 0 -> 3 bytes .../eclipse/jgit/diff/NonASCIIAdd_PostImage | Bin 0 -> 3 bytes .../eclipse/jgit/diff/NonASCIIAdd_PreImage | Bin .../org/eclipse/jgit/diff/NonASCIIDel.patch | Bin 0 -> 194 bytes .../eclipse/jgit/diff/NonASCIIDel_PreImage | Bin 0 -> 3 bytes .../org/eclipse/jgit/diff/NonASCII_PostImage | Bin 0 -> 4 bytes .../org/eclipse/jgit/diff/NonASCII_PreImage | Bin 0 -> 3 bytes .../eclipse/jgit/api/ApplyCommandTest.java | 49 ++++++++++++++++++ .../org/eclipse/jgit/api/ApplyCommand.java | 10 ++-- 16 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII2_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd2_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIAdd_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCIIDel_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NonASCII_PreImage diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java index 0db71f7cb..86b87b407 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/RepositoryTestCase.java @@ -144,10 +144,10 @@ protected void deleteTrashFile(final String name) throws IOException { 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 index 0000000000000000000000000000000000000000..d6408c99ffdca238bd1cd51e37d09ab8625b36e2 GIT binary patch literal 143 zcmYkzF%E)25JusCPVx7XL6#swx5kQw#?}V2vt|-9+mK+ZSM?&s#?ZaueaUi$$ir65 zhpG7adKpLD|4HUapJ=o@YSyYc^+O+q2BEIIwj~kSIb!C$jS&*S0Wp$%UT?Z#DsbHv RbH%(uJ)vY|Ta@@Wd;vSADBS=6 literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..cea6cfd156e7d0e5bcbf95e0b4df58fa78473ace GIT binary patch literal 194 zcmYevOiNSH)lJVVQApJH%g=KRcJ}l%QbH%q=V}3@wcm z3=Is-OiZ|Rb#;+-a%pR8qv&>UP|!70&^AXe4wU2tzZw9;<3M}> literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..5c8e34dbdb559e270225e23f738aa79cd318185f GIT binary patch literal 6 NcmaFb*85_4BLEJ)1PK5D literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..43696610a6b24ae79f50f0ffa0cba067e8516e9c GIT binary patch literal 19 dcmV+u0PO$dy`bf#z3;q?Amq4~=ar1_yn%?A4MqR} literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..de31a9eee3126fb91a8c99d7c38507d6b6586d77 GIT binary patch literal 152 zcmZ9^F%E)25JusCPVx7{;4VRgZiy8Qjjau4XUryKw;|D1uj)l;)$$eJi^&Wk_q1U- z%q5SP^E8by;`UvXa?~dp?T%_%*Qb8y{m{TW*R?H)$gd`5{yT&Kag_smgh2dxz3Ga% SAnRjIS+Q);98nCGR;3;4(JMay literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..5b41e9c26a52ad74e08ae81e61ef3876096d8164 GIT binary patch literal 172 zcmZ9FI}XAy5C!`^#p{g|+X^A+98sl7LrW91Yh=mTP588MRW1TTqJVNV(hSECp!G2> znCq$JVYeN}f!X2kgOufp5R>3kSYVB5n}%X$xxq=hmLOHN>H5z0?rXKys97#`KBq)V issE<;&}Lzx literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..0575c798f05a90ca8b3617062cd61648221d8a63 GIT binary patch literal 3 KcmaFd*aQFsFahTP literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..0575c798f05a90ca8b3617062cd61648221d8a63 GIT binary patch literal 3 KcmaFd*aQFsFahTP literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 index 0000000000000000000000000000000000000000..80e8f82cce7e0a48ba64170f12d366e0b535d905 GIT binary patch literal 194 zcmZY2y$ZrG6vgrVKE>JNZPQY#-6Fbl>Eh~Axi=Ds$x=U7eN|sX5d_8Y{NeDE;60cR zVZvArIjy$qzTarX{(F&V)JX+CM8z?SqO!Ja8cKTkk0FU(QENL_uSKy~cFU@(KNn{H pwa6HQQuJJ=Q;g&sxPq}W3+IR*w>#}HWW1;tl46{oNs#>;rYF_rIBWm_ literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..0575c798f05a90ca8b3617062cd61648221d8a63 GIT binary patch literal 3 KcmaFd*aQFsFahTP literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..f2435a29898c63f643a6b32d4ee00602d41108c7 GIT binary patch literal 4 LcmaFd*u(_@1|b3Q literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..0575c798f05a90ca8b3617062cd61648221d8a63 GIT binary patch literal 3 KcmaFd*aQFsFahTP literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java index d842046bb..239c844c3 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java @@ -186,6 +186,55 @@ public void testModifyNL1() throws Exception { 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) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java index 676ae0300..bde450f99 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java @@ -201,10 +201,12 @@ private void apply(File f, FileHeader fh) oldLines.add(rt.getString(i)); List newLines = new ArrayList(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 hunkLines = new ArrayList(hrt.size()); for (int i = 0; i < hrt.size(); i++) hunkLines.add(hrt.getString(i));