diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index 606ef6ef95c7..08cdf298f135 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -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 getRepositoriesForFiles(@NotNull Project project, @NotNull Collection files) { + final GitRepositoryManager manager = getRepositoryManager(project); + com.google.common.base.Function ROOT_TO_REPO = + new com.google.common.base.Function() { + @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> sortFilesByGitRootsIgnoringOthers(@NotNull Collection 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(); + } + } } diff --git a/plugins/git4idea/src/git4idea/actions/GitResolveConflictsAction.java b/plugins/git4idea/src/git4idea/actions/GitResolveConflictsAction.java index 7363ecfe9383..5e73bfe23d21 100644 --- a/plugins/git4idea/src/git4idea/actions/GitResolveConflictsAction.java +++ b/plugins/git4idea/src/git4idea/actions/GitResolveConflictsAction.java @@ -70,11 +70,8 @@ public class GitResolveConflictsAction extends GitAction { } AbstractVcsHelper.getInstance(project).showMergeDialog(new ArrayList(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(); } } diff --git a/plugins/git4idea/src/git4idea/actions/GitRevert.java b/plugins/git4idea/src/git4idea/actions/GitRevert.java index 9be9e657b2c0..abf85585deda 100644 --- a/plugins/git4idea/src/git4idea/actions/GitRevert.java +++ b/plugins/git4idea/src/git4idea/actions/GitRevert.java @@ -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; } diff --git a/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java b/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java index 1b1660bb8a3d..68bb3a11578f 100644 --- a/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java +++ b/plugins/git4idea/src/git4idea/crlf/GitCrlfProblemsDetector.java @@ -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> sortFilesByRoots(@NotNull Collection 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() {