vcs: replace calls to FileStatusManager with ChangeListManager.getStatus

FileStatusManager is used to paint files with different colors.
ChangeListManager is used to determine actual file status
(ex: whether file has non-empty history in vcs).

ex: ChangelistConflictFileStatusProvider can mess up with FileStatusManager
and ADDED files will be reported as ADDED_OUTSIDE, breaking status checks.
This commit is contained in:
Aleksey Pivovarov
2018-04-18 12:42:33 +03:00
parent 110317b1b7
commit d562dab64a
11 changed files with 56 additions and 41 deletions
@@ -6,7 +6,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import java.awt.Color;
import java.awt.*;
/**
* @author mike
@@ -16,6 +16,16 @@ public abstract class FileStatusManager {
return project.getComponent(FileStatusManager.class);
}
/**
* Returns color that is associated with passed file in vcs subsystem.
* <p>
* Users are discouraged from comparing returned value with a constant, because it might be vcs-specific (HgChangeProvider#RENAMED)
* or affected by other means (ChangelistConflictFileStatusProvider#MODIFIED_OUTSIDE).
*
* @See com.intellij.openapi.vcs.changes.ChangeListManager#getStatus
* @See com.intellij.openapi.vcs.FileStatusFactory
* @See com.intellij.openapi.vcs.impl.FileStatusProvider
*/
public abstract FileStatus getStatus(@NotNull VirtualFile file);
public abstract void fileStatusesChanged();
@@ -30,6 +40,11 @@ public abstract class FileStatusManager {
public abstract Color getNotChangedDirectoryColor(@NotNull VirtualFile file);
/**
* @See VcsConfiguration#SHOW_DIRTY_RECURSIVELY
* @See com.intellij.openapi.vcs.FileStatus#NOT_CHANGED_IMMEDIATE
* @See com.intellij.openapi.vcs.FileStatus#NOT_CHANGED_RECURSIVE
*/
@NotNull
public FileStatus getRecursiveStatus(@NotNull VirtualFile file) {
FileStatus status = getStatus(file);
@@ -271,7 +271,7 @@ public abstract class VcsVFSListener implements Disposable {
}
protected void processMovedFile(VirtualFile file, String newParentPath, String newName) {
final FileStatus status = FileStatusManager.getInstance(myProject).getStatus(file);
final FileStatus status = ChangeListManager.getInstance(myProject).getStatus(file);
LOG.debug("Checking moved file ", file, "; status=", status);
if (status == FileStatus.IGNORED) {
if (file.getParent() != null) {
@@ -267,7 +267,7 @@ public class AnnotateDiffViewerAction {
final AnnotationProvider annotationProvider = vcs.getAnnotationProvider();
if (annotationProvider == null) return null;
FileStatus fileStatus = FileStatusManager.getInstance(project).getStatus(file);
FileStatus fileStatus = ChangeListManager.getInstance(project).getStatus(file);
if (fileStatus == FileStatus.UNKNOWN || fileStatus == FileStatus.ADDED || fileStatus == FileStatus.IGNORED) {
return null;
}
@@ -33,6 +33,7 @@ import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.annotate.AnnotationProvider;
import com.intellij.openapi.vcs.annotate.FileAnnotation;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -58,7 +59,7 @@ public class AnnotateLocalFileAction {
final AnnotationProvider annotationProvider = vcs.getAnnotationProvider();
if (annotationProvider == null) return false;
final FileStatus fileStatus = FileStatusManager.getInstance(project).getStatus(file);
FileStatus fileStatus = ChangeListManager.getInstance(project).getStatus(file);
if (fileStatus == FileStatus.UNKNOWN || fileStatus == FileStatus.ADDED || fileStatus == FileStatus.IGNORED) {
return false;
}
@@ -88,7 +88,7 @@ public class CommonCheckinFilesAction extends AbstractCommonCheckinAction {
@Override
protected boolean approximatelyHasRoots(@NotNull VcsContext dataContext) {
FileStatusManager manager = FileStatusManager.getInstance(dataContext.getProject());
ChangeListManager manager = ChangeListManager.getInstance(dataContext.getProject());
return getRootsStream(dataContext)
.map(FilePath::getVirtualFile)
@@ -40,6 +40,7 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.ByteBackedContentRevision;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.ContentRevision;
import com.intellij.openapi.vcs.diff.DiffProvider;
import com.intellij.openapi.vcs.diff.ItemLatestState;
@@ -138,9 +139,8 @@ public abstract class DiffActionExecutor {
boolean inverted = false;
String title1;
String title2;
final FileStatus status = FileStatusManager.getInstance(myProject).getStatus(mySelectedFile);
if (status == null || FileStatus.NOT_CHANGED.equals(status) || FileStatus.UNKNOWN.equals(status) ||
FileStatus.IGNORED.equals(status)) {
final FileStatus status = ChangeListManager.getInstance(myProject).getStatus(mySelectedFile);
if (FileStatus.NOT_CHANGED.equals(status) || FileStatus.UNKNOWN.equals(status) || FileStatus.IGNORED.equals(status)) {
final VcsRevisionNumber currentRevision = myDiffProvider.getCurrentRevision(mySelectedFile);
inverted = revisionNumber.compareTo(currentRevision) > 0;
@@ -22,7 +22,11 @@ import com.intellij.openapi.fileEditor.FileEditorManagerEvent;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ui.update.MergingUpdateQueue;
import com.intellij.util.ui.update.Update;
@@ -71,7 +75,7 @@ public class AnnotationsPreloader {
}
if (!FileEditorManager.getInstance(myProject).isFileOpen(file)) return;
FileStatus fileStatus = FileStatusManager.getInstance(myProject).getStatus(file);
FileStatus fileStatus = ChangeListManager.getInstance(myProject).getStatus(file);
if (fileStatus == FileStatus.UNKNOWN || fileStatus == FileStatus.ADDED || fileStatus == FileStatus.IGNORED) {
return;
}
@@ -20,7 +20,6 @@ import com.intellij.ide.SelectInTarget;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager;
@@ -44,7 +43,7 @@ public class SelectInChangesViewTarget implements SelectInTarget, DumbAware {
@Override
public boolean canSelect(final SelectInContext context) {
final VirtualFile file = context.getVirtualFile();
FileStatus fileStatus = FileStatusManager.getInstance(myProject).getStatus(file);
FileStatus fileStatus = ChangeListManager.getInstance(myProject).getStatus(file);
return ProjectLevelVcsManager.getInstance(myProject).getAllActiveVcss().length != 0 &&
!fileStatus.equals(FileStatus.NOT_CHANGED);
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.ChangeListManagerImpl;
import com.intellij.openapi.vcs.changes.LocalChangeList;
import com.intellij.openapi.vcs.changes.ui.ChangesBrowserBase;
@@ -99,22 +100,22 @@ public class ScheduleForAdditionAction extends AnAction implements DumbAware {
@NotNull
private Stream<VirtualFile> getUnversionedFiles(@NotNull AnActionEvent e, @NotNull Project project) {
ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project);
FileStatusManager fileStatusManager = FileStatusManager.getInstance(project);
ChangeListManager changeListManager = ChangeListManager.getInstance(project);
boolean hasExplicitUnversioned = !isEmpty(e.getData(ChangesListView.UNVERSIONED_FILES_DATA_KEY));
return hasExplicitUnversioned
? e.getRequiredData(ChangesListView.UNVERSIONED_FILES_DATA_KEY)
: checkVirtualFiles(e)
? notNullize(e.getData(VcsDataKeys.VIRTUAL_FILE_STREAM)).filter(file -> isFileUnversioned(file, vcsManager, fileStatusManager))
? notNullize(e.getData(VcsDataKeys.VIRTUAL_FILE_STREAM)).filter(file -> isFileUnversioned(file, vcsManager, changeListManager))
: Stream.empty();
}
private boolean isFileUnversioned(@NotNull VirtualFile file,
@NotNull ProjectLevelVcsManager vcsManager,
@NotNull FileStatusManager fileStatusManager) {
@NotNull ChangeListManager changeListManager) {
AbstractVcs vcs = vcsManager.getVcsFor(file);
return vcs != null && !vcs.areDirectoriesVersionedItems() && file.isDirectory() ||
isStatusForAddition(fileStatusManager.getStatus(file));
isStatusForAddition(changeListManager.getStatus(file));
}
protected boolean isStatusForAddition(FileStatus status) {
@@ -17,7 +17,11 @@ package git4idea.diff;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vcs.*;
import com.intellij.openapi.vcs.CommittedChangesProvider;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.ContentRevision;
import com.intellij.openapi.vcs.diff.DiffMixin;
import com.intellij.openapi.vcs.diff.DiffProvider;
@@ -35,13 +39,10 @@ import git4idea.GitVcs;
import git4idea.history.GitFileHistory;
import git4idea.history.GitHistoryUtils;
import git4idea.i18n.GitBundle;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
/**
* Git diff provider
@@ -51,20 +52,7 @@ public class GitDiffProvider implements DiffProvider, DiffMixin {
* The context project
*/
private final Project myProject;
/**
* The status manager for the project
*/
private final FileStatusManager myStatusManager;
/**
*
*/
private static final Set<FileStatus> ourGoodStatuses;
static {
ourGoodStatuses = new THashSet<>();
ourGoodStatuses.addAll(
Arrays.asList(FileStatus.NOT_CHANGED, FileStatus.DELETED, FileStatus.MODIFIED, FileStatus.MERGE, FileStatus.MERGED_WITH_CONFLICTS));
}
private final ChangeListManager myChangeListManager;
/**
* A constructor
@@ -73,7 +61,7 @@ public class GitDiffProvider implements DiffProvider, DiffMixin {
*/
public GitDiffProvider(@NotNull Project project) {
myProject = project;
myStatusManager = FileStatusManager.getInstance(myProject);
myChangeListManager = ChangeListManager.getInstance(myProject);
}
/**
@@ -114,7 +102,7 @@ public class GitDiffProvider implements DiffProvider, DiffMixin {
if (file.isDirectory()) {
return null;
}
if (!ourGoodStatuses.contains(myStatusManager.getStatus(file))) {
if (!hasGoodFileStatus(file)) {
return null;
}
try {
@@ -125,6 +113,14 @@ public class GitDiffProvider implements DiffProvider, DiffMixin {
}
}
private boolean hasGoodFileStatus(VirtualFile file) {
FileStatus status = myChangeListManager.getStatus(file);
return status == FileStatus.NOT_CHANGED ||
status == FileStatus.DELETED ||
status == FileStatus.MODIFIED ||
status == FileStatus.MERGED_WITH_CONFLICTS;
}
/**
* {@inheritDoc}
*/
@@ -182,7 +178,7 @@ public class GitDiffProvider implements DiffProvider, DiffMixin {
}
final VirtualFile vf = filePath.getVirtualFile();
if (vf != null) {
if (! ourGoodStatuses.contains(myStatusManager.getStatus(vf))) {
if (!hasGoodFileStatus(vf)) {
return null;
}
}
@@ -15,8 +15,7 @@ package org.zmlx.hg4idea.action;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.vcsUtil.VcsUtil;
import org.zmlx.hg4idea.HgVcs;
@@ -27,8 +26,8 @@ import java.util.List;
public class HgMarkResolved extends HgAbstractFilesAction {
protected boolean isEnabled(Project project, HgVcs vcs, VirtualFile file) {
final FileStatus fileStatus = FileStatusManager.getInstance(project).getStatus(file);
return fileStatus != null && FileStatus.MERGED_WITH_CONFLICTS.equals(fileStatus);
final FileStatus fileStatus = ChangeListManager.getInstance(project).getStatus(file);
return FileStatus.MERGED_WITH_CONFLICTS.equals(fileStatus);
}
protected void batchPerform(Project project, HgVcs activeVcs,