From 9a6d6024884300929edba63465ea12d260276f90 Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Fri, 16 Dec 2022 23:23:03 +0100 Subject: [PATCH] PatchApplier: fix handling of last newline in text patch If the last line came from the patch, use the patch to determine whether or not there should be a trailing newline. Otherwise use the old text. Add test cases for - no newline at end, last line not in patch hunk - no newline at end, last line in patch hunk - patch removing the last newline - patch adding a newline at the end of file not having one all for core.autocrlf false, true, and input. Add a test case where the "no newline" indicator line is not the last line of the last hunk. This can happen if the patch ends with removals at the file end. Bug: 581234 Change-Id: I09d079b51479b89400ad300d0662c1dcb50deab6 Also-by: Yuriy Mitrofanov Signed-off-by: Thomas Wolf --- .../org/eclipse/jgit/diff/x_add_nl.patch | Bin 0 -> 154 bytes .../org/eclipse/jgit/diff/x_add_nl_PostImage | Bin 0 -> 16 bytes .../org/eclipse/jgit/diff/x_add_nl_PreImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/x_add_nl_crlf.patch | Bin 0 -> 174 bytes .../eclipse/jgit/diff/x_add_nl_crlf_PostImage | Bin 0 -> 24 bytes .../eclipse/jgit/diff/x_add_nl_crlf_PreImage | Bin 0 -> 22 bytes .../tst-rsrc/org/eclipse/jgit/diff/x_d.patch | Bin 0 -> 113 bytes .../org/eclipse/jgit/diff/x_d_PostImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/x_d_PreImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/x_d_crlf.patch | Bin 0 -> 133 bytes .../org/eclipse/jgit/diff/x_d_crlf_PostImage | Bin 0 -> 22 bytes .../org/eclipse/jgit/diff/x_d_crlf_PreImage | Bin 0 -> 22 bytes .../tst-rsrc/org/eclipse/jgit/diff/x_e.patch | Bin 0 -> 143 bytes .../org/eclipse/jgit/diff/x_e_PostImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/x_e_PreImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/x_e_crlf.patch | Bin 0 -> 163 bytes .../org/eclipse/jgit/diff/x_e_crlf_PostImage | Bin 0 -> 22 bytes .../org/eclipse/jgit/diff/x_e_crlf_PreImage | Bin 0 -> 22 bytes .../org/eclipse/jgit/diff/x_last_rm_nl.patch | Bin 0 -> 182 bytes .../eclipse/jgit/diff/x_last_rm_nl_PostImage | Bin 0 -> 15 bytes .../eclipse/jgit/diff/x_last_rm_nl_PreImage | Bin 0 -> 16 bytes .../eclipse/jgit/diff/x_last_rm_nl_crlf.patch | Bin 0 -> 202 bytes .../jgit/diff/x_last_rm_nl_crlf_PostImage | Bin 0 -> 22 bytes .../jgit/diff/x_last_rm_nl_crlf_PreImage | Bin 0 -> 24 bytes .../tst-rsrc/org/eclipse/jgit/diff/z_e.patch | Bin 0 -> 10769 bytes .../org/eclipse/jgit/diff/z_e_PostImage | Bin 0 -> 8059 bytes .../org/eclipse/jgit/diff/z_e_PreImage | Bin 0 -> 6955 bytes .../org/eclipse/jgit/diff/z_e_add_nl.patch | Bin 0 -> 180 bytes .../eclipse/jgit/diff/z_e_add_nl_PostImage | Bin 0 -> 16 bytes .../org/eclipse/jgit/diff/z_e_add_nl_PreImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/z_e_no_nl.patch | Bin 0 -> 204 bytes .../org/eclipse/jgit/diff/z_e_no_nl_PostImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/z_e_no_nl_PreImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/z_e_rm_nl.patch | Bin 0 -> 176 bytes .../org/eclipse/jgit/diff/z_e_rm_nl_PostImage | Bin 0 -> 15 bytes .../org/eclipse/jgit/diff/z_e_rm_nl_PreImage | Bin 0 -> 16 bytes .../eclipse/jgit/patch/PatchApplierTest.java | 261 +++++++++++++++++- .../org/eclipse/jgit/patch/PatchApplier.java | 42 +-- 38 files changed, 285 insertions(+), 18 deletions(-) create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_add_nl_crlf_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_d_crlf_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_e_crlf_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/x_last_rm_nl_crlf_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_add_nl_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_no_nl_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/z_e_rm_nl_PreImage 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 0000000000000000000000000000000000000000..444f7f7438ce652eceec55a7e902ee1ed75f5825 GIT binary patch literal 154 zcmYj|F%E+;5Cr>s#rDn-TQ*6{3-SUabmY!p$ubR6cz!|?(Trw_(ULQmm$F0d$0Vv# ztC;^vrKuf=QKEV4x@VAgn0o~8A1M(tUp{iqUEg5<_qPOh;ulIVLMAN4D~)(svHF7I`0kaA#s{jB1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..71ac1b5791204c80666ab1a4f9886b79e982739c GIT binary patch literal 16 XcmYe~O5#f9O5sZ7O5;lB%HRS39)JUN literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33a3e0ed4dbe9d71f725b001f24a29f703c9f2b7 GIT binary patch literal 15 WcmYe~O5#f9O5sZ7O5;lB$^ZZx3j=Ea literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..503d34562fb549c387c47e8898550a316cf33b8e GIT binary patch literal 174 zcmZY1K?=e!5JutsoZ{cdsVPZy+Y@*KA*7v|HV{&ff<3;vR5uU4&68pV=B4b&=Obm2 z)M}a^)i8aVN)tU0LJsP+>#lvC`)NS${Ut_X=HCN3=l(9^2p&!m?vpo!padf<#4Fu# V+tBn`OH+60@yN>y?zy#Rt*Gs6G? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..95801b09e9c99c61a12141ffa0b03725c160907a GIT binary patch literal 24 fcmYe~jO&w literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33a3e0ed4dbe9d71f725b001f24a29f703c9f2b7 GIT binary patch literal 15 WcmYe~O5#f9O5sZ7O5;lB$^ZZx3j=Ea literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8ec3f8b1058897013191abd038dc3ef42e5cf78a GIT binary patch literal 133 zcmYkzF%E+;5Jb^_PBHzmV6c^l&IR{Cw%10MP>Lu8$B)uPG+)1Y)?1_M(LYSnwcB3a zXJh^^`pfD??~|{tj^k=eF2Qql?hyi1_2wWVcN-&h9-fq6VgwVI!2&hN23D|v2fkVR BBXR%$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ecae1d61cdf106803caa69a96e9ee0f886c4aea4 GIT binary patch literal 22 dcmYe~^zAWx3>TI2S{p$QU=8^RAP5 zZF-$`PI_2Vp#5)%+4-GqWroV$io#xv?Yf3lSvGYI5ji?RDRp@3d&=e1QvL8116ptZ g9mGT3!2phs32MTVkA>O4Q_P-bqtA{@V2H`%1G`T>9smFU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d327752d1238f788a701b5211a9bbcc8acf86eaf GIT binary patch literal 22 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0fe4b4593b7e30e10aafd791f33c15dfb267a788 GIT binary patch literal 180 zcmY+*Jr06E6h-0wuHyF3ha(VaY5b{Nfe9IyH#o^;Xh<}!UhSkg$yc0^Vx;PvR{H&W zu)&8gl+5uDNF~^dP2(GLR#kP^PNOp(oIAEHRCV)0M7Dq5Q|nzv`Q-}_j^G3as6iui ehCXoTZDFxzPQ~a~S_xbtW6B0OLC%m1rGMXbj~}gt*RQ=Mhhc1b-is{sOonK5&5aRj@qntls8`D!2uk>05xcY gPS7hZJkKn4%c&UsLMwrDWK7v0d&mKDgq;5Vp6C=hJOBUy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..234fedc28e6903a7d4121b5af2f867d913a3b123 GIT binary patch literal 15 WcmYe~O5#f9O5t+la^rI6@&EuC3j*r^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33a3e0ed4dbe9d71f725b001f24a29f703c9f2b7 GIT binary patch literal 15 WcmYe~O5#f9O5sZ7O5;lB$^ZZx3j=Ea literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d669706eaa993390bfc58e3c30605ae8f1e4dc55 GIT binary patch literal 176 zcmY+5yAFat6b1Y96{o*m1Vm|Rd{lmc30c^?xCtzYA<_8tYNa-lnPPklfvQ7X=+@8H z+S}Bok=@r3leY)!!u3VB&9ZV+1@k?NJl|CnRQ30Si2U76LoHV|<%4%PumgM0Lk$|B f1M~{nLk^H5= 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()); } /**