diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl.patch new file mode 100644 index 000000000..444f7f743 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PostImage new file mode 100644 index 000000000..71ac1b579 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PreImage new file mode 100644 index 000000000..33a3e0ed4 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf.patch new file mode 100644 index 000000000..503d34562 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PostImage new file mode 100644 index 000000000..95801b09e Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PreImage new file mode 100644 index 000000000..a8a98da26 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d.patch new file mode 100644 index 000000000..cc9025608 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PostImage new file mode 100644 index 000000000..9d2bc4360 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PreImage new file mode 100644 index 000000000..33a3e0ed4 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf.patch new file mode 100644 index 000000000..8ec3f8b10 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PostImage new file mode 100644 index 000000000..ecae1d61c Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PreImage new file mode 100644 index 000000000..a8a98da26 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e.patch new file mode 100644 index 000000000..413e4f88e Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PostImage new file mode 100644 index 000000000..b3ab996d1 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PreImage new file mode 100644 index 000000000..33a3e0ed4 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf.patch new file mode 100644 index 000000000..e67445422 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PostImage new file mode 100644 index 000000000..d327752d1 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PreImage new file mode 100644 index 000000000..a8a98da26 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl.patch new file mode 100644 index 000000000..34ed24637 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PostImage new file mode 100644 index 000000000..b3ab996d1 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PreImage new file mode 100644 index 000000000..71ac1b579 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf.patch new file mode 100644 index 000000000..3f74024ec Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PostImage new file mode 100644 index 000000000..d327752d1 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PreImage new file mode 100644 index 000000000..95801b09e Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e.patch new file mode 100644 index 000000000..f53103384 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PostImage new file mode 100644 index 000000000..788835694 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PreImage new file mode 100644 index 000000000..8d8786f58 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl.patch new file mode 100644 index 000000000..0fe4b4593 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PostImage new file mode 100644 index 000000000..274cb0e64 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PreImage new file mode 100644 index 000000000..33a3e0ed4 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl.patch new file mode 100644 index 000000000..bce13e463 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PostImage new file mode 100644 index 000000000..234fedc28 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PreImage new file mode 100644 index 000000000..33a3e0ed4 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PreImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl.patch new file mode 100644 index 000000000..d669706ea Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl.patch differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PostImage new file mode 100644 index 000000000..234fedc28 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PostImage differ diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PreImage new file mode 100644 index 000000000..71ac1b579 Binary files /dev/null and b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PreImage differ diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java index 1e430da08..bcde022d4 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java @@ -354,6 +354,7 @@ public void testShiftDown2() throws Exception { Result result = applyPatch(); verifyChange(result, "ShiftDown2"); } + } public static class InCore extends Base { @@ -361,10 +362,44 @@ public static class InCore extends Base { public InCore() { super(true); } + + @Test + public void testNoNewlineAtEnd() throws Exception { + init("x_d"); + + Result result = applyPatch(); + verifyChange(result, "x_d"); + } + + @Test + public void testNoNewlineAtEndInHunk() throws Exception { + init("x_e"); + + Result result = applyPatch(); + verifyChange(result, "x_e"); + } + + @Test + public void testAddNewlineAtEnd() throws Exception { + init("x_add_nl"); + + Result result = applyPatch(); + verifyChange(result, "x_add_nl"); + } + + @Test + public void testRemoveNewlineAtEnd() throws Exception { + init("x_last_rm_nl"); + + Result result = applyPatch(); + verifyChange(result, "x_last_rm_nl"); + } } public static class WithWorktree extends Base { - public WithWorktree() { super(false); } + public WithWorktree() { + super(false); + } @Test public void testModifyNL1() throws Exception { @@ -473,6 +508,230 @@ public void testPatchWithCrLf2() throws Exception { } } + @Test + public void testNoNewlineAtEndAutoCRLF_true() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, true); + + init("x_d_crlf", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_d_crlf"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testNoNewlineAtEndAutoCRLF_false() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, false); + + init("x_d", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_d"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testNoNewlineAtEndAutoCRLF_input() throws Exception { + try { + db.getConfig().setString(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, "input"); + + init("x_d", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_d"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testNoNewlineAtEndInHunkAutoCRLF_true() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, true); + + init("x_e_crlf", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_e_crlf"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testNoNewlineAtEndInHunkAutoCRLF_false() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, false); + + init("x_e", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_e"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testNoNewlineAtEndInHunkAutoCRLF_input() throws Exception { + try { + db.getConfig().setString(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, "input"); + + init("x_e", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_e"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testAddNewlineAtEndAutoCRLF_true() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, true); + + init("x_add_nl_crlf", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_add_nl_crlf"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testAddNewlineAtEndAutoCRLF_false() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, false); + + init("x_add_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_add_nl"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testAddNewlineAtEndAutoCRLF_input() throws Exception { + try { + db.getConfig().setString(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, "input"); + + init("x_add_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_add_nl"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testRemoveNewlineAtEndAutoCRLF_true() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, true); + + init("x_last_rm_nl_crlf", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_last_rm_nl_crlf"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testRemoveNewlineAtEndAutoCRLF_false() throws Exception { + try { + db.getConfig().setBoolean(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, false); + + init("x_last_rm_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_last_rm_nl"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testRemoveNewlineAtEndAutoCRLF_input() throws Exception { + try { + db.getConfig().setString(ConfigConstants.CONFIG_CORE_SECTION, + null, ConfigConstants.CONFIG_KEY_AUTOCRLF, "input"); + + init("x_last_rm_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "x_last_rm_nl"); + } finally { + db.getConfig().unset(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_AUTOCRLF); + } + } + + @Test + public void testEditExample() throws Exception { + init("z_e", true, true); + + Result result = applyPatch(); + verifyChange(result, "z_e"); + } + + @Test + public void testEditNoNewline() throws Exception { + init("z_e_no_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "z_e_no_nl"); + } + + @Test + public void testEditAddNewline() throws Exception { + init("z_e_add_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "z_e_add_nl"); + } + + @Test + public void testEditRemoveNewline() throws Exception { + init("z_e_rm_nl", true, true); + + Result result = applyPatch(); + verifyChange(result, "z_e_rm_nl"); + } + // Clean/smudge filter for testFiltering. The smudgetest test resources // were created with C git using a clean filter sed -e "s/A/E/g" and the // smudge filter sed -e "s/E/A/g". To keep the test independent of the diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java index 50b92c189..2a4de1331 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java @@ -24,6 +24,7 @@ import java.text.MessageFormat; import java.time.Instant; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -93,6 +94,9 @@ */ public class PatchApplier { + private static final byte[] NO_EOL = "\\ No newline at end of file" //$NON-NLS-1$ + .getBytes(StandardCharsets.US_ASCII); + /** The tree before applying the patch. Only non-null for inCore operation. */ @Nullable private final RevTree beforeTree; @@ -762,6 +766,8 @@ private ContentStreamLoader applyText(RawText rt, FileHeader fh) int afterLastHunk = 0; int lineNumberShift = 0; int lastHunkNewLine = -1; + boolean lastWasRemoval = false; + boolean noNewLineAtEndOfNew = false; for (HunkHeader hh : fh.getHunks()) { // We assume hunks to be ordered if (hh.getNewStartLine() <= lastHunkNewLine) { @@ -850,17 +856,26 @@ && canApplyAt(hunkLines, newLines, 0)) { if (!hunkLine.hasRemaining()) { // Completely empty line; accept as empty context line applyAt++; + lastWasRemoval = false; continue; } switch (hunkLine.array()[hunkLine.position()]) { case ' ': applyAt++; + lastWasRemoval = false; break; case '-': newLines.remove(applyAt); + lastWasRemoval = true; break; case '+': newLines.add(applyAt++, slice(hunkLine, 1)); + lastWasRemoval = false; + break; + case '\\': + if (!lastWasRemoval && isNoNewlineAtEnd(hunkLine)) { + noNewLineAtEndOfNew = true; + } break; default: break; @@ -868,12 +883,15 @@ && canApplyAt(hunkLines, newLines, 0)) { } afterLastHunk = applyAt; } - if (!isNoNewlineAtEndOfFile(fh)) { + // If the last line should have a newline, add a null sentinel + if (lastHunkNewLine >= 0 && afterLastHunk == newLines.size()) { + // Last line came from the patch + if (!noNewLineAtEndOfNew) { + newLines.add(null); + } + } else if (!rt.isMissingNewlineAtEnd()) { newLines.add(null); } - if (!rt.isMissingNewlineAtEnd()) { - oldLines.add(null); - } // We could check if old == new, but the short-circuiting complicates // logic for inCore patching, so just write the new thing regardless. @@ -931,19 +949,9 @@ private ByteBuffer slice(ByteBuffer b, int off) { return ByteBuffer.wrap(b.array(), newOffset, b.limit() - newOffset); } - private boolean isNoNewlineAtEndOfFile(FileHeader fh) { - List hunks = fh.getHunks(); - if (hunks == null || hunks.isEmpty()) { - return false; - } - HunkHeader lastHunk = hunks.get(hunks.size() - 1); - byte[] buf = new byte[lastHunk.getEndOffset() - - lastHunk.getStartOffset()]; - System.arraycopy(lastHunk.getBuffer(), lastHunk.getStartOffset(), buf, - 0, buf.length); - RawText lhrt = new RawText(buf); - return lhrt.getString(lhrt.size() - 1) - .equals("\\ No newline at end of file"); //$NON-NLS-1$ + private boolean isNoNewlineAtEnd(ByteBuffer hunkLine) { + return Arrays.equals(NO_EOL, 0, NO_EOL.length, hunkLine.array(), + hunkLine.position(), hunkLine.limit()); } /**