package jetbrains.mps.vcs; /*Generated by MPS */ import com.intellij.openapi.components.ProjectComponent; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vcs.changes.ChangeListAdapter; import com.intellij.util.messages.MessageBusConnection; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.changes.VcsDirtyScopeImpl; import com.intellij.openapi.vcs.actions.VcsContextFactory; import com.intellij.openapi.vcs.changes.ChangeProvider; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.application.ApplicationManager; import jetbrains.mps.vcs.platform.mergedriver.MergeDriverNotification; import com.intellij.openapi.vcs.VcsListener; import jetbrains.mps.InternalFlag; import jetbrains.mps.ide.vcs.SourceRevision; import jetbrains.mps.vcs.concrete.MPSSourceRevision; import com.intellij.openapi.vcs.FileStatusManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vcs.AbstractVcsHelper; import java.util.Arrays; import java.util.List; import com.intellij.openapi.vcs.changes.ChangeListManagerImpl; import com.intellij.openapi.vcs.changes.ChangeListManagerGate; import java.io.File; import com.intellij.openapi.vcs.changes.LocalChangeList; import org.jetbrains.annotations.Nullable; import java.util.Collection; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.changes.EmptyChangelistBuilder; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.ChangeList; import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vcs.changes.ContentRevision; import com.intellij.openapi.vcs.FileStatusListener; public class MPSVcsManager implements ProjectComponent { private static final Logger LOG = LogManager.getLogger(MPSVcsManager.class); private final Project myProject; private FileStatus myLastProjectStatus; private final ProjectLevelVcsManager myManager; private final ChangeListManager myChangeListManager; private volatile boolean myChangeListManagerInitialized = false; private final ChangeListAdapter myChangeListUpdateListener = new ChangeListAdapter() { @Override public void changeListUpdateDone() { myChangeListManagerInitialized = true; } }; private MPSVcsManager.MyFileStatusListener myFileStatusListener = new MPSVcsManager.MyFileStatusListener(); private MessageBusConnection myMessageBusConnection; public MPSVcsManager(Project project, ProjectLevelVcsManager manager, ChangeListManager clmanager) { myProject = project; myManager = manager; myChangeListManager = clmanager; } public boolean isInConflict(final VirtualFile vfile) { AbstractVcs vcs = myManager.getVcsFor(vfile); if (vcs == null) { return false; } VcsDirtyScopeImpl scope = new VcsDirtyScopeImpl(vcs, myProject); scope.addDirtyFile(VcsContextFactory.SERVICE.getInstance().createFilePathOn(vfile)); ChangeProvider changeProvider = vcs.getChangeProvider(); if (changeProvider == null) { return false; } final MPSVcsManager.MyChangelistBuilder builder = new MPSVcsManager.MyChangelistBuilder(vfile); try { changeProvider.getChanges(scope, builder, new EmptyProgressIndicator(), new MPSVcsManager.StubChangeListManagerGate()); } catch (VcsException e) { LOG.error(null, e); } return builder.isInConflict(); } @Override public void projectOpened() { if (ApplicationManager.getApplication().isUnitTestMode() || myProject.isDefault()) { return; } final MergeDriverNotification mergeDriverNotification = MergeDriverNotification.getInstance(myProject); mergeDriverNotification.showNotificationIfNeeded(); myMessageBusConnection = myProject.getMessageBus().connect(); VcsListener vcsListener = new VcsListener() { public void directoryMappingChanged() { mergeDriverNotification.showNotificationIfNeeded(); } }; myMessageBusConnection.subscribe(ProjectLevelVcsManager.VCS_CONFIGURATION_CHANGED, vcsListener); if (InternalFlag.isInternalMode()) { SourceRevision.setProvider(new MPSSourceRevision()); } FileStatusManager.getInstance(myProject).addFileStatusListener(myFileStatusListener); } @Override public void projectClosed() { FileStatusManager.getInstance(myProject).removeFileStatusListener(myFileStatusListener); check_2eqssr_a1a21(myMessageBusConnection); } @NonNls @NotNull @Override public String getComponentName() { return "VCS Manager"; } public boolean isChangeListManagerInitialized() { return myChangeListManagerInitialized; } @Override public void initComponent() { myChangeListManager.addChangeListListener(myChangeListUpdateListener); } @Override public void disposeComponent() { myChangeListManager.removeChangeListListener(myChangeListUpdateListener); } private void checkIfProjectIsConflicting() { VirtualFile projectFile = myProject.getProjectFile(); if (projectFile == null) { return; } FileStatus currentStatus = FileStatusManager.getInstance(myProject).getStatus(projectFile); if (currentStatus != myLastProjectStatus) { if (currentStatus == FileStatus.MERGED_WITH_CONFLICTS || currentStatus == FileStatus.MERGED_WITH_BOTH_CONFLICTS) { int answer = Messages.showYesNoDialog(myProject, "You have your project file unmerged. It is strongly recommended to merge it before continuing. " + "\nDo you want to merge it now?", "Unmerged Project File", Messages.getWarningIcon()); if (answer == 0) { AbstractVcsHelper.getInstance(myProject).showMergeDialog(Arrays.asList(projectFile)); } } myLastProjectStatus = currentStatus; } } public List<VirtualFile> getUnversionedFilesFromChangeListManager() { return ChangeListManagerImpl.getInstanceImpl(myProject).getUnversionedFiles(); } public static MPSVcsManager getInstance(@NotNull Project project) { return project.getComponent(MPSVcsManager.class); } public static class StubChangeListManagerGate implements ChangeListManagerGate { public StubChangeListManagerGate() { } @Override public FileStatus getStatus(File file) { return null; } @Override public void setDefaultChangeList(@NotNull String string) { } @Override public List<LocalChangeList> getListsCopy() { return null; } @Nullable @Override public LocalChangeList findChangeList(String name) { return null; } @Override public LocalChangeList addChangeList(String name, String comment) { return null; } @Override public LocalChangeList findOrCreateList(String name, String comment) { return null; } @Override public void editComment(String name, String comment) { } @Override public void editName(String oldName, String newName) { } @Override public void setListsToDisappear(Collection<String> names) { } @Override public FileStatus getStatus(VirtualFile virtualFile) { return FileStatus.NOT_CHANGED; } @Nullable public FileStatus getStatus(@NotNull FilePath path) { return FileStatus.NOT_CHANGED; } } private static class MyChangelistBuilder extends EmptyChangelistBuilder { private final VirtualFile myVirtualFile; private boolean myIsMergedWithConflict; public MyChangelistBuilder(VirtualFile vfile) { myVirtualFile = vfile; } @Override public void processChangeInList(Change change, @Nullable ChangeList changeList, VcsKey vcsKey) { processChange(change, vcsKey); } @Override public void processChangeInList(Change change, String changeListName, VcsKey vcsKey) { processChange(change, vcsKey); } @Override public void processChange(Change change, VcsKey vcsKey) { if (change.getFileStatus().equals(FileStatus.MERGED_WITH_CONFLICTS)) { ContentRevision contentRevision = change.getAfterRevision(); if (contentRevision != null) { if (contentRevision.getFile().getPresentableUrl().equals(myVirtualFile.getPresentableUrl())) { myIsMergedWithConflict = true; } } } } public boolean isInConflict() { return myIsMergedWithConflict; } } public class MyFileStatusListener implements FileStatusListener { private MyFileStatusListener() { } @Override public void fileStatusesChanged() { checkIfProjectIsConflicting(); } @Override public void fileStatusChanged(@NotNull VirtualFile file) { if (file.equals(myProject.getProjectFile())) { checkIfProjectIsConflicting(); } } } private static void check_2eqssr_a1a21(MessageBusConnection checkedDotOperand) { if (null != checkedDotOperand) { checkedDotOperand.disconnect(); } } }