diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java index 7b2dd244b846..edd6f1352483 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java @@ -29,13 +29,11 @@ import com.intellij.util.NullableFunction; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FactoryMap; import com.intellij.util.containers.MultiMap; +import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; public abstract class DvcsTaskHandler extends VcsTaskHandler { @@ -153,16 +151,22 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl @Override public TaskInfo[] getAllExistingTasks() { List repositories = myRepositoryManager.getRepositories(); - MultiMap tasks = new MultiMap(); + MultiMap tasks = new MultiMap(); for (R repository : repositories) { - for (String branch : getAllBranches(repository)) { - tasks.putValue(branch, repository.getPresentableUrl()); + for (TaskInfo branch : getAllBranches(repository)) { + tasks.putValue(branch.getName(), branch); } } - return ContainerUtil.map2Array(tasks.entrySet(), TaskInfo.class, new Function>, TaskInfo>() { + return ContainerUtil.map2Array(tasks.entrySet(), TaskInfo.class, new Function>, TaskInfo>() { @Override - public TaskInfo fun(Map.Entry> entry) { - return new TaskInfo(entry.getKey(), entry.getValue()); + public TaskInfo fun(Map.Entry> entry) { + Set repositories = new HashSet(); + boolean remote = false; + for (TaskInfo info : entry.getValue()) { + remote |= info.isRemote(); + repositories.addAll(info.getRepositories()); + } + return new TaskInfo(entry.getKey(), repositories, remote); } }); } @@ -193,7 +197,7 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl protected abstract String getActiveBranch(R repository); @NotNull - protected abstract Iterable getAllBranches(@NotNull R repository); + protected abstract Iterable getAllBranches(@NotNull R repository); protected abstract void mergeAndClose(@NotNull String branch, @NotNull List repositories); diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java index 5c3b87a84d52..f52eb636869c 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java @@ -44,16 +44,24 @@ public abstract class VcsTaskHandler { private final String myBranch; private final Collection myRepositories; + private final boolean myRemote; public TaskInfo(String branch, Collection repositories) { + this(branch, repositories, false); + } + + public TaskInfo(String branch, Collection repositories, boolean remote) { myBranch = branch; myRepositories = repositories; + myRemote = remote; } public String getName() { return myBranch; } + public boolean isRemote() { return myRemote; } + public Collection getRepositories() { return myRepositories; } diff --git a/plugins/git4idea/src/git4idea/GitTaskHandler.java b/plugins/git4idea/src/git4idea/GitTaskHandler.java index f76413953a5b..dbd3e7a15b67 100644 --- a/plugins/git4idea/src/git4idea/GitTaskHandler.java +++ b/plugins/git4idea/src/git4idea/GitTaskHandler.java @@ -26,7 +26,7 @@ import git4idea.validators.GitRefNameValidator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -71,13 +71,25 @@ public class GitTaskHandler extends DvcsTaskHandler { @NotNull @Override - protected Collection getAllBranches(@NotNull GitRepository repository) { - return ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function() { + protected Iterable getAllBranches(@NotNull GitRepository repository) { + List list = ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function() { @Override - public String fun(GitLocalBranch branch) { - return branch.getName(); + public TaskInfo fun(GitBranch branch) { + return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl())); } }); + list.addAll(ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function() { + @Override + public TaskInfo fun(GitBranch branch) { + return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl())) { + @Override + public boolean isRemote() { + return true; + } + }; + } + })); + return list; } @Override diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java index 88d389bd870f..d4a8ecd01d85 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java @@ -22,6 +22,7 @@ import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.VcsNotifier; import com.intellij.openapi.vcs.update.UpdatedFiles; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +38,7 @@ import org.zmlx.hg4idea.util.HgErrorUtil; import org.zmlx.hg4idea.util.HgReferenceValidator; import org.zmlx.hg4idea.util.HgUtil; +import java.util.Collections; import java.util.List; public class HgTaskHandler extends DvcsTaskHandler { @@ -69,9 +71,16 @@ public class HgTaskHandler extends DvcsTaskHandler { @NotNull @Override - protected Iterable getAllBranches(@NotNull HgRepository repository) { + protected Iterable getAllBranches(@NotNull HgRepository repository) { //be careful with equality names of branches/bookmarks =( - return ContainerUtil.concat(HgUtil.getSortedNamesWithoutHashes(repository.getBookmarks()), repository.getOpenedBranches()); + Iterable names = + ContainerUtil.concat(HgUtil.getSortedNamesWithoutHashes(repository.getBookmarks()), repository.getOpenedBranches()); + return ContainerUtil.map(names, new Function() { + @Override + public TaskInfo fun(String s) { + return new TaskInfo(s, Collections.singleton(repository.getPresentableUrl())); + } + }); } @Override diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.form b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.form index f4bd674a212e..b15d2001772b 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.form +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.form @@ -68,7 +68,7 @@ - + diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.java index b8d4582d51b5..5fc9aae1b822 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/vcs/VcsOpenTaskPanel.java @@ -159,13 +159,13 @@ public class VcsOpenTaskPanel extends TaskDialogPanel { myTaskManager.createChangeList(localTask, myChangelistName.getText()); } if (myCreateBranch.isSelected()) { - VcsTaskHandler.TaskInfo item = (VcsTaskHandler.TaskInfo)myBranchFrom.getSelectedItem(); Runnable createBranch = new Runnable() { @Override public void run() { myTaskManager.createBranch(localTask, myPreviousTask, myBranchName.getText()); } }; + VcsTaskHandler.TaskInfo item = (VcsTaskHandler.TaskInfo)myBranchFrom.getSelectedItem(); if (item != null) { myVcsTaskHandler.switchToTask(item, createBranch); }