mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user