IDEA-62060, IDEA-66050 MergeTool available for the whole project.
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Fri, 6 May 2011 15:50:17 +0000 (19:50 +0400)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Fri, 6 May 2011 16:00:29 +0000 (20:00 +0400)
* MergeTool action is always visible.
* It is enabled, if there are unresolved merges in the project.
* GitAction will be the common ancestor for most git actions (BasicAction is overheaded and will be transferred from).
* MergeTool extends GitAction. And we don't need the list of files anymore.

plugins/git4idea/src/git4idea/actions/GitAction.java [new file with mode: 0644]
plugins/git4idea/src/git4idea/actions/GitMergeTool.java

diff --git a/plugins/git4idea/src/git4idea/actions/GitAction.java b/plugins/git4idea/src/git4idea/actions/GitAction.java
new file mode 100644 (file)
index 0000000..17db5ac
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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 git4idea.actions;
+
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.project.DumbAwareAction;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Common class for most git actions.
+ * @author Kirill Likhodedov
+ */
+public abstract class GitAction extends DumbAwareAction {
+
+  @Override
+  public void update(@NotNull AnActionEvent e) {
+    Presentation presentation = e.getPresentation();
+    Project project = e.getData(PlatformDataKeys.PROJECT);
+    if (project == null || project.isDisposed()) {
+      presentation.setEnabled(false);
+      presentation.setVisible(false);
+      return;
+    }
+
+    presentation.setEnabled(isEnabled(e));
+  }
+
+  /**
+   * Checks if this action should be enabled.
+   * Called in {@link #update(com.intellij.openapi.actionSystem.AnActionEvent)}, so don't execute long tasks here.
+   * @return true if the action is enabled.
+   */
+  protected boolean isEnabled(@NotNull AnActionEvent event) {
+    return true;
+  }
+
+}
index 28c93018c1b4e92ef54c3287f820e63154e1f4ce..8d6b37205a681d2df495ab09946b6e0c952e4994 100644 (file)
  */
 package git4idea.actions;
 
+import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.AbstractVcsHelper;
 import com.intellij.openapi.vcs.FileStatus;
-import com.intellij.openapi.vcs.FileStatusManager;
-import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.changes.Change;
 import com.intellij.openapi.vcs.changes.ChangeListManager;
+import com.intellij.openapi.vcs.changes.ContentRevision;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitVcs;
-import git4idea.i18n.GitBundle;
 import org.jetbrains.annotations.NotNull;
 
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
 
 /**
  * Git merge tool for resolving conflicts. Use IDEA built-in 3-way merge tool.
  */
-public class GitMergeTool extends BasicAction {
-  /**
-   * {@inheritDoc}
-   */
+public class GitMergeTool extends GitAction {
+
   @Override
-  public boolean perform(@NotNull Project project,
-                         GitVcs vcs,
-                         @NotNull List<VcsException> exceptions,
-                         @NotNull VirtualFile[] affectedFiles) {
-    saveAll();
-    // ensure that all selected files actually has unresolved conflicts
-    ChangeListManager changes = ChangeListManager.getInstance(project);
-    for (VirtualFile file : affectedFiles) {
-      Change change = changes.getChange(file);
-      if (change != null && change.getFileStatus() != FileStatus.MERGED_WITH_CONFLICTS) {
-        File f = new File(file.getPath());
-        //noinspection ThrowableInstanceNeverThrown
-        exceptions.add(new VcsException(GitBundle.message("merge.is.not.needed", f.getAbsolutePath())));
-        return true;
+  public void actionPerformed(@NotNull AnActionEvent event) {
+    final Project project = event.getProject();
+
+    final Set<VirtualFile> conflictedFiles = new TreeSet<VirtualFile>(new Comparator<VirtualFile>() {
+      @Override
+      public int compare(@NotNull VirtualFile f1, @NotNull VirtualFile f2) {
+        return f1.getPresentableUrl().compareTo(f2.getPresentableUrl());
+      }
+    });
+    for (Change change : ChangeListManager.getInstance(project).getAllChanges()) {
+      final ContentRevision before = change.getBeforeRevision();
+      final ContentRevision after = change.getAfterRevision();
+      if (before != null) {
+        final VirtualFile file = before.getFile().getVirtualFile();
+        if (file != null) {
+          conflictedFiles.add(file);
+        }
+      }
+      if (after != null) {
+        final VirtualFile file = after.getFile().getVirtualFile();
+        if (file != null) {
+          conflictedFiles.add(file);
+        }
       }
     }
-    // perform merge
-    AbstractVcsHelper.getInstance(project).showMergeDialog(Arrays.asList(affectedFiles), vcs.getMergeProvider());
-    return false;
-  }
 
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  @NotNull
-  protected String getActionName() {
-    return GitBundle.getString("merge.tool.action.name");
+    AbstractVcsHelper.getInstance(project).showMergeDialog(new ArrayList<VirtualFile>(conflictedFiles), GitVcs.getInstance(project).getMergeProvider());
   }
 
-  /**
-   * {@inheritDoc}
-   */
   @Override
-  protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
-    FileStatusManager fs = FileStatusManager.getInstance(project);
-    for (VirtualFile f : vFiles) {
-      if (fs.getStatus(f) != FileStatus.MERGED_WITH_CONFLICTS) {
-        return false;
+  protected boolean isEnabled(@NotNull AnActionEvent event) {
+    final Collection<Change> changes = ChangeListManager.getInstance(event.getProject()).getAllChanges();
+    if (changes.size() > 1000) {
+      return true;
+    }
+    for (Change change : changes) {
+      if (change.getFileStatus() == FileStatus.MERGED_WITH_CONFLICTS) {
+        return true;
       }
     }
-    return true;
+    return false;
   }
+
 }