diff options
Diffstat (limited to 'plugins/git4idea/src/git4idea/branch/GitBranchOperation.java')
-rw-r--r-- | plugins/git4idea/src/git4idea/branch/GitBranchOperation.java | 67 |
1 files changed, 63 insertions, 4 deletions
diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java index 7c2f77eeebd2..9147054ba7b9 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java +++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperation.java @@ -15,6 +15,7 @@ */ package git4idea.branch; +import com.intellij.dvcs.repo.RepositoryUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -25,6 +26,9 @@ import com.intellij.openapi.vcs.VcsNotifier; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; +import git4idea.GitLocalBranch; import git4idea.GitPlatformFacade; import git4idea.GitUtil; import git4idea.commands.Git; @@ -32,6 +36,7 @@ import git4idea.commands.GitMessageWithFilesDetector; import git4idea.config.GitVcsSettings; import git4idea.repo.GitRepository; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -50,7 +55,7 @@ abstract class GitBranchOperation { @NotNull protected final Git myGit; @NotNull protected final GitBranchUiHandler myUiHandler; @NotNull private final Collection<GitRepository> myRepositories; - @NotNull protected final String myCurrentBranchOrRev; + @NotNull protected final Map<GitRepository, String> myCurrentHeads; private final GitVcsSettings mySettings; @NotNull private final Collection<GitRepository> mySuccessfulRepositories; @@ -63,7 +68,13 @@ abstract class GitBranchOperation { myGit = git; myUiHandler = uiHandler; myRepositories = repositories; - myCurrentBranchOrRev = GitBranchUtil.getCurrentBranchOrRev(repositories); + myCurrentHeads = ContainerUtil.map2Map(repositories, new Function<GitRepository, Pair<GitRepository, String>>() { + @Override + public Pair<GitRepository, String> fun(GitRepository repository) { + GitLocalBranch currentBranch = repository.getCurrentBranch(); + return Pair.create(repository, currentBranch == null ? repository.getCurrentRevision() : currentBranch.getName()); + } + }); mySuccessfulRepositories = new ArrayList<GitRepository>(); myRemainingRepositories = new ArrayList<GitRepository>(myRepositories); mySettings = myFacade.getSettings(myProject); @@ -220,11 +231,28 @@ abstract class GitBranchOperation { protected void updateRecentBranch() { if (getRepositories().size() == 1) { GitRepository repository = myRepositories.iterator().next(); - mySettings.setRecentBranchOfRepository(repository.getRoot().getPath(), myCurrentBranchOrRev); + mySettings.setRecentBranchOfRepository(repository.getRoot().getPath(), myCurrentHeads.get(repository)); } else { - mySettings.setRecentCommonBranch(myCurrentBranchOrRev); + String recentCommonBranch = getRecentCommonBranch(); + if (recentCommonBranch != null) { + mySettings.setRecentCommonBranch(recentCommonBranch); + } + } + } + + @Nullable + private String getRecentCommonBranch() { + String recentCommonBranch = null; + for (String branch : myCurrentHeads.values()) { + if (recentCommonBranch == null) { + recentCommonBranch = branch; + } + else if (!recentCommonBranch.equals(branch)) { + return null; + } } + return recentCommonBranch; } private void showUnmergedFilesDialogWithRollback() { @@ -340,4 +368,35 @@ abstract class GitBranchOperation { return Pair.create(allConflictingRepositories, affectedChanges); } + + @NotNull + protected static String stringifyBranchesByRepos(@NotNull Map<GitRepository, String> heads) { + MultiMap<String, VirtualFile> grouped = groupByBranches(heads); + if (grouped.size() == 1) { + return grouped.keySet().iterator().next(); + } + return StringUtil.join(grouped.entrySet(), new Function<Map.Entry<String, Collection<VirtualFile>>, String>() { + @Override + public String fun(Map.Entry<String, Collection<VirtualFile>> entry) { + String roots = StringUtil.join(entry.getValue(), new Function<VirtualFile, String>() { + @Override + public String fun(VirtualFile file) { + return file.getName(); + } + }, ", "); + return entry.getKey() + " (in " + roots + ")"; + } + }, "<br/>"); + } + + @NotNull + private static MultiMap<String, VirtualFile> groupByBranches(@NotNull Map<GitRepository, String> heads) { + MultiMap<String, VirtualFile> result = MultiMap.createLinked(); + List<GitRepository> sortedRepos = RepositoryUtil.sortRepositories(heads.keySet()); + for (GitRepository repo : sortedRepos) { + result.putValue(heads.get(repo), repo.getRoot()); + } + return result; + } + } |