Such hunks are identifiable by a zero value for "new start line". Prior to the fix, JGit throws and ArrayIndexOutOfBoundsException on such patches. Change-Id: I4f3deb5e5f41a08af965fcc178d678c77270cddb Signed-off-by: Jonathan Schneider <jkschneider@gmail.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v4.3.1.201605051710-r
@@ -0,0 +1,7 @@ | |||
diff --git a/W b/W | |||
index a3648a1..2d44096 100644 | |||
--- a/W | |||
+++ b/W | |||
@@ -1 +0,0 @@ | |||
-a | |||
\ No newline at end of file |
@@ -0,0 +1 @@ | |||
a |
@@ -146,6 +146,16 @@ public class ApplyCommandTest extends RepositoryTestCase { | |||
b.getString(0, b.size(), false)); | |||
} | |||
@Test | |||
public void testModifyW() throws Exception { | |||
ApplyResult result = init("W"); | |||
assertEquals(1, result.getUpdatedFiles().size()); | |||
assertEquals(new File(db.getWorkTree(), "W"), | |||
result.getUpdatedFiles().get(0)); | |||
checkFile(new File(db.getWorkTree(), "W"), | |||
b.getString(0, b.size(), false)); | |||
} | |||
@Test | |||
public void testModifyX() throws Exception { | |||
ApplyResult result = init("X"); |
@@ -223,12 +223,16 @@ public class ApplyCommand extends GitCommand<ApplyResult> { | |||
pos++; | |||
break; | |||
case '-': | |||
if (!newLines.get(hh.getNewStartLine() - 1 + pos).equals( | |||
hunkLine.substring(1))) { | |||
throw new PatchApplyException(MessageFormat.format( | |||
JGitText.get().patchApplyException, hh)); | |||
if (hh.getNewStartLine() == 0) { | |||
newLines.clear(); | |||
} else { | |||
if (!newLines.get(hh.getNewStartLine() - 1 + pos) | |||
.equals(hunkLine.substring(1))) { | |||
throw new PatchApplyException(MessageFormat.format( | |||
JGitText.get().patchApplyException, hh)); | |||
} | |||
newLines.remove(hh.getNewStartLine() - 1 + pos); | |||
} | |||
newLines.remove(hh.getNewStartLine() - 1 + pos); | |||
break; | |||
case '+': | |||
newLines.add(hh.getNewStartLine() - 1 + pos, | |||
@@ -250,7 +254,9 @@ public class ApplyCommand extends GitCommand<ApplyResult> { | |||
// still there! | |||
sb.append(l).append('\n'); | |||
} | |||
sb.deleteCharAt(sb.length() - 1); | |||
if (sb.length() > 0) { | |||
sb.deleteCharAt(sb.length() - 1); | |||
} | |||
FileWriter fw = new FileWriter(f); | |||
fw.write(sb.toString()); | |||
fw.close(); |