blob: 54c00c38b83ef11491f48ebf8d95d0cf9e4a6180 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.tasks.vcs;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsTaskHandler;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.tasks.BranchInfo;
import com.intellij.tasks.LocalTask;
import com.intellij.tasks.TaskManager;
import com.intellij.tasks.actions.OpenTaskDialog;
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;
import git4idea.config.GitVcsSettings;
import git4idea.repo.GitRepository;
import git4idea.test.GitExecutor;
import git4idea.test.GitTestUtil;
import git4idea.util.GitFileUtils;
import java.io.File;
import java.util.Collections;
import java.util.List;
/**
* @author Dmitry Avdeev
* Date: 18.07.13
*/
@SuppressWarnings("ConstantConditions")
public class TaskBranchesTest extends PlatformTestCase {
private TaskManagerImpl myTaskManager;
private ChangeListManagerImpl myChangeListManager;
private VcsDirtyScopeManagerImpl myDirtyScopeManager;
public void testGitTaskHandler() throws Exception {
List<GitRepository> repositories = initRepositories("community", "idea");
GitRepository repository = repositories.get(0);
assertEquals("master", repository.getCurrentBranch().getName());
VcsTaskHandler[] handlers = VcsTaskHandler.getAllHandlers(getProject());
assertEquals(1, handlers.length);
VcsTaskHandler handler = handlers[0];
VcsTaskHandler.TaskInfo defaultInfo = handler.getActiveTask();
final String first = "first";
VcsTaskHandler.TaskInfo firstInfo = handler.startNewTask(first);
assertEquals(2, repository.getBranches().getLocalBranches().size());
assertEquals(first, repository.getCurrentBranch().getName());
handler.switchToTask(defaultInfo, null);
assertEquals("master", repository.getCurrentBranch().getName());
final String second = "second";
VcsTaskHandler.TaskInfo secondInfo = handler.startNewTask(second);
assertEquals(3, repository.getBranches().getLocalBranches().size());
assertEquals(second, repository.getCurrentBranch().getName());
handler.closeTask(secondInfo, firstInfo);
repository.update();
assertEquals(2, repository.getBranches().getLocalBranches().size());
}
public void testTaskManager() throws Exception {
List<GitRepository> repositories = initRepositories("community", "idea");
LocalTask defaultTask = myTaskManager.getActiveTask();
assertNotNull(defaultTask);
LocalTaskImpl foo = myTaskManager.createLocalTask("foo");
LocalTask localTask = myTaskManager.activateTask(foo, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(localTask));
assertEquals(4, localTask.getBranches().size());
assertEquals(2, localTask.getBranches(true).size());
assertEquals(2, localTask.getBranches(false).size());
assertEquals(2, defaultTask.getBranches().size());
myTaskManager.activateTask(defaultTask, false);
GitRepository repository = repositories.get(0);
assertEquals("master", repository.getCurrentBranch().getName());
foo = myTaskManager.createLocalTask("foo");
localTask = myTaskManager.activateTask(foo, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(localTask));
assertEquals("foo", repository.getCurrentBranch().getName());
myTaskManager.mergeBranch(localTask);
repository.update();
assertEquals("master", repository.getCurrentBranch().getName());
assertEquals(1, repository.getBranches().getLocalBranches().size());
myTaskManager.activateTask(defaultTask, false);
myTaskManager.activateTask(foo, false);
}
public void testCommit() throws Exception {
GitRepository repository = initRepository("foo");
LocalTask defaultTask = myTaskManager.getActiveTask();
LocalTaskImpl foo = myTaskManager.createLocalTask("foo");
final LocalTask localTask = myTaskManager.activateTask(foo, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(localTask));
VirtualFile root = repository.getRoot();
File file = new File(root.getPath(), "foo.txt");
assertTrue(file.createNewFile());
final VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
GitFileUtils.addFiles(getProject(), root, virtualFile);
myDirtyScopeManager.fileDirty(virtualFile);
myChangeListManager.ensureUpToDate(false);
Change change = myChangeListManager.getChange(virtualFile);
assertNotNull(change);
ProjectLevelVcsManager.getInstance(getProject()).getAllActiveVcss()[0].getCheckinEnvironment()
.commit(Collections.singletonList(change), "foo");
myTaskManager.mergeBranch(localTask);
repository.update();
assertEquals("master", repository.getCurrentBranch().getName());
assertEquals(1, repository.getBranches().getLocalBranches().size());
}
public void testOpenTaskDialog() throws Exception {
initRepository("foo");
LocalTaskImpl task = myTaskManager.createLocalTask("foo");
OpenTaskDialog dialog = new OpenTaskDialog(getProject(), task);
Disposer.register(myTestRootDisposable, dialog.getDisposable());
dialog.createTask();
assertEquals("foo", myTaskManager.getActiveTask().getSummary());
List<BranchInfo> branches = task.getBranches(true);
assertEquals(1, branches.size());
assertEquals("master", branches.get(0).name);
branches = task.getBranches(false);
assertEquals(1, branches.size());
assertEquals("foo", branches.get(0).name);
}
public void testBranchBloating() throws Exception {
initRepository("foo");
LocalTask defaultTask = myTaskManager.getActiveTask();
assertNotNull(defaultTask);
assertEquals(0, defaultTask.getBranches().size());
LocalTaskImpl foo = myTaskManager.createLocalTask("foo");
LocalTask localTask = myTaskManager.activateTask(foo, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(localTask));
assertEquals(2, localTask.getBranches().size());
assertEquals(1, defaultTask.getBranches().size());
myTaskManager.activateTask(localTask, false);
LocalTaskImpl bar = myTaskManager.createLocalTask("bar");
LocalTask barTask = myTaskManager.activateTask(bar, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(barTask));
assertEquals(1, defaultTask.getBranches().size());
}
public void testCleanupRemovedBranch() {
GitRepository repository = initRepository("foo");
LocalTask defaultTask = myTaskManager.getActiveTask();
assertNotNull(defaultTask);
assertEquals(0, defaultTask.getBranches().size());
LocalTaskImpl foo = myTaskManager.createLocalTask("foo");
LocalTask localTask = myTaskManager.activateTask(foo, false);
myTaskManager.createBranch(localTask, defaultTask, myTaskManager.suggestBranchName(localTask));
assertEquals(2, localTask.getBranches().size());
assertEquals(1, defaultTask.getBranches().size());
// let's add non-existing branch
BranchInfo info = new BranchInfo();
info.name = "non-existing";
info.repository = defaultTask.getBranches().get(0).repository;
defaultTask.addBranch(info);
assertEquals("foo", repository.getCurrentBranch().getName());
myTaskManager.activateTask(defaultTask, false);
assertEquals("master", repository.getCurrentBranch().getName());
// do not re-create "non-existing"
assertEquals(2, repository.getBranches().getLocalBranches().size());
}
private List<GitRepository> initRepositories(String... names) {
return ContainerUtil.map(names, new Function<String, GitRepository>() {
@Override
public GitRepository fun(String s) {
return initRepository(s);
}
});
}
private GitRepository initRepository(String name) {
String tempDirectory = FileUtil.getTempDirectory();
String root = tempDirectory + "/" + name;
assertTrue(new File(root).mkdirs());
GitRepository repository = GitTestUtil.createRepository(getProject(), root);
GitBranchesCollection branches = repository.getBranches();
assertEquals(1, branches.getLocalBranches().size());
return repository;
}
@Override
protected void setUp() throws Exception {
super.setUp();
myTaskManager = (TaskManagerImpl)TaskManager.getManager(getProject());
GitVcsSettings.getInstance(myProject).getAppSettings().setPathToGit(GitExecutor.PathHolder.GIT_EXECUTABLE);
myChangeListManager = (ChangeListManagerImpl)ChangeListManager.getInstance(getProject());
myChangeListManager.projectOpened();
myDirtyScopeManager = ((VcsDirtyScopeManagerImpl)VcsDirtyScopeManager.getInstance(getProject()));
myDirtyScopeManager.projectOpened();
}
}