blob: 8c035e26225547c8f0148dc13e2c38c0432835c7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Mathias Kinzler (SAP AG) - initial implementation
*******************************************************************************/
package org.eclipse.egit.ui.test.history;
import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withRegex;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
import static org.hamcrest.Matchers.emptyArray;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.core.RepositoryUtil;
import org.eclipse.egit.gitflow.op.InitOperation;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.history.RefFilterHelper;
import org.eclipse.egit.ui.internal.history.RefFilterHelper.RefFilter;
import org.eclipse.egit.ui.internal.repository.RepositoriesView;
import org.eclipse.egit.ui.test.ContextMenuHelper;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTestBase;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jgit.api.CheckoutCommand;
import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
import org.eclipse.jgit.api.FetchCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.PushCommand;
import org.eclipse.jgit.api.ResetCommand;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.TagCommand;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.team.ui.history.IHistoryView;
import org.eclipse.ui.PlatformUI;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(SWTBotJunit4ClassRunner.class)
public class HistoryViewTest extends GitRepositoriesViewTestBase {
private static final String SECONDFOLDER = "secondFolder";
private static final String ADDEDFILE = "another.txt";
private static final String ADDEDMESSAGE = "A new file in a new folder";
private int commitCount;
private File repoFile;
private RefFilterHelper refFilterHelper;
@Before
public void setupTests() throws Exception {
repoFile = createProjectAndCommitToRepository();
IProject prj = ResourcesPlugin.getWorkspace().getRoot()
.getProject(PROJ1);
IFolder folder2 = prj.getFolder(SECONDFOLDER);
folder2.create(false, true, null);
IFile addedFile = folder2.getFile(ADDEDFILE);
addedFile.create(
new ByteArrayInputStream(
"More content".getBytes(prj.getDefaultCharset())),
false, null);
addAndCommit(addedFile, ADDEDMESSAGE);
// TODO count the commits
commitCount = 3;
setupAdditionalCommits();
RepositoryUtil repositoryUtil = Activator.getDefault()
.getRepositoryUtil();
repositoryUtil.addConfiguredRepository(repoFile);
Repository repo = myRepoViewUtil.lookupRepository(repoFile);
refFilterHelper = new RefFilterHelper(repo);
refFilterHelper.setRefFilters(refFilterHelper.getDefaults());
refFilterHelper.resetLastSelectionStateToDefault();
}
private void checkout(Git git, String ref, boolean create)
throws Exception {
CheckoutCommand checkout = git.checkout();
checkout.setName(ref);
checkout.setCreateBranch(create);
checkout.setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM);
checkout.call();
}
private void commitNewFile(String fileName, String commitMsg)
throws Exception {
IProject prj = ResourcesPlugin.getWorkspace().getRoot()
.getProject(PROJ1);
IFile toCreate = prj.getFile(fileName);
toCreate.create(
new ByteArrayInputStream(
"Content".getBytes(prj.getDefaultCharset())),
false, null);
addAndCommit(toCreate, commitMsg);
}
private static void tag(Git git, String name) throws Exception {
TagCommand tag = git.tag();
tag.setName(name);
PersonIdent committer = new PersonIdent(TestUtil.TESTCOMMITTER_NAME,
TestUtil.TESTCOMMITTER_EMAIL);
tag.setTagger(committer);
Repository repo = git.getRepository();
RevCommit headCommit = repo.parseCommit(
repo.exactRef(Constants.HEAD).getLeaf().getObjectId());
tag.setObjectId(headCommit);
tag.call();
}
private void resetHard(Git git, String to) throws Exception {
ResetCommand reset = git.reset();
reset.setRef(to);
reset.setMode(ResetType.HARD);
reset.call();
}
private void push(Git git) throws Exception {
PushCommand push = git.push();
push.setPushAll();
push.call();
}
private void fetch(Git git) throws Exception {
FetchCommand fetch = git.fetch();
fetch.call();
}
private void setupAdditionalCommits() throws Exception {
Repository repo = myRepoViewUtil.lookupRepository(repoFile);
try (Git git = Git.wrap(repo)) {
createSimpleRemoteRepository(repoFile);
checkout(git, "master", false);
checkout(git, "testR", true);
commitNewFile("testR.txt", "testR");
push(git);
resetHard(git, "HEAD~");
checkout(git, "master", false);
checkout(git, "testD", true);
commitNewFile("testDa.txt", "testDa");
push(git);
fetch(git);
resetHard(git, "HEAD~");
commitNewFile("testDb.txt", "testDb");
checkout(git, "master", false);
checkout(git, "test1", true);
commitNewFile("test1.txt", "test1");
commitNewFile("test1t.txt", "test1t");
tag(git, "TEST1t");
resetHard(git, "HEAD~");
checkout(git, "master", false);
checkout(git, "test2", true);
commitNewFile("test2.txt", "test2");
checkout(git, "master", false);
checkout(git, "test12", true);
commitNewFile("test12.txt", "test12");
checkout(git, "master", false);
}
}
@Test
public void testOpenHistoryOnFileNoFilter() throws Exception {
initFilter(0);
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1).rowCount());
assertEquals("Wrong number of commits", commitCount - 1,
getHistoryViewTable(PROJ1, FOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount - 1,
getHistoryViewTable(PROJ1, FOLDER, FILE1).rowCount());
assertEquals("Wrong number of commits", 1,
getHistoryViewTable(PROJ1, FOLDER, FILE2).rowCount());
assertEquals("Wrong number of commits", 1,
getHistoryViewTable(PROJ1, SECONDFOLDER).rowCount());
assertEquals("Wrong number of commits", 1,
getHistoryViewTable(PROJ1, SECONDFOLDER, ADDEDFILE).rowCount());
assertEquals("Wrong number of commits", 1, getHistoryViewTable(PROJ2)
.rowCount());
assertEquals("Wrong commit message", ADDEDMESSAGE,
getHistoryViewTable(PROJ1, SECONDFOLDER, ADDEDFILE)
.getTableItem(0).getText(1));
assertEquals("Wrong commit message", "Initial commit",
getHistoryViewTable(PROJ1, FOLDER, FILE2).getTableItem(0)
.getText(1));
}
@Test
public void testOpenHistoryOnFileRepoFilter() throws Exception {
initFilter(1);
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER, FILE1).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER, FILE2).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, SECONDFOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, SECONDFOLDER, ADDEDFILE).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ2).rowCount());
}
@Test
public void testOpenHistoryOnFileProjectFilter() throws Exception {
initFilter(2);
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER, FILE1).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER, FILE2).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, SECONDFOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, SECONDFOLDER, ADDEDFILE).rowCount());
assertEquals("Wrong number of commits", 1, getHistoryViewTable(PROJ2)
.rowCount());
}
@Test
public void testOpenHistoryOnFileFolderFilter() throws Exception {
initFilter(3);
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, FOLDER).rowCount());
assertEquals("Wrong number of commits", commitCount - 1,
getHistoryViewTable(PROJ1, FOLDER, FILE1).rowCount());
assertEquals("Wrong number of commits", commitCount - 1,
getHistoryViewTable(PROJ1, FOLDER, FILE2).rowCount());
assertEquals("Wrong number of commits", commitCount,
getHistoryViewTable(PROJ1, SECONDFOLDER).rowCount());
assertEquals("Wrong number of commits", 1,
getHistoryViewTable(PROJ1, SECONDFOLDER, ADDEDFILE).rowCount());
assertEquals("Wrong number of commits", 1,
getHistoryViewTable(PROJ2).rowCount());
}
/**
* @param filter
* 0: none, 1: repository, 2: project, 3: folder
* @throws Exception
*/
private void initFilter(int filter) throws Exception {
getHistoryViewTable(PROJ1);
SWTBotView view = bot
.viewById(IHistoryView.VIEW_ID);
SWTBotMenu filterMenu = view
.viewMenu(UIText.GitHistoryPage_FilterSubMenuLabel);
switch (filter) {
case 0: {
SWTBotMenu checkedChild = filterMenu
.menu(new BaseMatcher<MenuItem>() {
@Override
public boolean matches(Object item) {
return item instanceof MenuItem
&& ((MenuItem) item).getSelection();
}
@Override
public void describeTo(Description description) {
description.appendText("Checked menu item");
}
}, true, 0);
if (checkedChild != null) {
checkedChild.click();
}
break;
}
case 1: {
SWTBotMenu repo = filterMenu
.menu(UIText.GitHistoryPage_AllInRepoMenuLabel);
if (!repo.isChecked())
repo.click();
break;
}
case 2: {
SWTBotMenu project = filterMenu
.menu(UIText.GitHistoryPage_AllInProjectMenuLabel);
if (!project.isChecked())
project.click();
break;
}
case 3: {
SWTBotMenu folder = filterMenu
.menu(UIText.GitHistoryPage_AllInParentMenuLabel);
if (!folder.isChecked())
folder.click();
break;
}
default:
break;
}
}
@Test
public void testOpenHistoryOnProject() throws Exception {
SWTBotTable table = getHistoryViewTable(PROJ1);
int rowCount = table.rowCount();
assertTrue(table.rowCount() > 0);
assertEquals("Initial commit",
table.getTableItem(rowCount - 1).getText(1));
}
@Test
public void testAddCommit() throws Exception {
String commitMessage = "The special commit";
int countBefore = getHistoryViewTable(PROJ1).rowCount();
touchAndSubmit(commitMessage);
int countAfter = getHistoryViewTable(PROJ1).rowCount();
assertEquals("Wrong number of entries", countBefore + 1, countAfter);
assertEquals("Wrong comit message", commitMessage,
getHistoryViewTable(PROJ1).getTableItem(0).getText(1));
}
private SWTBotTable getHistoryViewTable() throws Exception {
SWTBot historyView = getHistoryViewBot();
Job.getJobManager().join(JobFamilies.GENERATE_HISTORY, null);
historyView.getDisplay().syncExec(() -> {
// Join UI update triggered by GenerateHistoryJob
});
return historyView.table();
}
/**
* @param path
* must be length 2 or three (folder or file)
* @return the bale
* @throws Exception
*/
private SWTBotTable getHistoryViewTable(String... path) throws Exception {
SWTBotTree projectExplorerTree = TestUtil.getExplorerTree();
SWTBotTreeItem explorerItem;
SWTBotTreeItem projectItem = getProjectItem(projectExplorerTree, path[0]);
if (path.length == 1)
explorerItem = projectItem;
else if (path.length == 2)
explorerItem = TestUtil
.getChildNode(TestUtil.expandAndWait(projectItem), path[1]);
else {
SWTBotTreeItem childItem = TestUtil
.getChildNode(TestUtil.expandAndWait(projectItem), path[1]);
explorerItem = TestUtil
.getChildNode(TestUtil.expandAndWait(childItem), path[2]);
}
explorerItem.select();
ContextMenuHelper.clickContextMenuSync(projectExplorerTree, "Team",
"Show in History");
return getHistoryViewTable();
}
private SWTBotTable getFileDiffTable() throws Exception {
Job.getJobManager().join(JobFamilies.HISTORY_FILE_DIFF, null);
// Wait a little bit to give the UiJob triggered a chance to run
Thread.sleep(100);
PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
// Join the UI update
});
return getHistoryViewBot().table(1);
}
private SWTBot getHistoryViewBot() {
return TestUtil.showHistoryView().bot();
}
@Test
public void testSelectBranch() throws Exception {
SWTBotTable commitTable = getHistoryViewTable(PROJ1);
assertEquals("Unexpected number of commits", commitCount,
commitTable.rowCount());
// Current branch is "master". Create a new commit on a new branch, then
// switch back to master.
try (Git git = new Git(lookupRepository(repoFile))) {
git.checkout().setCreateBranch(true).setName("otherBranch").call();
TestUtil.waitForDecorations();
touchAndSubmit("Updated");
ObjectId otherCommit = git.getRepository().resolve("otherBranch");
Ref master = git.checkout().setName(Constants.MASTER).call();
assertNotNull("Branch is null", master.getLeaf().getObjectId());
assertNotEquals("Branch not switched", otherCommit,
master.getLeaf().getObjectId());
TestUtil.waitForDecorations();
// History table should not show otherCommit
commitTable = getHistoryViewTable();
assertEquals("Unexpected number of commits", commitCount,
commitTable.rowCount());
// Open git repo view, select "otherBranch".
SWTBotView view = TestUtil.showView(RepositoriesView.VIEW_ID);
TestUtil.joinJobs(JobFamilies.REPO_VIEW_REFRESH);
TestUtil.waitForDecorations();
SWTBotTree tree = view.bot().tree();
SWTBotTreeItem localBranches = myRepoViewUtil
.getLocalBranchesItem(tree, repoFile);
TestUtil.expandAndWait(localBranches).getNode("otherBranch")
.select();
ContextMenuHelper.clickContextMenuSync(tree, "Show In", "History");
// History table should show both branches
commitTable = getHistoryViewTable();
assertEquals("Unexpected number of commits", commitCount + 1,
commitTable.rowCount());
Table swtTable = commitTable.widget;
ObjectId[] firstId = { null };
swtTable.getDisplay().syncExec(() -> {
Object obj = swtTable.getItem(0).getData();
RevCommit c = Adapters.adapt(obj, RevCommit.class);
if (c != null) {
firstId[0] = c.getId();
}
});
assertEquals("Unexpected commit in table", otherCommit, firstId[0]);
}
}
@Test
public void testAddBranch() throws Exception {
Repository repo = lookupRepository(repoFile);
assertNull(repo.resolve(Constants.R_HEADS + "NewBranch"));
SWTBotTable table = getHistoryViewTable(PROJ1);
SWTBotTableItem item = table.getTableItem(0);
item.select();
ContextMenuHelper.clickContextMenu(table,
util.getPluginLocalizedValue("HistoryCreateBranch.label"));
SWTBotShell dialog = bot
.shell(UIText.CreateBranchWizard_NewBranchTitle);
dialog.bot().textWithId("BranchName").setText("NewBranch");
// for some reason, checkboxwithlabel doesn't seem to work
dialog.bot().checkBox().deselect();
dialog.bot().button(IDialogConstants.FINISH_LABEL).click();
TestUtil.joinJobs(JobFamilies.CHECKOUT);
assertNotNull(repo.resolve(Constants.R_HEADS + "NewBranch"));
}
@Test
public void testAddTag() throws Exception {
Repository repo = lookupRepository(repoFile);
assertNull(repo.resolve(Constants.R_TAGS + "NewTag"));
final SWTBotTable table = getHistoryViewTable(PROJ1);
table.getTableItem(0).select();
final RevCommit[] commit = new RevCommit[1];
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
TableItem tableItem = table.widget.getSelection()[0];
ensureTableItemLoaded(tableItem);
commit[0] = (RevCommit) tableItem.getData();
}
});
ContextMenuHelper.clickContextMenu(table,
util.getPluginLocalizedValue("HistoryCreateTag.label"));
SWTBotShell dialog = bot.shell(UIText.CreateTagDialog_NewTag);
dialog.bot().textWithLabel(UIText.CreateTagDialog_tagName)
.setText("NewTag");
dialog.bot().styledTextWithLabel(UIText.CreateTagDialog_tagMessage)
.setText("New Tag message");
dialog.bot().button(UIText.CreateTagDialog_CreateTagButton).click();
TestUtil.joinJobs(JobFamilies.TAG);
assertNotNull(repo.resolve(Constants.R_TAGS + "NewTag"));
}
@Test
public void testCheckOut() throws Exception {
Repository repo = lookupRepository(repoFile);
assertEquals(Constants.MASTER, repo.getBranch());
final SWTBotTable table = getHistoryViewTable(PROJ1);
// check out the second line
final RevCommit[] commit = checkoutLine(table, 1);
assertEquals(commit[0].getId().name(), repo.getBranch());
}
private String[] getCommitMsgsFromUi(final SWTBotTable table) {
int length = table.rowCount();
String[] result = new String[length];
for (int i = 0; i < length; i++) {
RevCommit commit = getCommitInLine(table, i)[0];
String msg = commit.getFullMessage();
// Want newest commit last.
result[length - (1 + i)] = msg;
}
return result;
}
private SWTBotMenu getFilterMenuItem(
SWTBotToolbarDropDownButton selectedRefs, String refFilter) {
return selectedRefs.menuItem(new TypeSafeMatcher<MenuItem>() {
@Override
public void describeTo(Description description) {
description.appendText(
"MenuItem for RefFilter \"" + refFilter + "\"");
}
@Override
protected boolean matchesSafely(MenuItem item) {
return item.getText().startsWith(refFilter);
}
});
}
private void uncheckRefFilter(SWTBotToolbarDropDownButton selectedRefs,
String refFilter) {
SWTBotMenu filter = getFilterMenuItem(selectedRefs, refFilter);
assertTrue("Expected " + refFilter + " to be checked",
filter.isChecked());
filter.click();
}
private void checkRefFilter(SWTBotToolbarDropDownButton selectedRefs,
String refFilter) {
SWTBotMenu filter = getFilterMenuItem(selectedRefs, refFilter);
assertTrue("Expected " + refFilter + " to be unchecked",
!filter.isChecked());
filter.click();
}
private void assertNoCommit(SWTBotTable table) {
bot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
return table.rowCount() == 0;
}
@Override
public String getFailureMessage() {
return "CommitGraphTable did not become empty";
}
});
assertThat("Expected no commit", getCommitMsgsFromUi(table),
emptyArray());
}
private void assertCommitsAfterBase(SWTBotTable table, String... commitMsgs)
throws Exception {
// There are three expected fixed commits, plus then the ones given in
// the parameter.
int expectedNumberOfCommits = commitMsgs.length + 3;
bot.waitUntil(new DefaultCondition() {
@Override
public boolean test() throws Exception {
return table.rowCount() == expectedNumberOfCommits;
}
@Override
public String getFailureMessage() {
return "CommitGraphTable did not get expected number of rows: "
+ expectedNumberOfCommits;
}
});
List<Matcher<? super String>> matchers = new ArrayList<>();
matchers.add(equalTo("Initial commit"));
matchers.add(startsWith("Touched at"));
matchers.add(equalTo("A new file in a new folder"));
for (String msg : commitMsgs) {
matchers.add(equalTo(msg));
}
assertThat("Expected different commits",
getCommitMsgsFromUi(table),
is(arrayContainingInAnyOrder(matchers)));
}
@Test
public void testSelectShownRefs() throws Exception {
Set<RefFilter> filters = refFilterHelper.getRefFilters();
filters.add(refFilterHelper.new RefFilter("refs/heads/test1"));
filters.add(refFilterHelper.new RefFilter("refs/heads/test?"));
filters.add(refFilterHelper.new RefFilter("refs/heads/test*"));
refFilterHelper.setRefFilters(filters);
Repository repo = myRepoViewUtil.lookupRepository(repoFile);
SWTBotTable table = getHistoryViewTable(PROJ1);
SWTBotView view = bot.viewById(IHistoryView.VIEW_ID);
SWTBotToolbarDropDownButton selectedRefs = (SWTBotToolbarDropDownButton) view
.toolbarButton(UIText.GitHistoryPage_showingHistoryOfHead);
try(Git git = Git.wrap(repo)) {
checkout(git, "testD", false);
}
assertCommitsAfterBase(table, "testDb");
uncheckRefFilter(selectedRefs, "HEAD");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/**/${git_branch}");
assertCommitsAfterBase(table, "testDa", "testDb");
uncheckRefFilter(selectedRefs, "refs/**/${git_branch}");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/heads/**");
assertCommitsAfterBase(table, "test1", "test2", "test12", "testDb");
uncheckRefFilter(selectedRefs, "refs/heads/**");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/remotes/**");
assertCommitsAfterBase(table, "testDa", "testR");
uncheckRefFilter(selectedRefs, "refs/remotes/**");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/tags/**");
assertCommitsAfterBase(table, "test1", "test1t");
uncheckRefFilter(selectedRefs, "refs/tags/**");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/heads/test1");
assertCommitsAfterBase(table, "test1");
uncheckRefFilter(selectedRefs, "refs/heads/test1");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/heads/test?");
assertCommitsAfterBase(table, "test1", "test2", "testDb");
uncheckRefFilter(selectedRefs, "refs/heads/test?");
assertNoCommit(table);
checkRefFilter(selectedRefs, "refs/heads/test*");
assertCommitsAfterBase(table, "test1", "test2", "test12", "testDb");
uncheckRefFilter(selectedRefs, "refs/heads/test*");
assertNoCommit(table);
}
@Test
public void testToggleShownRefs() throws Exception {
SWTBotTable table = getHistoryViewTable(PROJ1);
SWTBotView view = bot.viewById(IHistoryView.VIEW_ID);
SWTBotToolbarDropDownButton selectedRefs = (SWTBotToolbarDropDownButton) view
.toolbarButton(UIText.GitHistoryPage_showingHistoryOfHead);
checkRefFilter(selectedRefs, "refs/heads/**");
checkRefFilter(selectedRefs, "refs/remotes/**");
checkRefFilter(selectedRefs, "refs/tags/**");
assertCommitsAfterBase(table, "test1", "test2", "test12", "testDa",
"testDb", "test1t", "testR");
selectedRefs.click();
assertCommitsAfterBase(table);
uncheckRefFilter(selectedRefs, "HEAD");
assertNoCommit(table);
checkRefFilter(selectedRefs, "HEAD");
assertCommitsAfterBase(table);
selectedRefs.click();
assertCommitsAfterBase(table, "test1", "test2", "test12", "testDa",
"testDb", "test1t", "testR");
uncheckRefFilter(selectedRefs, "refs/heads/**");
uncheckRefFilter(selectedRefs, "refs/remotes/**");
uncheckRefFilter(selectedRefs, "refs/tags/**");
}
@Test
public void testOpenRefFilterDialogFromDropdown() throws Exception {
getHistoryViewTable(PROJ1); // Make sure the history view is visible
SWTBotView view = bot.viewById(IHistoryView.VIEW_ID);
SWTBotToolbarDropDownButton selectedRefs = (SWTBotToolbarDropDownButton) view
.toolbarButton(UIText.GitHistoryPage_showingHistoryOfHead);
selectedRefs.menuItem(UIText.GitHistoryPage_configureFilters).click();
// This will cause an exception if the dialog is not found
bot.shell(UIText.GitHistoryPage_filterRefDialog_dialogTitle).bot()
.button(IDialogConstants.OK_LABEL).click();
}
@Test
public void testOpenRefFilterDialogFromMenu() throws Exception {
getHistoryViewTable(PROJ1); // Make sure the history view is visible
SWTBotView view = bot.viewById(IHistoryView.VIEW_ID);
view.viewMenu(UIText.GitHistoryPage_configureFilters).click();
// This will cause an exception if the dialog is not found
bot.shell(UIText.GitHistoryPage_filterRefDialog_dialogTitle).bot()
.button(IDialogConstants.OK_LABEL).click();
}
@Test
public void testRevertFailure() throws Exception {
touchAndSubmit(null);
setTestFileContent("dirty in working directory"
+ System.currentTimeMillis());
final SWTBotTable table = getHistoryViewTable(PROJ1);
assertTrue(table.rowCount() > 0);
table.getTableItem(0).select();
final RevCommit[] commit = new RevCommit[1];
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
TableItem tableItem = table.widget.getSelection()[0];
ensureTableItemLoaded(tableItem);
commit[0] = (RevCommit) tableItem.getData();
}
});
assertEquals(1, commit[0].getParentCount());
ContextMenuHelper.clickContextMenu(table,
UIText.GitHistoryPage_revertMenuItem);
SWTBot dialog = bot.shell(UIText.RevertFailureDialog_Title).bot();
assertEquals(1, dialog.tree().rowCount());
assertEquals(1, dialog.tree().getAllItems()[0].rowCount());
assertTrue(dialog.tree().getAllItems()[0].getItems()[0].getText()
.startsWith(FILE1));
}
@Test
public void testOpenOfDeletedFile() throws Exception {
Git git = Git.wrap(lookupRepository(repoFile));
git.rm().addFilepattern(FILE1_PATH).call();
RevCommit commit = git.commit().setMessage("Delete file").call();
SWTBotTable commitsTable = getHistoryViewTable(PROJ1);
assertEquals(commitCount + 1, commitsTable.rowCount());
commitsTable.select(0);
SWTBotTable fileDiffTable = getFileDiffTable();
assertEquals(1, fileDiffTable.rowCount());
fileDiffTable.select(0);
assertFalse(fileDiffTable.contextMenu(
UIText.CommitFileDiffViewer_OpenInEditorMenuLabel).isEnabled());
fileDiffTable.contextMenu(
UIText.CommitFileDiffViewer_OpenPreviousInEditorMenuLabel)
.click();
// Editor for old file version should be opened
bot.editorByTitle(
FILE1 + " " + commit.getParent(0).getName().substring(0, 7));
}
@Test
public void testStartGitflowReleaseEnabled() throws Exception {
Repository repository = lookupRepository(repoFile);
new InitOperation(repository).execute(null);
final SWTBotTable table = getHistoryViewTable(PROJ1);
table.getTableItem(1).select();
String itemLabelRegex = NLS.bind(org.eclipse.egit.gitflow.ui.internal.
UIText.DynamicHistoryMenu_startGitflowReleaseFrom, ".*");
SWTBotMenu startReleaseMenu = table.contextMenu().menu(withRegex(itemLabelRegex),
true, 0);
assertTrue(startReleaseMenu.isEnabled());
}
@Test
@Ignore
public void testRebaseAlreadyUpToDate() throws Exception {
Repository repo = lookupRepository(repoFile);
Ref stable = repo.findRef("stable");
SWTBotTable table = getHistoryViewTable(PROJ1);
SWTBotTableItem stableItem = getTableItemWithId(table, stable.getObjectId());
stableItem.contextMenu(UIText.GitHistoryPage_rebaseMenuItem).click();
TestUtil.joinJobs(JobFamilies.REBASE);
}
private RevCommit[] getCommitInLine(SWTBotTable table, int line) {
table.getTableItem(line).select();
final RevCommit[] commit = new RevCommit[1];
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
TableItem tableItem = table.widget.getSelection()[0];
ensureTableItemLoaded(tableItem);
commit[0] = (RevCommit) tableItem.getData();
}
});
return commit;
}
private RevCommit[] checkoutLine(final SWTBotTable table, int line)
throws InterruptedException {
table.getTableItem(line).select();
final RevCommit[] commit = getCommitInLine(table, line);
ContextMenuHelper.clickContextMenuSync(table,
UIText.GitHistoryPage_CheckoutMenuLabel);
TestUtil.joinJobs(JobFamilies.CHECKOUT);
return commit;
}
/**
* Workaround to ensure that the TableItem of a SWT table with style
* SWT_VIRTUAL is loaded.
*
* @param item
*/
private static void ensureTableItemLoaded(TableItem item) {
item.setText(item.getText()); // TODO: is there a better solution?
}
private static SWTBotTableItem getTableItemWithId(SWTBotTable table,
ObjectId wantedId) {
for (int i = 0; i < table.rowCount(); i++) {
String id = table.cell(i, UIText.CommitGraphTable_CommitId);
String idWithoutEllipsis = id.substring(0, 7);
if (wantedId.getName().startsWith(idWithoutEllipsis))
return table.getTableItem(i);
}
throw new IllegalStateException("TableItem for commit with ID " + wantedId + " not found.");
}
}