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