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 e002daf48429..34fdd62da731 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/VcsTaskHandler.java @@ -44,7 +44,7 @@ public abstract class VcsTaskHandler { public abstract void switchToTask(TaskInfo taskInfo); - public abstract void closeTask(TaskInfo taskInfo); + public abstract void closeTask(TaskInfo taskInfo, TaskInfo original); public abstract TaskInfo getActiveTask(); } diff --git a/plugins/git4idea/src/git4idea/GitTaskHandler.java b/plugins/git4idea/src/git4idea/GitTaskHandler.java index a3d6796c024c..266981aee744 100644 --- a/plugins/git4idea/src/git4idea/GitTaskHandler.java +++ b/plugins/git4idea/src/git4idea/GitTaskHandler.java @@ -32,6 +32,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; /** * @author Dmitry Avdeev @@ -98,10 +100,25 @@ public class GitTaskHandler extends VcsTaskHandler { } @Override - public void closeTask(TaskInfo taskInfo) { + public void closeTask(final TaskInfo taskInfo, TaskInfo original) { - for (String branchName : taskInfo.branches.keySet()) { - myBrancher.merge(branchName, GitBrancher.DeleteOnMergeOption.DELETE, getRepositories(taskInfo.branches.get(branchName))); + Set branches = original.branches.keySet(); + final AtomicInteger counter = new AtomicInteger(branches.size()); + for (final String originalBranch : branches) { + myBrancher.checkout(originalBranch, getRepositories(original.branches.get(originalBranch)), new Runnable() { + @Override + public void run() { + if (counter.decrementAndGet() == 0) { + merge(taskInfo); + } + } + }); + } + } + + private void merge(TaskInfo taskInfo) { + for (String featureBranch : taskInfo.branches.keySet()) { + myBrancher.merge(featureBranch, GitBrancher.DeleteOnMergeOption.DELETE, getRepositories(taskInfo.branches.get(featureBranch))); } } diff --git a/plugins/git4idea/src/git4idea/branch/GitBrancherImpl.java b/plugins/git4idea/src/git4idea/branch/GitBrancherImpl.java index e1f57c387987..5dcdea4aa994 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBrancherImpl.java +++ b/plugins/git4idea/src/git4idea/branch/GitBrancherImpl.java @@ -146,7 +146,12 @@ class GitBrancherImpl implements GitBrancher { execute(indicator); if (myCallInAwtAfterExecution != null) { Application application = ApplicationManager.getApplication(); - application.invokeLater(myCallInAwtAfterExecution, application.getDefaultModalityState()); + if (application.isUnitTestMode()) { + myCallInAwtAfterExecution.run(); + } + else { + application.invokeLater(myCallInAwtAfterExecution, application.getDefaultModalityState()); + } } } 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 469cf140e35b..d0149d4d89af 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 @@ -411,8 +411,7 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe VcsTaskHandler[] handlers = VcsTaskHandler.getAllHandlers(myProject); for (VcsTaskHandler handler : handlers) { - handler.switchToTask(original); - handler.closeTask(feature); + handler.closeTask(feature, original); } } diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskBranchesTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskBranchesTest.java index 696ea71a2345..519a3f6b300d 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskBranchesTest.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/vcs/TaskBranchesTest.java @@ -18,8 +18,10 @@ package com.intellij.tasks.vcs; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vcs.VcsTaskHandler; import com.intellij.tasks.LocalTask; -import com.intellij.tasks.TaskManagerTestCase; +import com.intellij.tasks.TaskManager; import com.intellij.tasks.impl.LocalTaskImpl; +import com.intellij.tasks.impl.TaskManagerImpl; +import com.intellij.testFramework.PlatformTestCase; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import git4idea.branch.GitBranchesCollection; @@ -34,10 +36,11 @@ import java.util.List; * Date: 18.07.13 */ @SuppressWarnings("ConstantConditions") -public class TaskBranchesTest extends TaskManagerTestCase { +public class TaskBranchesTest extends PlatformTestCase { - // todo re-enable - public void _testGitTaskHandler() throws Exception { + private TaskManagerImpl myTaskManager; + + public void testGitTaskHandler() throws Exception { List repositories = initRepositories("community", "idea"); GitRepository repository = repositories.get(0); @@ -61,10 +64,8 @@ public class TaskBranchesTest extends TaskManagerTestCase { assertEquals(3, repository.getBranches().getLocalBranches().size()); assertEquals(second, repository.getCurrentBranch().getName()); - handler.switchToTask(firstInfo); - assertEquals(first, repository.getCurrentBranch().getName()); - - handler.closeTask(secondInfo); + handler.closeTask(secondInfo, firstInfo); + repository.update(); assertEquals(2, repository.getBranches().getLocalBranches().size()); } @@ -113,4 +114,10 @@ public class TaskBranchesTest extends TaskManagerTestCase { assertEquals(1, branches.getLocalBranches().size()); return repository; } + + @Override + protected void setUp() throws Exception { + super.setUp(); + myTaskManager = (TaskManagerImpl)TaskManager.getManager(getProject()); + } }