diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesPreprocess.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesPreprocess.java new file mode 100644 index 000000000000..ff6591afcd96 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesPreprocess.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.vcs.changes; + +import com.intellij.openapi.diagnostic.rt.Logger; +import com.intellij.openapi.vcs.FilePath; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * User: Irina.Chernushina + * Date: 3/28/12 + * Time: 6:47 PM + */ +public class ChangesPreprocess { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.ChangesPreprocess"); + + public static List preprocessChangesRemoveDeletedForDuplicateMoved(List list) { + final List result = new ArrayList(); + final Map map = new HashMap(); + for (Change change : list) { + if (change.getBeforeRevision() == null) { + result.add(change); + } else { + final FilePath beforePath = ChangesUtil.getBeforePath(change); + final Change existing = map.get(beforePath); + if (existing == null) { + map.put(beforePath, change); + continue; + } + if (change.getAfterRevision() == null && existing.getAfterRevision() == null) continue; + if (change.getAfterRevision() != null && existing.getAfterRevision() != null) { + LOG.error("Incorrect changes list: " + list); + } + if (existing.getAfterRevision() != null && change.getAfterRevision() == null) { + continue; // skip delete change + } + if (change.getAfterRevision() != null && existing.getAfterRevision() == null) { + map.put(beforePath, change); // skip delete change + } + } + } + result.addAll(map.values()); + return result; + } +} diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertCommittedStuffAbstractAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertCommittedStuffAbstractAction.java index 82bd8486d1ec..4d08f7526b7e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertCommittedStuffAbstractAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/actions/RevertCommittedStuffAbstractAction.java @@ -81,7 +81,7 @@ abstract class RevertCommittedStuffAbstractAction extends AnAction implements Du @Override public void run(@NotNull ProgressIndicator indicator) { try { - final List preprocessed = preprocessChanges(changesList); + final List preprocessed = ChangesPreprocess.preprocessChangesRemoveDeletedForDuplicateMoved(changesList); patches.addAll(IdeaTextPatchBuilder.buildPatch(project, preprocessed, baseDir.getPresentableUrl(), true)); } catch (final VcsException ex) { @@ -102,35 +102,6 @@ abstract class RevertCommittedStuffAbstractAction extends AnAction implements Du }); } - private List preprocessChanges(List list) { - final List result = new ArrayList(); - final Map map = new HashMap(); - for (Change change : list) { - if (change.getBeforeRevision() == null) { - result.add(change); - } else { - final FilePath beforePath = ChangesUtil.getBeforePath(change); - final Change existing = map.get(beforePath); - if (existing == null) { - map.put(beforePath, change); - continue; - } - if (change.getAfterRevision() == null && existing.getAfterRevision() == null) continue; - if (change.getAfterRevision() != null && existing.getAfterRevision() != null) { - LOG.error("Incorrect changes list: " + list); - } - if (existing.getAfterRevision() != null && change.getAfterRevision() == null) { - continue; // skip delete change - } - if (change.getAfterRevision() != null && existing.getAfterRevision() == null) { - map.put(beforePath, change); // skip delete change - } - } - } - result.addAll(map.values()); - return result; - } - public void update(final AnActionEvent e) { final Project project = e.getData(PlatformDataKeys.PROJECT); final Change[] changes = myForUpdateConvertor.convert(e); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java index 5a8a5533e7f1..8b68d5a0fa82 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java @@ -403,7 +403,9 @@ public class SvnChangeList implements CommittedChangeList { } } - for (Change change : myDetailedList) { + final List preprocessed = ChangesPreprocess.preprocessChangesRemoveDeletedForDuplicateMoved(myDetailedList); + + for (Change change : preprocessed) { // directory statuses are already uploaded if ((change.getAfterRevision() == null) && (change.getBeforeRevision().getFile().isDirectory())) { final SvnRepositoryContentRevision revision = (SvnRepositoryContentRevision) change.getBeforeRevision(); @@ -414,6 +416,12 @@ public class SvnChangeList implements CommittedChangeList { if (myCopiedAddedPaths.containsKey(revision.getPath())) { detailsOnly.addAll(getChildrenAsChanges(revision.getPath(), false, duplicateControl)); } + } else if ((change.isIsReplaced() || change.isMoved() || change.isRenamed()) && change.getAfterRevision().getFile().isDirectory()) { + final SvnRepositoryContentRevision beforeRevision = (SvnRepositoryContentRevision) change.getBeforeRevision(); + detailsOnly.addAll(getChildrenAsChanges(beforeRevision.getPath(), true, duplicateControl)); + + final SvnRepositoryContentRevision revision = (SvnRepositoryContentRevision) change.getAfterRevision(); + detailsOnly.addAll(getChildrenAsChanges(revision.getPath(), false, duplicateControl)); } }