[patch]: process SKIP status during resolving conflicts

* add SKIP enum status;
* refactor 'and' method using ordering from guava;
* test added;
* SKIP may appear only for modified files and means continue apply patch action for next patch-file in current base;
This commit is contained in:
Nadya Zabrodina
2015-10-15 17:18:54 +03:00
parent 841d1d00a2
commit 0c658802cb
3 changed files with 33 additions and 27 deletions
@@ -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<ApplyPatchStatus> ORDERED_TYPES = Arrays.asList(
SKIP,
SUCCESS,
ALREADY_APPLIED,
PARTIAL,
FAILURE,
ABORT
);
//ALREADY_APPLY with SUCCESS should be PARTIAL by historical reasons
static final Set<ApplyPatchStatus> PARTIAL_ADDITIONAL_SET = ContainerUtil.newHashSet(SUCCESS, ALREADY_APPLIED);
private static final Ordering<ApplyPatchStatus> ORDERING = Ordering.explicit(ORDERED_TYPES).nullsFirst();
@Nullable
public static ApplyPatchStatus and(@Nullable ApplyPatchStatus lhs, @Nullable ApplyPatchStatus rhs) {
Set<ApplyPatchStatus> statuses = ContainerUtil.newHashSet(lhs, rhs);
if (PARTIAL_ADDITIONAL_SET.equals(statuses)) return PARTIAL;
return ORDERING.max(lhs, rhs);
}
}
@@ -307,9 +307,7 @@ public class PatchApplier<BinaryType extends FilePatch> {
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<BinaryType extends FilePatch> {
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;
@@ -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;
}
});