VCS: allow Git to report changed on server files comparing the whole tree. !! require...
[fedora-idea.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / integrate / ResolveWorker.java
blobb522298a6795d08192d86e52d4859859ec00b204
1 package org.jetbrains.idea.svn.integrate;
3 import com.intellij.openapi.project.Project;
4 import com.intellij.openapi.util.io.FileUtil;
5 import com.intellij.openapi.vcs.AbstractVcsHelper;
6 import com.intellij.openapi.vcs.VcsKey;
7 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
8 import com.intellij.openapi.vcs.update.FileGroup;
9 import com.intellij.openapi.vcs.update.UpdateFilesHelper;
10 import com.intellij.openapi.vcs.update.UpdatedFiles;
11 import com.intellij.openapi.vfs.VirtualFile;
12 import org.jetbrains.idea.svn.SvnConfiguration;
13 import org.jetbrains.idea.svn.SvnUtil;
14 import org.jetbrains.idea.svn.SvnVcs;
15 import org.jetbrains.idea.svn.actions.SvnMergeProvider;
16 import org.jetbrains.idea.svn.update.SvnUpdateGroups;
18 import java.util.ArrayList;
19 import java.util.List;
21 public class ResolveWorker {
22 private final boolean myChangesUnderProjectRoot;
23 private final Project myProject;
24 private final VcsDirtyScopeManager myDirtyScopeManager;
25 private List<VirtualFile> myConflictedVirtualFiles;
27 public ResolveWorker(final boolean changesUnderProjectRoot, final Project project) {
28 myChangesUnderProjectRoot = changesUnderProjectRoot;
29 myProject = project;
30 myDirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
33 private void refreshChangeListsFindConflicts(final UpdatedFiles updatedFiles) {
34 UpdateFilesHelper.iterateFileGroupFiles(updatedFiles,
35 new UpdateFilesHelper.Callback() {
36 public void onFile(final String filePath, final String groupId) {
37 final VirtualFile vf = SvnUtil.getVirtualFile(filePath);
38 if (vf != null) {
39 // refresh base directory so that conflict files should be detected
40 // file itself is already refreshed
41 vf.getParent().refresh(false, false);
42 myDirtyScopeManager.fileDirty(vf);
44 if (FileGroup.MERGED_WITH_CONFLICT_ID.equals(groupId)) {
45 myConflictedVirtualFiles.add(vf);
48 });
51 public boolean needsInteraction(final UpdatedFiles updatedFiles) {
52 myConflictedVirtualFiles = new ArrayList<VirtualFile>();
54 if (myChangesUnderProjectRoot) {
55 refreshChangeListsFindConflicts(updatedFiles);
56 } else {
57 final FileGroup conflictedGroup = updatedFiles.getGroupById(FileGroup.MERGED_WITH_CONFLICT_ID);
58 for (String filename : conflictedGroup.getFiles()) {
59 final VirtualFile vf = SvnUtil.getVirtualFile(filename);
60 myConflictedVirtualFiles.add(vf);
64 return ((! myConflictedVirtualFiles.isEmpty()) || (! haveUnresolvedConflicts(updatedFiles))) &&
65 (! SvnConfiguration.getInstanceChecked(myProject).MERGE_DRY_RUN);
68 public static boolean haveUnresolvedConflicts(final UpdatedFiles updatedFiles) {
69 final String[] ids = new String[] {FileGroup.MERGED_WITH_CONFLICT_ID, FileGroup.MERGED_WITH_PROPERTY_CONFLICT_ID,
70 SvnUpdateGroups.MERGED_WITH_TREE_CONFLICT};
71 for (String id : ids) {
72 final FileGroup group = updatedFiles.getGroupById(id);
73 if ((group != null) && (! group.isEmpty())) return true;
75 return false;
78 // on EDT, dispose checked
79 public void execute(final UpdatedFiles updatedFiles) {
80 if (myConflictedVirtualFiles.isEmpty()) {
81 return;
83 final AbstractVcsHelper vcsHelper = AbstractVcsHelper.getInstance(myProject);
85 List<VirtualFile> mergedFiles = vcsHelper.showMergeDialog(myConflictedVirtualFiles, new SvnMergeProvider(myProject));
87 final FileGroup mergedGroup = updatedFiles.getGroupById(FileGroup.MERGED_ID);
88 final FileGroup conflictedGroup = updatedFiles.getGroupById(FileGroup.MERGED_WITH_CONFLICT_ID);
89 final VcsKey vcsKey = SvnVcs.getKey();
91 for (final VirtualFile mergedFile : mergedFiles) {
92 String path = FileUtil.toSystemDependentName(mergedFile.getPresentableUrl());
93 conflictedGroup.remove(path);
94 mergedGroup.add(path, vcsKey, null);
96 mergedFile.refresh(false, false);
97 // for additionally created files removal to be detected
98 mergedFile.getParent().refresh(false, false);
100 if (myChangesUnderProjectRoot) {
101 myDirtyScopeManager.fileDirty(mergedFile);