blob: f283afa7550aab1261bc4cf23bd0129ff342f239 [file] [log] [blame]
/*
* Copyright 2000-2009 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.integrate;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vcs.AbstractVcsHelper;
import com.intellij.openapi.vcs.VcsKey;
import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
import com.intellij.openapi.vcs.update.FileGroup;
import com.intellij.openapi.vcs.update.UpdateFilesHelper;
import com.intellij.openapi.vcs.update.UpdatedFiles;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.idea.svn.SvnConfiguration;
import org.jetbrains.idea.svn.SvnUtil;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.actions.SvnMergeProvider;
import java.util.ArrayList;
import java.util.List;
public class ResolveWorker {
private final boolean myChangesUnderProjectRoot;
private final Project myProject;
private final VcsDirtyScopeManager myDirtyScopeManager;
private List<VirtualFile> myConflictedVirtualFiles;
public ResolveWorker(final boolean changesUnderProjectRoot, final Project project) {
myChangesUnderProjectRoot = changesUnderProjectRoot;
myProject = project;
myDirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
myConflictedVirtualFiles = new ArrayList<VirtualFile>();
}
private void refreshChangeListsFindConflicts(final UpdatedFiles updatedFiles) {
UpdateFilesHelper.iterateFileGroupFiles(updatedFiles,
new UpdateFilesHelper.Callback() {
public void onFile(final String filePath, final String groupId) {
final VirtualFile vf = SvnUtil.getVirtualFile(filePath);
if (vf != null) {
// refresh base directory so that conflict files should be detected
// file itself is already refreshed
vf.getParent().refresh(false, false);
myDirtyScopeManager.fileDirty(vf);
}
if (FileGroup.MERGED_WITH_CONFLICT_ID.equals(groupId)) {
myConflictedVirtualFiles.add(vf);
}
}
});
}
public boolean needsInteraction(final UpdatedFiles updatedFiles) {
if (myChangesUnderProjectRoot) {
refreshChangeListsFindConflicts(updatedFiles);
} else {
final FileGroup conflictedGroup = updatedFiles.getGroupById(FileGroup.MERGED_WITH_CONFLICT_ID);
for (String filename : conflictedGroup.getFiles()) {
final VirtualFile vf = SvnUtil.getVirtualFile(filename);
myConflictedVirtualFiles.add(vf);
}
}
return ((! myConflictedVirtualFiles.isEmpty()) || (! haveUnresolvedConflicts(updatedFiles))) &&
(!SvnConfiguration.getInstance(myProject).isMergeDryRun());
}
public static boolean haveUnresolvedConflicts(final UpdatedFiles updatedFiles) {
final String[] ids = new String[] {FileGroup.MERGED_WITH_CONFLICT_ID, FileGroup.MERGED_WITH_PROPERTY_CONFLICT_ID,
FileGroup.MERGED_WITH_TREE_CONFLICT, FileGroup.SKIPPED_ID};
for (String id : ids) {
final FileGroup group = updatedFiles.getGroupById(id);
if ((group != null) && (! group.isEmpty())) return true;
}
return false;
}
// on EDT, dispose checked
public void execute(final UpdatedFiles updatedFiles) {
if (myConflictedVirtualFiles.isEmpty()) {
return;
}
final AbstractVcsHelper vcsHelper = AbstractVcsHelper.getInstance(myProject);
List<VirtualFile> mergedFiles = vcsHelper.showMergeDialog(myConflictedVirtualFiles, new SvnMergeProvider(myProject));
final FileGroup mergedGroup = updatedFiles.getGroupById(FileGroup.MERGED_ID);
final FileGroup conflictedGroup = updatedFiles.getGroupById(FileGroup.MERGED_WITH_CONFLICT_ID);
final VcsKey vcsKey = SvnVcs.getKey();
for (final VirtualFile mergedFile : mergedFiles) {
String path = FileUtil.toSystemDependentName(mergedFile.getPresentableUrl());
conflictedGroup.remove(path);
mergedGroup.add(path, vcsKey, null);
mergedFile.refresh(false, false);
// for additionally created files removal to be detected
mergedFile.getParent().refresh(false, false);
if (myChangesUnderProjectRoot) {
myDirtyScopeManager.fileDirty(mergedFile);
}
}
}
}