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(); } }