package jetbrains.mps.vcs.platform.integration;
/*Generated by MPS */
import com.intellij.openapi.vcs.impl.AbstractVcsHelperImpl;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vcs.merge.MergeProvider;
import com.intellij.openapi.vcs.merge.MergeDialogCustomizer;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import com.intellij.openapi.ui.Messages;
import java.util.Collections;
import com.intellij.openapi.vcs.merge.MergeSession;
import com.intellij.openapi.vcs.merge.MergeProvider2;
import com.intellij.openapi.progress.ProgressManager;
public class MPSVcsHelper extends AbstractVcsHelperImpl {
public MPSVcsHelper(Project project) {
super(project);
}
@NotNull
@Override
public List<VirtualFile> showMergeDialog(List<VirtualFile> files, MergeProvider provider, @NotNull MergeDialogCustomizer customizer) {
if (ConflictingModelsUtil.hasResolvableConflicts(myProject, provider, ListSequence.fromList(((List<VirtualFile>) files)).where(new IWhereFilter<VirtualFile>() {
public boolean accept(VirtualFile f) {
return SetSequence.fromSet(ModelMergeTool.SUPPORTED_TYPES).contains(f.getFileType());
}
}))) {
int answer = Messages.showYesNoCancelDialog(myProject, "Conflicting changes have been detected. Some conflicts in the models can be autoresolved.\nResolve these conflicts automatically?", "Conflict Resolver", Messages.getQuestionIcon());
if (answer == Messages.CANCEL) {
return Collections.<VirtualFile>emptyList();
}
if (answer == Messages.YES) {
MergeSession session = (provider instanceof MergeProvider2 ? ((MergeProvider2) provider).createMergeSession(files) : null);
ConflictingModelsUtil.ModelConflictResolver modelConflictResolverTask = ConflictingModelsUtil.getModelConflictResolverTask(myProject, provider, session, files);
ProgressManager.getInstance().run(modelConflictResolverTask);
// update list of files
List<VirtualFile> autoResolvedFiles = modelConflictResolverTask.getResolvedFiles();
List<VirtualFile> unresolvedFiles = modelConflictResolverTask.getUnresolvedFiles();
if (ListSequence.fromList(unresolvedFiles).isNotEmpty()) {
String message = "Conflicts in the following model files were not autoresolved:\n";
for (VirtualFile file : ListSequence.fromList(unresolvedFiles)) {
message += " " + file.getPath() + "\n";
}
message += "This happens when you merge in models in an old persistence format and have not merged and re-generated all of their used languages." + " It is recommended to first merge and re-generate the used languages, and then try to auto resolve the conflicts again.\n" + "Continue with merge?";
int ans = Messages.showYesNoDialog(myProject, message, "Conflict Resolver", Messages.getWarningIcon());
if (ans == Messages.NO) {
return autoResolvedFiles;
}
}
List<VirtualFile> toResolve = ListSequence.fromList(((List<VirtualFile>) files)).subtract(ListSequence.fromList(autoResolvedFiles)).toListSequence();
List<VirtualFile> resolvedFiles = super.showMergeDialog(toResolve, provider, customizer);
return ListSequence.fromList(autoResolvedFiles).addSequence(ListSequence.fromList(resolvedFiles));
}
}
return super.showMergeDialog(files, provider, customizer);
}
}