diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java index c7c6889c5750..35f821dd92a9 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/TaskManager.java @@ -66,6 +66,9 @@ public abstract class TaskManager { @NotNull public abstract LocalTask getActiveTask(); + @Nullable + public abstract LocalTask findTask(String id); + /** * Update issue cache asynchronously * @param onComplete callback to be invoked after updating diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepository.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepository.java index b7d259e1bcaf..a438ce266dd5 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepository.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepository.java @@ -20,11 +20,16 @@ import com.intellij.tasks.TaskRepository; import com.intellij.tasks.TaskRepositoryType; import com.intellij.util.xmlb.annotations.Tag; import com.intellij.util.xmlb.annotations.Transient; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author Dmitry Avdeev */ public abstract class BaseRepository extends TaskRepository { + private static final Pattern PATTERN = Pattern.compile("[A-Z]+\\-\\d+"); protected String myUsername = ""; protected String myPassword = ""; protected boolean myUseProxy; @@ -110,4 +115,10 @@ public abstract class BaseRepository extends TaskRepository { public void setUseHttpAuthentication(boolean useHttpAuthentication) { myUseHttpAuthentication = useHttpAuthentication; } + + @Nullable + public String extractId(String taskName) { + Matcher matcher = PATTERN.matcher(taskName); + return matcher.find() ? matcher.group() : null; + } } diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepositoryImpl.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepositoryImpl.java index a316b3a26fbe..7b9d70c0e2b8 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepositoryImpl.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/impl/BaseRepositoryImpl.java @@ -11,8 +11,6 @@ import org.jetbrains.annotations.Nullable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Base class for HTTP-based repositories. @@ -26,8 +24,6 @@ public abstract class BaseRepositoryImpl extends BaseRepository { Protocol.registerProtocol(EASY_HTTPS, new Protocol(EASY_HTTPS, (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443)); } - private static final Pattern PATTERN = Pattern.compile("[A-Z]+\\-\\d+"); - protected BaseRepositoryImpl() { } @@ -39,12 +35,6 @@ public abstract class BaseRepositoryImpl extends BaseRepository { super(other); } - @Nullable - public String extractId(String taskName) { - Matcher matcher = PATTERN.matcher(taskName); - return matcher.find() ? matcher.group() : null; - } - protected static String encodeUrl(String s) { try { return URLEncoder.encode(s, "UTF-8"); diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskCheckinHandlerFactory.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskCheckinHandlerFactory.java index e1c0f7214a88..77f4cf7f3115 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskCheckinHandlerFactory.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskCheckinHandlerFactory.java @@ -69,14 +69,17 @@ public class TaskCheckinHandlerFactory extends CheckinHandlerFactory { } @Nullable - private static Task findTask(String message, TaskManager manager) { + private static LocalTask findTask(String message, TaskManager manager) { TaskRepository[] repositories = manager.getAllRepositories(); for (TaskRepository repository : repositories) { String id = repository.extractId(message); + if (id == null) continue; + LocalTask localTask = manager.findTask(id); + if (localTask != null) return localTask; try { Task task = repository.findTask(id); if (task != null) { - return task; + return manager.addTask(task); } } catch (Exception ignore) { 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 74fb0ee91648..a4e1714c3822 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 @@ -226,6 +226,11 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe return myActiveTask; } + @Override + public LocalTask findTask(String id) { + return myTasks.get(id); + } + @Override public List getIssues(String query) { return getIssues(query, true); diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskManagerTestCase.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskManagerTestCase.java index 453c130d248f..9fe25eead4cb 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskManagerTestCase.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskManagerTestCase.java @@ -1,5 +1,6 @@ package com.intellij.tasks; +import com.intellij.tasks.impl.LocalTaskImpl; import com.intellij.tasks.impl.TaskManagerImpl; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; @@ -26,6 +27,10 @@ public abstract class TaskManagerTestCase extends LightCodeInsightFixtureTestCas @Override protected void tearDown() throws Exception { myManager.setRepositories(Collections.emptyList()); + LocalTaskImpl[] tasks = myManager.getLocalTasks(); + for (LocalTaskImpl task : tasks) { + myManager.removeTask(task); + } super.tearDown(); } } diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskVcsTest.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskVcsTest.java index 52d955f914c9..25f210f1c290 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskVcsTest.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TaskVcsTest.java @@ -16,10 +16,12 @@ package com.intellij.tasks; import com.intellij.openapi.vcs.ProjectLevelVcsManager; +import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vcs.changes.ChangeListManagerImpl; import com.intellij.openapi.vcs.changes.LocalChangeList; import com.intellij.openapi.vcs.changes.committed.MockAbstractVcs; +import com.intellij.openapi.vcs.changes.ui.CommitChangeListDialog; import com.intellij.openapi.vcs.impl.projectlevelman.AllVcses; import com.intellij.tasks.impl.LocalTaskImpl; import org.jetbrains.annotations.NotNull; @@ -70,6 +72,28 @@ public class TaskVcsTest extends TaskManagerTestCase { assertEquals("TEST-001 Summary 001 TEST", info.comment); } + public void testSaveContextOnCommit() throws Exception { + Task task = myRepository.findTask("TEST-001"); + assertNotNull(task); + myManager.activateTask(task, false, true); + + assertEquals(2, myManager.getLocalTasks().length); // default + new one + LocalTask localTask = myManager.getActiveTask(); + List changelists = myManager.getOpenChangelists(localTask); + + ChangeListInfo info = changelists.get(0); + LocalChangeList changeList = ChangeListManager.getInstance(getProject()).getChangeList(info.id); + assertNotNull(changeList); + assertEquals(changeList.getId(), localTask.getAssociatedChangelistId()); + + CommitChangeListDialog.commitChanges(getProject(), Collections.emptyList(), changeList, null, changeList.getName()); + + assertEquals(2, myManager.getLocalTasks().length); // no extra task created + + LocalTask associatedTask = myManager.getAssociatedTask(changeList); + assertNotNull(associatedTask); // association should survive + } + private ChangeListInfo createChangelist(Task task) { clearChangeLists(); LocalTaskImpl localTask = new LocalTaskImpl(task); diff --git a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TestRepository.java b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TestRepository.java index 98c1b5f364d1..7731a833aba5 100644 --- a/plugins/tasks/tasks-tests/test/com/intellij/tasks/TestRepository.java +++ b/plugins/tasks/tasks-tests/test/com/intellij/tasks/TestRepository.java @@ -43,11 +43,6 @@ class TestRepository extends BaseRepository { }); } - @Override - public String extractId(String taskName) { - return null; - } - @Override public boolean isConfigured() { return true;