package jetbrains.mps.vcs.platform.actions;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.vcs.diff.ui.common.Bounds;
import org.jetbrains.mps.openapi.persistence.DataSource;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.extapi.persistence.FileDataSource;
import jetbrains.mps.persistence.FilePerRootDataSource;
import jetbrains.mps.smodel.ModelAccess;
import jetbrains.mps.util.Computable;
import jetbrains.mps.project.MPSExtentions;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.diff.DiffProvider;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.openapi.vcs.changes.ContentRevision;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import org.jetbrains.mps.openapi.model.SNodeId;
import java.util.List;
import com.intellij.diff.contents.DiffContent;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import com.intellij.diff.DiffContentFactory;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.requests.SimpleDiffRequest;
import jetbrains.mps.vcs.platform.integration.ModelDiffViewer;
import com.intellij.diff.DiffManager;
import com.intellij.openapi.vcs.VcsException;
import org.apache.log4j.Level;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.impl.VcsFileStatusProvider;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import java.util.Iterator;
import jetbrains.mps.baseLanguage.closures.runtime.YieldingIterator;
import jetbrains.mps.internal.collections.runtime.Sequence;
import com.intellij.openapi.vcs.FileStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.project.AbstractModule;
import java.util.Collections;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
public class VcsActionsUtil {
private static final Logger LOG = LogManager.getLogger(VcsActionsUtil.class);
private VcsActionsUtil() {
}
public static void showRootDifference(SModel model, final SNode node, Project project, @Nullable Bounds bounds) {
try {
DataSource source = model.getSource();
IFile iFile = null;
if (source instanceof FileDataSource) {
iFile = ((FileDataSource) source).getFile();
} else if (source instanceof FilePerRootDataSource) {
String rootName = ModelAccess.instance().runReadAction(new Computable<String>() {
public String compute() {
return node.getName();
}
});
iFile = ((FilePerRootDataSource) source).getFile(rootName + "." + MPSExtentions.MODEL_ROOT);
}
VirtualFile vFile = VirtualFileUtils.getProjectVirtualFile(iFile);
assert vFile != null;
AbstractVcs vcs = ProjectLevelVcsManager.getInstance(project).getVcsFor(vFile);
assert vcs != null;
DiffProvider diffProvider = vcs.getDiffProvider();
assert diffProvider != null;
VcsRevisionNumber revisionNumber = diffProvider.getCurrentRevision(vFile);
ContentRevision revision = diffProvider.createFileContent(revisionNumber, vFile);
final Wrappers._T<SModel> newModel = new Wrappers._T<SModel>();
final Wrappers._T<SNodeId> id = new Wrappers._T<SNodeId>();
final Wrappers._T<String> title = new Wrappers._T<String>();
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
newModel.value = node.getModel();
id.value = node.getNodeId();
title.value = node.getName();
}
});
List<DiffContent> contents = ListSequence.fromListAndArray(new ArrayList<DiffContent>(), DiffContentFactory.getInstance().create(revision.getContent(), vFile.getFileType()), DiffContentFactory.getInstance().create(project, vFile));
List<String> titles = ListSequence.fromListAndArray(new ArrayList<String>(), revisionNumber.asString() + " (Read-Only)", "Your Version");
DiffRequest request = new SimpleDiffRequest(title.value, contents, titles);
// put hint to show only one root and navigate
request.putUserData(ModelDiffViewer.DIFF_SHOW_ROOTID, id.value);
request.putUserData(ModelDiffViewer.DIFF_NAVIGATE_TO, bounds);
DiffManager.getInstance().showDiff(project, request);
} catch (VcsException e) {
if (LOG.isEnabledFor(Level.WARN)) {
LOG.warn("", e);
}
Messages.showErrorDialog(project, "Can't show difference due to the following error: " + e.getMessage(), "Error");
}
}
private static Iterable<VirtualFile> collectUnversionedFiles(final VcsFileStatusProvider fileStatusProvider, final VirtualFile dir) {
return new _FunctionTypes._return_P0_E0<Iterable<VirtualFile>>() {
public Iterable<VirtualFile> invoke() {
return new Iterable<VirtualFile>() {
public Iterator<VirtualFile> iterator() {
return new YieldingIterator<VirtualFile>() {
private int __CP__ = 0;
protected boolean moveToNext() {
__loop__:
do {
__switch__:
switch (this.__CP__) {
case -1:
assert false : "Internal error";
return false;
case 4:
this._5_child_it = Sequence.fromIterable(Sequence.fromArray(dir.getChildren())).iterator();
case 6:
if (!(this._5_child_it.hasNext())) {
this.__CP__ = 1;
break;
}
this._5_child = this._5_child_it.next();
this.__CP__ = 7;
break;
case 8:
this._8__yield_brpb5o_a0b0a0a0c_it = Sequence.fromIterable(collectUnversionedFiles(fileStatusProvider, _5_child)).iterator();
case 9:
if (!(this._8__yield_brpb5o_a0b0a0a0c_it.hasNext())) {
this.__CP__ = 6;
break;
}
this._8__yield_brpb5o_a0b0a0a0c = this._8__yield_brpb5o_a0b0a0a0c_it.next();
this.__CP__ = 10;
break;
case 2:
if (fileStatusProvider.getFileStatus(dir) == FileStatus.UNKNOWN) {
this.__CP__ = 3;
break;
}
this.__CP__ = 4;
break;
case 5:
this.__CP__ = 4;
this.yield(dir);
return true;
case 11:
this.__CP__ = 9;
this.yield(_8__yield_brpb5o_a0b0a0a0c);
return true;
case 0:
this.__CP__ = 2;
break;
case 3:
this.__CP__ = 5;
break;
case 7:
this.__CP__ = 8;
break;
case 10:
this.__CP__ = 11;
break;
default:
break __loop__;
}
} while (true);
return false;
}
private VirtualFile _5_child;
private Iterator<VirtualFile> _5_child_it;
private VirtualFile _8__yield_brpb5o_a0b0a0a0c;
private Iterator<VirtualFile> _8__yield_brpb5o_a0b0a0a0c_it;
};
}
};
}
}.invoke();
}
public static Iterable<VirtualFile> getUnversionedFilesForModule(@NotNull Project project, @NotNull SModule module) {
IFile descriptorFile = ((AbstractModule) module).getDescriptorFile();
if (descriptorFile == null) {
return Sequence.fromIterable(Collections.<VirtualFile>emptyList());
}
IFile moduleDir = descriptorFile.getParent();
VcsFileStatusProvider statusProvider = project.getComponent(VcsFileStatusProvider.class);
return collectUnversionedFiles(statusProvider, VirtualFileUtils.getVirtualFile(moduleDir));
}
public static List<VirtualFile> getUnversionedFilesForModules(@NotNull final Project project, List<SModule> module) {
return ListSequence.fromList(module).translate(new ITranslator2<SModule, VirtualFile>() {
public Iterable<VirtualFile> translate(SModule m) {
return getUnversionedFilesForModule(project, m);
}
}).toListSequence();
}
}