AnActionEvent#getProject() - shorthand for getData(PlatformDataKeys.PROJECT).
[idea/community.git] / plugins / git4idea / src / git4idea / actions / GitMergeTool.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package git4idea.actions;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.vcs.AbstractVcsHelper;
20 import com.intellij.openapi.vcs.FileStatus;
21 import com.intellij.openapi.vcs.FileStatusManager;
22 import com.intellij.openapi.vcs.VcsException;
23 import com.intellij.openapi.vcs.changes.Change;
24 import com.intellij.openapi.vcs.changes.ChangeListManager;
25 import com.intellij.openapi.vfs.VirtualFile;
26 import git4idea.GitVcs;
27 import git4idea.i18n.GitBundle;
28 import org.jetbrains.annotations.NotNull;
29
30 import java.io.File;
31 import java.util.Arrays;
32 import java.util.List;
33
34 /**
35  * Git merge tool for resolving conflicts. Use IDEA built-in 3-way merge tool.
36  */
37 public class GitMergeTool extends BasicAction {
38   /**
39    * {@inheritDoc}
40    */
41   @Override
42   public boolean perform(@NotNull Project project,
43                          GitVcs vcs,
44                          @NotNull List<VcsException> exceptions,
45                          @NotNull VirtualFile[] affectedFiles) {
46     saveAll();
47     // ensure that all selected files actually has unresolved conflicts
48     ChangeListManager changes = ChangeListManager.getInstance(project);
49     for (VirtualFile file : affectedFiles) {
50       Change change = changes.getChange(file);
51       if (change != null && change.getFileStatus() != FileStatus.MERGED_WITH_CONFLICTS) {
52         File f = new File(file.getPath());
53         //noinspection ThrowableInstanceNeverThrown
54         exceptions.add(new VcsException(GitBundle.message("merge.is.not.needed", f.getAbsolutePath())));
55         return true;
56       }
57     }
58     // perform merge
59     AbstractVcsHelper.getInstance(project).showMergeDialog(Arrays.asList(affectedFiles), vcs.getMergeProvider());
60     return false;
61   }
62
63   /**
64    * {@inheritDoc}
65    */
66   @Override
67   @NotNull
68   protected String getActionName() {
69     return GitBundle.getString("merge.tool.action.name");
70   }
71
72   /**
73    * {@inheritDoc}
74    */
75   @Override
76   protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
77     FileStatusManager fs = FileStatusManager.getInstance(project);
78     for (VirtualFile f : vFiles) {
79       if (fs.getStatus(f) != FileStatus.MERGED_WITH_CONFLICTS) {
80         return false;
81       }
82     }
83     return true;
84   }
85 }