package jetbrains.mps.vcs.platform.actions; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import java.util.List; import com.intellij.openapi.vcs.VcsDirectoryMapping; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.project.Project; import java.awt.Frame; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.ide.blame.dialog.BlameDialog; import jetbrains.mps.ide.blame.dialog.BlameDialogComponent; import java.io.File; import java.util.ArrayList; import com.intellij.openapi.application.PathManager; import jetbrains.mps.internal.collections.runtime.Sequence; import java.io.FilenameFilter; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.vcs.platform.util.MergeBackupUtil; import java.util.Arrays; import jetbrains.mps.internal.collections.runtime.ISelector; import com.intellij.openapi.ui.Messages; public class ReportModelMergeProblem_Action extends BaseAction { private static final Icon ICON = null; public ReportModelMergeProblem_Action() { super("Report Model Merge Problem...", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { List<VcsDirectoryMapping> mappings = ProjectLevelVcsManager.getInstance(event.getData(CommonDataKeys.PROJECT)).getDirectoryMappings(); return ListSequence.fromList(mappings).any(new IWhereFilter<VcsDirectoryMapping>() { public boolean accept(VcsDirectoryMapping m) { return isNotEmptyString(m.getVcs()); } }); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { Project p = event.getData(CommonDataKeys.PROJECT); if (p == null) { return false; } } { Frame p = event.getData(MPSCommonDataKeys.FRAME); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final BlameDialog blameDialog = BlameDialogComponent.getInstance().createDialog(event.getData(CommonDataKeys.PROJECT), event.getData(MPSCommonDataKeys.FRAME)); blameDialog.setIssueHidden(true); blameDialog.setSubsystem("Version Control"); blameDialog.setIssueTitle("Model merge problem"); List<File> filesToAttach = ListSequence.fromList(new ArrayList<File>()); ListSequence.fromList(filesToAttach).addElement(new File(System.getProperty("user.home") + File.separator + ".gitconfig")); ListSequence.fromList(filesToAttach).addElement(new File(PathManager.getConfigPath() + File.separator + "mps-merger.sh")); ListSequence.fromList(filesToAttach).addSequence(Sequence.fromIterable(Sequence.fromArray(new File(PathManager.getLogPath()).listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.startsWith("mergedriver.log"); } })))); ListSequence.fromList(filesToAttach).visitAll(new IVisitor<File>() { public void visit(File f) { blameDialog.addFile(f); } }); // Select merge-backup to attach File backupDir = new File(MergeBackupUtil.getMergeBackupDirPath()); File[] listFiles = backupDir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".zip"); } }); if (listFiles == null) { ReportModelMergeProblem_Action.this.showNoBackupsAvailable(event); } else { List<File> zipFiles = Arrays.asList(listFiles); String[] zipNames = ListSequence.fromList(zipFiles).sort(new ISelector<File, Long>() { public Long select(File f) { return f.lastModified(); } }, false).select(new ISelector<File, String>() { public String select(File f) { return f.getName(); } }).toGenericArray(String.class); if (zipNames.length == 0) { ReportModelMergeProblem_Action.this.showNoBackupsAvailable(event); } else { int selectedIndex = Messages.showChooseDialog(event.getData(CommonDataKeys.PROJECT), "Choose merge backup file to attach", "Model Merge Problem", Messages.getQuestionIcon(), zipNames, zipNames[0]); if (selectedIndex < 0) { return; } blameDialog.addFile(new File(backupDir, zipNames[selectedIndex])); blameDialog.initDialog(); blameDialog.show(); } } } private void showNoBackupsAvailable(final AnActionEvent event) { Messages.showInfoMessage(event.getData(CommonDataKeys.PROJECT), "No merge backups available, that is MPS merge was not invoked.", "Model Merge Problem"); } private static boolean isNotEmptyString(String str) { return str != null && str.length() > 0; } }