From 317c49e66c90487399d4aabbbb957387be3288e9 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Fri, 22 Jul 2016 19:49:21 +0300 Subject: [PATCH] [patch]: fix problems with last line when applying patch; tests added --- .../impl/patch/apply/GenericPatchApplier.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/apply/GenericPatchApplier.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/apply/GenericPatchApplier.java index 9db55395370b..78cdbce4fec3 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/apply/GenericPatchApplier.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/apply/GenericPatchApplier.java @@ -511,11 +511,16 @@ public class GenericPatchApplier { @NotNull IntPair contextOffsetInPatchSteps) { // cut last lines but not the very first final List list = value.getList(); + //last line should be taken from includeConsumer even it seems to be equal with base context line( they can differ with line separator) + boolean eofHunkAndLastLineShouldBeChanged = + containsLastLine(range) && splitHunk != null && splitHunk.getContextAfter().isEmpty() && !splitHunk.getAfterAll().isEmpty(); int cnt = list.size() - 1; int i = range.getEndOffset(); - for (; i > range.getStartOffset() && cnt >= 0; i--, cnt--) { - if (! list.get(cnt).equals(myLines.get(i))) { - break; + if (!eofHunkAndLastLineShouldBeChanged) { + for (; i > range.getStartOffset() && cnt >= 0; i--, cnt--) { + if (!list.get(cnt).equals(myLines.get(i))) { + break; + } } } int endSize = list.size(); @@ -526,8 +531,9 @@ public class GenericPatchApplier { int j = range.getStartOffset(); if (endSize > 0) { - for (; j < range.getEndOffset() && cntStart < list.size(); j++, cntStart++) { - if (! list.get(cntStart).equals(myLines.get(j))) { + int lastProcessedIndex = eofHunkAndLastLineShouldBeChanged ? list.size() - 1 : list.size(); + for (; j < range.getEndOffset() && cntStart < lastProcessedIndex; j++, cntStart++) { + if (!list.get(cntStart).equals(myLines.get(j))) { break; } } @@ -1041,19 +1047,17 @@ public class GenericPatchApplier { final StringBuilder sb = new StringBuilder(); // put not bind into the beginning for (SplitHunk hunk : myNotBound) { - linesToSb(sb, hunk.getAfterAll()); + linesToSb(sb, hunk.getAfterAll(), true); } iterateTransformations(range -> { - linesToSb(sb, myLines.subList(range.getStartOffset(), range.getEndOffset() + 1)); - if (containsLastLine(range) && myBaseFileEndsWithNewLine) { - sb.append('\n'); - } + List baseLineslist = myLines.subList(range.getStartOffset(), range.getEndOffset() + 1); + boolean withLineBreak = !containsLastLine(range) || myBaseFileEndsWithNewLine; + linesToSb(sb, baseLineslist, withLineBreak); }, range -> { final MyAppliedData appliedData = myTransformations.get(range); - linesToSb(sb, appliedData.getList()); - if (containsLastLine(range) && !mySuppressNewLineInEnd) { - sb.append('\n'); - } + List list = appliedData.getList(); + boolean withLineBreak = !containsLastLine(range) || !mySuppressNewLineInEnd; + linesToSb(sb, list, withLineBreak); }); return sb.toString(); } @@ -1062,11 +1066,11 @@ public class GenericPatchApplier { return range.getEndOffset() == myLines.size() - 1; } - private static void linesToSb(final StringBuilder sb, final List list) { - if (sb.length() > 0 && !list.isEmpty()) { - sb.append("\n"); - } + private static void linesToSb(final StringBuilder sb, final List list, boolean withEndLineBreak) { StringUtil.join(list, "\n", sb); + if (!list.isEmpty() && withEndLineBreak) { + sb.append('\n'); + } } // indexes are passed inclusive