mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge commit 'origin/master'
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+163
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user