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
;
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
);
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
);
51 public boolean needsInteraction(final UpdatedFiles updatedFiles
) {
52 myConflictedVirtualFiles
= new ArrayList
<VirtualFile
>();
54 if (myChangesUnderProjectRoot
) {
55 refreshChangeListsFindConflicts(updatedFiles
);
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;
78 // on EDT, dispose checked
79 public void execute(final UpdatedFiles updatedFiles
) {
80 if (myConflictedVirtualFiles
.isEmpty()) {
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
);