From 9b40db2237f61022faa1019a98ca1f53cccc811d Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 31 Mar 2016 20:07:00 +0300 Subject: [PATCH] IDEA-135768 Show remote branches in creating task dialog --- .../com/intellij/dvcs/branch/DvcsTaskHandler.java | 7 ++++--- .../com/intellij/openapi/vcs/VcsTaskHandler.java | 1 + plugins/git4idea/src/git4idea/GitTaskHandler.java | 13 +++++++++---- .../hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java | 4 ++-- .../tasks/actions/vcs/VcsOpenTaskPanel.java | 8 ++++---- .../com/intellij/tasks/impl/TaskManagerImpl.java | 7 +++++++ 6 files changed, 27 insertions(+), 13 deletions(-) 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 edd6f1352483..8ea268184d94 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/branch/DvcsTaskHandler.java @@ -58,7 +58,7 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl List problems = ContainerUtil.filter(repositories, new Condition() { @Override public boolean value(R repository) { - return hasBranch(repository, taskName); + return hasBranch(repository, new TaskInfo(taskName, Collections.emptyList())); } }); List map = new ArrayList(); @@ -95,7 +95,7 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl List notFound = ContainerUtil.filter(repositories, new Condition() { @Override public boolean value(R repository) { - return !hasBranch(repository, branchName); + return !hasBranch(repository, taskInfo); } }); if (!notFound.isEmpty()) { @@ -122,6 +122,7 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl return myRepositoryManager.isSyncEnabled(); } + @NotNull @Override public TaskInfo[] getCurrentTasks() { List repositories = myRepositoryManager.getRepositories(); @@ -201,5 +202,5 @@ public abstract class DvcsTaskHandler extends VcsTaskHandl protected abstract void mergeAndClose(@NotNull String branch, @NotNull List repositories); - protected abstract boolean hasBranch(@NotNull R repository, @NotNull String name); + protected abstract boolean hasBranch(@NotNull R repository, @NotNull TaskInfo name); } 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 f52eb636869c..182b978f0ecf 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java @@ -92,6 +92,7 @@ public abstract class VcsTaskHandler { /** * @return currently active (checked out) tasks (branches) */ + @NotNull public abstract TaskInfo[] getCurrentTasks(); /** diff --git a/plugins/git4idea/src/git4idea/GitTaskHandler.java b/plugins/git4idea/src/git4idea/GitTaskHandler.java index dbd3e7a15b67..1375ccfa0d68 100644 --- a/plugins/git4idea/src/git4idea/GitTaskHandler.java +++ b/plugins/git4idea/src/git4idea/GitTaskHandler.java @@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import git4idea.branch.GitBrancher; +import git4idea.branch.GitBranchesCollection; import git4idea.repo.GitRepository; import git4idea.repo.GitRepositoryManager; import git4idea.validators.GitRefNameValidator; @@ -65,20 +66,24 @@ public class GitTaskHandler extends DvcsTaskHandler { } @Override - protected boolean hasBranch(@NotNull GitRepository repository, @NotNull String name) { - return repository.getBranches().findLocalBranch(name) != null; + protected boolean hasBranch(@NotNull GitRepository repository, @NotNull TaskInfo info) { + GitBranchesCollection branches = repository.getBranches(); + return info.isRemote() ? + branches.getRemoteBranches().stream().anyMatch(branch -> info.getName().equals(branch.getName())) : + branches.findLocalBranch(info.getName()) != null; } @NotNull @Override protected Iterable getAllBranches(@NotNull GitRepository repository) { - List list = ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function() { + GitBranchesCollection branches = repository.getBranches(); + List list = ContainerUtil.map(branches.getLocalBranches(), new Function() { @Override public TaskInfo fun(GitBranch branch) { return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl())); } }); - list.addAll(ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function() { + list.addAll(ContainerUtil.map(branches.getRemoteBranches(), new Function() { @Override public TaskInfo fun(GitBranch branch) { return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl())) { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java index d4a8ecd01d85..1bab00c5d1bb 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgTaskHandler.java @@ -112,8 +112,8 @@ public class HgTaskHandler extends DvcsTaskHandler { } @Override - protected boolean hasBranch(@NotNull HgRepository repository, @NotNull String name) { - return HgUtil.getNamesWithoutHashes(repository.getBookmarks()).contains(name) || repository.getOpenedBranches().contains(name); + protected boolean hasBranch(@NotNull HgRepository repository, @NotNull TaskInfo name) { + return HgUtil.getNamesWithoutHashes(repository.getBookmarks()).contains(name.getName()) || repository.getOpenedBranches().contains(name.getName()); } @Override 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 7489561f546d..851d3eb02658 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,15 +159,15 @@ public class VcsOpenTaskPanel extends TaskDialogPanel { myTaskManager.createChangeList(localTask, myChangelistName.getText()); } if (myCreateBranch.isSelected()) { + VcsTaskHandler.TaskInfo branchFrom = (VcsTaskHandler.TaskInfo)myBranchFrom.getSelectedItem(); Runnable createBranch = new Runnable() { @Override public void run() { - myTaskManager.createBranch(localTask, myPreviousTask, myBranchName.getText()); + myTaskManager.createBranch(localTask, myPreviousTask, myBranchName.getText(), branchFrom); } }; - VcsTaskHandler.TaskInfo item = (VcsTaskHandler.TaskInfo)myBranchFrom.getSelectedItem(); - if (item != null) { - myVcsTaskHandler.switchToTask(item, createBranch); + if (branchFrom != null) { + myVcsTaskHandler.switchToTask(branchFrom, createBranch); } else { createBranch.run(); diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java index 0e4dcbb39761..e8dc810fa9a3 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java @@ -451,6 +451,10 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe } public void createBranch(LocalTask task, LocalTask previousActive, String name) { + createBranch(task, previousActive, name, null); + } + + public void createBranch(LocalTask task, LocalTask previousActive, String name, @Nullable VcsTaskHandler.TaskInfo branchFrom) { VcsTaskHandler[] handlers = VcsTaskHandler.getAllHandlers(myProject); for (VcsTaskHandler handler : handlers) { VcsTaskHandler.TaskInfo[] info = handler.getCurrentTasks(); @@ -458,6 +462,9 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe addBranches(previousActive, info, false); } addBranches(task, info, true); + if (info.length == 0 && branchFrom != null) { + addBranches(task, new VcsTaskHandler.TaskInfo[] { branchFrom }, true); + } addBranches(task, new VcsTaskHandler.TaskInfo[] { handler.startNewTask(name) }, false); } }