mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[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:
@@ -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);
|
||||
}
|
||||
}
|
||||
+4
-9
@@ -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;
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user