Merge commit 'origin/master'

This commit is contained in:
Eugene Kudelevsky
2011-06-08 18:22:12 +04:00
6 changed files with 206 additions and 6 deletions
@@ -144,13 +144,17 @@ public class ChangesBrowserNode<T> extends DefaultMutableTreeNode {
}
public List<Change> getAllChangesUnder() {
List<Change> changes = new ArrayList<Change>();
return getAllObjectsUnder(Change.class);
}
public <T> List<T> getAllObjectsUnder(final Class<T> clazz) {
List<T> changes = new ArrayList<T>();
final Enumeration enumeration = depthFirstEnumeration();
while (enumeration.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)enumeration.nextElement();
final Object value = child.getUserObject();
if (value instanceof Change) {
changes.add((Change)value);
if (clazz.isAssignableFrom(value.getClass())) {
changes.add((T) value);
}
}
return changes;
@@ -77,6 +77,7 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, Advan
@NonNls public static final String ourHelpId = "ideaInterface.changes";
@NonNls public static final DataKey<List<VirtualFile>> UNVERSIONED_FILES_DATA_KEY = DataKey.create("ChangeListView.UnversionedFiles");
@NonNls public static final DataKey<List<FilePath>> MISSING_FILES_DATA_KEY = DataKey.create("ChangeListView.MissingFiles");
@NonNls public static final DataKey<List<LocallyDeletedChange>> LOCALLY_DELETED_CHANGES = DataKey.create("ChangeListView.LocallyDeletedChanges");
@NonNls public static final DataKey<String> HELP_ID_DATA_KEY = DataKey.create(HELP_ID_KEY);
private ActionGroup myMenuGroup;
@@ -195,8 +196,9 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, Advan
}
else if (key == VcsDataKeys.MODIFIED_WITHOUT_EDITING_DATA_KEY) {
sink.put(VcsDataKeys.MODIFIED_WITHOUT_EDITING_DATA_KEY, getSelectedModifiedWithoutEditing());
}
else if (key == MISSING_FILES_DATA_KEY) {
} else if (key == LOCALLY_DELETED_CHANGES) {
sink.put(LOCALLY_DELETED_CHANGES, getSelectedLocallyDeletedChanges());
} else if (key == MISSING_FILES_DATA_KEY) {
sink.put(MISSING_FILES_DATA_KEY, getSelectedMissingFiles());
} else if (VcsDataKeys.HAVE_LOCALLY_DELETED == key) {
sink.put(VcsDataKeys.HAVE_LOCALLY_DELETED, haveLocallyDeleted());
@@ -265,6 +267,24 @@ public class ChangesListView extends Tree implements TypeSafeDataProvider, Advan
return new ArrayList<FilePath>(files);
}
private List<LocallyDeletedChange> getSelectedLocallyDeletedChanges() {
Set<LocallyDeletedChange> files = new HashSet<LocallyDeletedChange>();
final TreePath[] paths = getSelectionPaths();
if (paths != null) {
for (TreePath path : paths) {
if (path.getPathCount() > 1) {
ChangesBrowserNode firstNode = (ChangesBrowserNode)path.getPathComponent(1);
if (firstNode.getUserObject() == TreeModelBuilder.LOCALLY_DELETED_NODE) {
ChangesBrowserNode node = (ChangesBrowserNode)path.getLastPathComponent();
final List<LocallyDeletedChange> objectsUnder = node.getAllObjectsUnder(LocallyDeletedChange.class);
files.addAll(objectsUnder);
}
}
}
}
return new ArrayList<LocallyDeletedChange>(files);
}
private List<FilePath> getSelectedMissingFiles() {
return getSelectedFilePaths(TreeModelBuilder.LOCALLY_DELETED_NODE);
}
+6
View File
@@ -86,6 +86,12 @@
<separator/>
<add-to-group group-id="SubversionFilePopupGroup" anchor="last"/>
</group>
<action id="Subversion.MarkLocallyDeletedTreeResolved" class="org.jetbrains.idea.svn.actions.MarkLocallyDeletedTreeConflictResolvedAction">
<add-to-group group-id="ChangesViewPopupMenu" anchor="after" relative-to-action="ChangesView.Diff"/>
</action>
<reference id="Subversion.MarkTreeResolved">
<add-to-group group-id="ChangesViewPopupMenu" anchor="after" relative-to-action="ChangesView.Diff"/>
</reference>
<group id="SubversionUpdateActionGroup" class="org.jetbrains.idea.svn.actions.SubversionGroup">
<reference id="Subversion.Add"/>
<reference id="ChangesView.Rollback"/>
@@ -239,6 +239,9 @@ class SvnChangeProviderContext implements StatusReceiver {
myChangelistBuilder.processChangeInList(createChange(SvnContentRevision.create(myVcs, filePath, status.getCommittedRevision()),
CurrentContentRevision.create(filePath), FileStatus.MODIFIED, status), changeListNameFromStatus(status),
SvnVcs.getKey());
} else if (status.getTreeConflict() != null) {
myChangelistBuilder.processChange(createChange(SvnContentRevision.create(myVcs, filePath, status.getCommittedRevision()),
CurrentContentRevision.create(filePath), FileStatus.MODIFIED, status), SvnVcs.getKey());
}
checkSwitched(filePath, myChangelistBuilder, status, fStatus);
}
@@ -15,8 +15,8 @@
*/
package org.jetbrains.idea.svn;
import com.intellij.openapi.vcs.changes.LocallyDeletedChange;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.changes.LocallyDeletedChange;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -42,4 +42,8 @@ public class SvnLocallyDeletedChange extends LocallyDeletedChange {
}
return description;
}
public ConflictState getConflictState() {
return myConflictState;
}
}
@@ -0,0 +1,163 @@
/*
* Copyright 2000-2011 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 org.jetbrains.idea.svn.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.AbstractVcsHelper;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.VcsDataKeys;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.LocallyDeletedChange;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vcs.changes.ui.ChangesListView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.svn.ConflictedSvnChange;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnLocallyDeletedChange;
import org.jetbrains.idea.svn.SvnVcs;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNConflictChoice;
import org.tmatesoft.svn.core.wc.SVNWCClient;
import java.util.Collections;
import java.util.List;
/**
* @author irengrig
* Date: 6/8/11
* Time: 4:58 PM
*/
public class MarkLocallyDeletedTreeConflictResolvedAction extends AnAction {
public MarkLocallyDeletedTreeConflictResolvedAction() {
super(SvnBundle.message("action.mark.tree.conflict.resolved.text"));
}
@Override
public void actionPerformed(AnActionEvent e) {
final MyLocallyDeletedChecker locallyDeletedChecker = new MyLocallyDeletedChecker(e);
if (! locallyDeletedChecker.isEnabled()) return;
final String markText = SvnBundle.message("action.mark.tree.conflict.resolved.confirmation.title");
final Project project = locallyDeletedChecker.getProject();
final int result = Messages.showYesNoDialog(project,
SvnBundle.message("action.mark.tree.conflict.resolved.confirmation.text"), markText,
Messages.getQuestionIcon());
if (result == DialogWrapper.OK_EXIT_CODE) {
final Ref<VcsException> exception = new Ref<VcsException>();
ProgressManager
.getInstance().run(new Task.Backgroundable(project, markText, true, BackgroundFromStartOption.getInstance()) {
public void run(@NotNull ProgressIndicator indicator) {
resolveLocallyDeletedTextConflict(locallyDeletedChecker, exception);
}
});
if (! exception.isNull()) {
AbstractVcsHelper.getInstance(project).showError(exception.get(), markText);
}
}
}
@Override
public void update(AnActionEvent e) {
final MyLocallyDeletedChecker locallyDeletedChecker = new MyLocallyDeletedChecker(e);
e.getPresentation().setVisible(locallyDeletedChecker.isEnabled());
e.getPresentation().setEnabled(locallyDeletedChecker.isEnabled());
//e.getPresentation().setText(SvnBundle.message("action.mark.tree.conflict.resolved.text"));
}
private void resolveLocallyDeletedTextConflict(MyLocallyDeletedChecker checker, Ref<VcsException> exception) {
final FilePath path = checker.getPath();
resolve(checker.getProject(), exception, path);
VcsDirtyScopeManager.getInstance(checker.getProject()).filePathsDirty(Collections.singletonList(path), null);
}
private void resolve(Project project, Ref<VcsException> exception, FilePath path) {
final SVNWCClient client = SvnVcs.getInstance(project).createWCClient();
try {
client.doResolve(path.getIOFile(), SVNDepth.EMPTY, false, false, true, SVNConflictChoice.MERGED);
}
catch (SVNException e1) {
exception.set(new VcsException(e1));
}
}
private static class MyLocallyDeletedChecker {
private final boolean myEnabled;
private final FilePath myPath;
private final Project myProject;
public MyLocallyDeletedChecker(final AnActionEvent e) {
final DataContext dc = e.getDataContext();
myProject = PlatformDataKeys.PROJECT.getData(dc);
if (myProject == null) {
myPath = null;
myEnabled = false;
return;
}
final List<LocallyDeletedChange> missingFiles = e.getData(ChangesListView.LOCALLY_DELETED_CHANGES);
if (missingFiles == null || missingFiles.size() != 1) {
final Change[] changes = e.getData(VcsDataKeys.CHANGES);
if (changes == null || changes.length != 1 || changes[0].getAfterRevision() != null) {
myPath = null;
myEnabled = false;
return;
}
myEnabled = changes[0] instanceof ConflictedSvnChange && ((ConflictedSvnChange) changes[0]).getConflictState().isTree();
if (myEnabled) {
myPath = changes[0].getBeforeRevision().getFile();
} else {
myPath = null;
}
return;
}
final LocallyDeletedChange change = missingFiles.get(0);
myEnabled = change instanceof SvnLocallyDeletedChange && ((SvnLocallyDeletedChange) change).getConflictState().isTree();
if (myEnabled) {
myPath = ((SvnLocallyDeletedChange) change).getPath();
}
else {
myPath = null;
}
}
public boolean isEnabled() {
return myEnabled;
}
public FilePath getPath() {
return myPath;
}
public Project getProject() {
return myProject;
}
}
}