IDEA-94306 UI freeze while making Git revert for many files

Don't call update() for each file, do it for each repository.
This commit is contained in:
Kirill Likhodedov
2012-11-08 14:54:44 +04:00
parent b667e35b3b
commit b5c14ebb29
4 changed files with 32 additions and 18 deletions
@@ -16,6 +16,8 @@
package git4idea;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
@@ -897,4 +899,28 @@ public class GitUtil {
return GitBranchUtil.getTrackInfoForBranch(repository, currentBranch);
}
@NotNull
public static Collection<GitRepository> getRepositoriesForFiles(@NotNull Project project, @NotNull Collection<VirtualFile> files) {
final GitRepositoryManager manager = getRepositoryManager(project);
com.google.common.base.Function<VirtualFile,GitRepository> ROOT_TO_REPO =
new com.google.common.base.Function<VirtualFile, GitRepository>() {
@Override
public GitRepository apply(@Nullable VirtualFile root) {
return root != null ? manager.getRepositoryForRoot(root) : null;
}
};
return Collections2.filter(Collections2.transform(sortFilesByGitRootsIgnoringOthers(files).keySet(), ROOT_TO_REPO),
Predicates.notNull());
}
@NotNull
public static Map<VirtualFile, List<VirtualFile>> sortFilesByGitRootsIgnoringOthers(@NotNull Collection<VirtualFile> files) {
try {
return sortFilesByGitRoot(files, true);
}
catch (VcsException e) {
LOG.error("Should never happen, since we passed 'ignore non-git' parameter", e);
return Collections.emptyMap();
}
}
}
@@ -70,11 +70,8 @@ public class GitResolveConflictsAction extends GitAction {
}
AbstractVcsHelper.getInstance(project).showMergeDialog(new ArrayList<VirtualFile>(conflictedFiles), GitVcs.getInstance(project).getMergeProvider());
for (VirtualFile conflictedFile : conflictedFiles) {
final GitRepository repo = GitUtil.getRepositoryManager(project).getRepositoryForFile(conflictedFile);
if (repo != null) {
repo.update();
}
for (GitRepository repository : GitUtil.getRepositoriesForFiles(project, conflictedFiles)) {
repository.update();
}
}
@@ -31,6 +31,7 @@ import git4idea.repo.GitRepository;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -50,11 +51,8 @@ public class GitRevert extends BasicAction {
}
}
RollbackChangesDialog.rollbackChanges(project, changes);
for (VirtualFile conflictedFile : affectedFiles) {
final GitRepository repo = GitUtil.getRepositoryManager(project).getRepositoryForFile(conflictedFile);
if (repo != null) {
repo.update();
}
for (GitRepository repository : GitUtil.getRepositoriesForFiles(project, Arrays.asList(affectedFiles))) {
repository.update();
}
return false;
}
@@ -19,7 +19,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicatorProvider;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.GitPlatformFacade;
import git4idea.GitUtil;
@@ -183,13 +182,7 @@ public class GitCrlfProblemsDetector {
@NotNull
private static Map<VirtualFile, List<VirtualFile>> sortFilesByRoots(@NotNull Collection<VirtualFile> files) {
try {
return GitUtil.sortFilesByGitRoot(files, true);
}
catch (VcsException e) {
LOG.error("Should never happen, since we passed 'ignore non-git' parameter", e);
return Collections.emptyMap();
}
return GitUtil.sortFilesByGitRootsIgnoringOthers(files);
}
public boolean shouldWarn() {