diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/ApplyPatchStatus.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/ApplyPatchStatus.java index 2f624d5ed2c4..c0a59e82f816 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/ApplyPatchStatus.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/ApplyPatchStatus.java @@ -14,24 +14,36 @@ * limitations under the License. */ -/* - * Created by IntelliJ IDEA. - * User: yole - * Date: 21.11.2006 - * Time: 14:17:13 - */ package com.intellij.openapi.diff.impl.patch; -public enum ApplyPatchStatus { - SUCCESS, PARTIAL, ALREADY_APPLIED, FAILURE, ABORT; +import com.google.common.collect.Ordering; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.Nullable; - public static ApplyPatchStatus and(ApplyPatchStatus lhs, ApplyPatchStatus rhs) { - if (lhs == null) return rhs; - if (rhs == null) return lhs; - if (lhs == ABORT || rhs == ABORT) return ABORT; - if (lhs == FAILURE || rhs == FAILURE) return FAILURE; - if (lhs == SUCCESS && rhs == SUCCESS) return SUCCESS; - if (lhs == ALREADY_APPLIED && rhs == ALREADY_APPLIED) return ALREADY_APPLIED; - return PARTIAL; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +public enum ApplyPatchStatus { + SUCCESS, PARTIAL, ALREADY_APPLIED, SKIP, FAILURE, ABORT; + + static final List ORDERED_TYPES = Arrays.asList( + SKIP, + SUCCESS, + ALREADY_APPLIED, + PARTIAL, + FAILURE, + ABORT + ); + + //ALREADY_APPLY with SUCCESS should be PARTIAL by historical reasons + static final Set PARTIAL_ADDITIONAL_SET = ContainerUtil.newHashSet(SUCCESS, ALREADY_APPLIED); + private static final Ordering ORDERING = Ordering.explicit(ORDERED_TYPES).nullsFirst(); + + @Nullable + public static ApplyPatchStatus and(@Nullable ApplyPatchStatus lhs, @Nullable ApplyPatchStatus rhs) { + Set statuses = ContainerUtil.newHashSet(lhs, rhs); + if (PARTIAL_ADDITIONAL_SET.equals(statuses)) return PARTIAL; + return ORDERING.max(lhs, rhs); } } \ No newline at end of file diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java index 6bd69e1dd664..c5027fe711cb 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/patch/formove/PatchApplier.java @@ -307,9 +307,7 @@ public class PatchApplier { try { markInternalOperation(textPatches, true); - - final ApplyPatchStatus status = actualApply(myVerifier, myCommitContext); - return status; + return actualApply(myVerifier, myCommitContext); } finally { markInternalOperation(textPatches, false); @@ -436,14 +434,11 @@ public class PatchApplier { myReverseConflict, myLeftConflictPanelTitle, myRightConflictPanelTitle); if (patchStatus == ApplyPatchStatus.ABORT) return patchStatus; - myVerifier.doMoveIfNeeded(patch.getFirst()); - status = ApplyPatchStatus.and(status, patchStatus); - if (patchStatus != ApplyPatchStatus.FAILURE) { + if (patchStatus == ApplyPatchStatus.FAILURE) return status; + if (patchStatus != ApplyPatchStatus.SKIP) { + myVerifier.doMoveIfNeeded(patch.getFirst()); myRemainingPatches.remove(patch.getSecond().getPatch()); - } else { - // interrupt if failure - return status; } } return status; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java index cd962a1fc83c..ecedcd0550a8 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchAction.java @@ -215,9 +215,8 @@ public class ApplyPatchAction extends DumbAwareAction { applyPatchStatusReference.set(ApplyPatchStatus.ABORT); } else if (result == Messages.NO) { - applyPatchStatusReference.set(ApplyPatchStatus.FAILURE); + applyPatchStatusReference.set(ApplyPatchStatus.SKIP); } - return result != Messages.CANCEL; } });