IDEA-135768 Show remote branches in creating task dialog

This commit is contained in:
Dmitry Avdeev
2016-03-31 20:07:59 +03:00
parent d0e5819f7b
commit 9b40db2237
6 changed files with 27 additions and 13 deletions
@@ -58,7 +58,7 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
List<R> problems = ContainerUtil.filter(repositories, new Condition<R>() {
@Override
public boolean value(R repository) {
return hasBranch(repository, taskName);
return hasBranch(repository, new TaskInfo(taskName, Collections.emptyList()));
}
});
List<R> map = new ArrayList<R>();
@@ -95,7 +95,7 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
List<R> notFound = ContainerUtil.filter(repositories, new Condition<R>() {
@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<R extends Repository> extends VcsTaskHandl
return myRepositoryManager.isSyncEnabled();
}
@NotNull
@Override
public TaskInfo[] getCurrentTasks() {
List<R> repositories = myRepositoryManager.getRepositories();
@@ -201,5 +202,5 @@ public abstract class DvcsTaskHandler<R extends Repository> extends VcsTaskHandl
protected abstract void mergeAndClose(@NotNull String branch, @NotNull List<R> repositories);
protected abstract boolean hasBranch(@NotNull R repository, @NotNull String name);
protected abstract boolean hasBranch(@NotNull R repository, @NotNull TaskInfo name);
}
@@ -92,6 +92,7 @@ public abstract class VcsTaskHandler {
/**
* @return currently active (checked out) tasks (branches)
*/
@NotNull
public abstract TaskInfo[] getCurrentTasks();
/**
@@ -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<GitRepository> {
}
@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<TaskInfo> getAllBranches(@NotNull GitRepository repository) {
List<TaskInfo> list = ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function<GitBranch, TaskInfo>() {
GitBranchesCollection branches = repository.getBranches();
List<TaskInfo> list = ContainerUtil.map(branches.getLocalBranches(), new Function<GitBranch, TaskInfo>() {
@Override
public TaskInfo fun(GitBranch branch) {
return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl()));
}
});
list.addAll(ContainerUtil.map(repository.getBranches().getLocalBranches(), new Function<GitBranch, TaskInfo>() {
list.addAll(ContainerUtil.map(branches.getRemoteBranches(), new Function<GitBranch, TaskInfo>() {
@Override
public TaskInfo fun(GitBranch branch) {
return new TaskInfo(branch.getName(), Collections.singleton(repository.getPresentableUrl())) {
@@ -112,8 +112,8 @@ public class HgTaskHandler extends DvcsTaskHandler<HgRepository> {
}
@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
@@ -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();
@@ -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);
}
}