/*******************************************************************************
* Copyright (C) 2011, 2014 Jens Baumgart <jens.baumgart@sap.com> and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.egit.ui.test.stagview;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import org.eclipse.egit.core.JobFamilies;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.common.LocalRepositoryTestCase;
import org.eclipse.egit.ui.common.StagingViewTester;
import org.eclipse.egit.ui.internal.repository.RepositoriesView;
import org.eclipse.egit.ui.test.CommitMessageUtil;
import org.eclipse.egit.ui.test.TestUtil;
import org.eclipse.egit.ui.view.repositories.GitRepositoriesViewTestUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class StagingViewTest extends LocalRepositoryTestCase {
private static final GitRepositoriesViewTestUtils repoViewUtil = new GitRepositoriesViewTestUtils();
private File repositoryFile;
private Repository repository;
@Before
public void before() throws Exception {
repositoryFile = createProjectAndCommitToRepository();
repository = lookupRepository(repositoryFile);
TestUtil.configureTestCommitterAsUser(repository);
Activator.getDefault().getRepositoryUtil()
.addConfiguredRepository(repositoryFile);
selectRepositoryNode();
}
@After
public void after() {
Activator.getDefault().getRepositoryUtil().removeDir(repositoryFile);
}
@Test
public void testCommitSingleFile() throws Exception {
setContent("I have changed this");
StagingViewTester stagingViewTester = StagingViewTester
.openStagingView();
stagingViewTester.stageFile(FILE1_PATH);
stagingViewTester.setAuthor(TestUtil.TESTAUTHOR);
stagingViewTester.setCommitter(TestUtil.TESTCOMMITTER);
stagingViewTester.setCommitMessage("The new commit");
stagingViewTester.commit();
TestUtil.checkHeadCommit(repository, TestUtil.TESTAUTHOR,
TestUtil.TESTCOMMITTER, "The new commit");
}
@Test
public void testAmend() throws Exception {
RevCommit oldHeadCommit = TestUtil.getHeadCommit(repository);
commitOneFileChange("Yet another Change");
RevCommit headCommit = TestUtil.getHeadCommit(repository);
ObjectId headCommitId = headCommit.getId();
String changeId = CommitMessageUtil.extractChangeId(headCommit
.getFullMessage());
setContent("Changes over changes");
StagingViewTester stagingViewTester = StagingViewTester
.openStagingView();
stagingViewTester.stageFile(FILE1_PATH);
stagingViewTester.setAmend(true);
assertTrue(stagingViewTester.getCommitMessage().indexOf("Change-Id") > 0);
assertTrue(stagingViewTester.getCommitMessage()
.indexOf("Signed-off-by") > 0);
assertTrue(stagingViewTester.getSignedOff());
assertTrue(stagingViewTester.getInsertChangeId());
stagingViewTester.commit();
headCommit = TestUtil.getHeadCommit(repository);
if (headCommitId.equals(headCommit.getId()))
fail("There is no new commit");
assertEquals(oldHeadCommit, headCommit.getParent(0));
assertTrue(headCommit.getFullMessage().indexOf(changeId) > 0);
}
@Test
public void testMergeConflict() throws Exception {
Git git = new Git(repository);
git.checkout().setCreateBranch(true).setName("side").call();
commitOneFileChange("on side");
git.checkout().setName("master").call();
commitOneFileChange("on master");
git.merge().include(repository.getRef("side")).call();
assertEquals(RepositoryState.MERGING, repository.getRepositoryState());
StagingViewTester stagingView = StagingViewTester
.openStagingView();
assertEquals("", stagingView.getCommitMessage());
stagingView.assertCommitEnabled(false);
setContent("resolved");
stagingView.stageFile(FILE1_PATH);
assertEquals(RepositoryState.MERGING_RESOLVED,
repository.getRepositoryState());
String expectedMessage = "Merge branch 'side'";
assertThat(stagingView.getCommitMessage(), startsWith(expectedMessage));
stagingView.commit();
assertEquals(RepositoryState.SAFE, repository.getRepositoryState());
assertEquals(expectedMessage, TestUtil.getHeadCommit(repository)
.getShortMessage());
}
private void commitOneFileChange(String fileContent) throws Exception {
setContent(fileContent);
StagingViewTester stagingViewTester = StagingViewTester
.openStagingView();
stagingViewTester.stageFile(FILE1_PATH);
stagingViewTester.setAuthor(TestUtil.TESTAUTHOR);
stagingViewTester.setCommitter(TestUtil.TESTCOMMITTER);
stagingViewTester.setCommitMessage("Commit message");
stagingViewTester.setInsertChangeId(true);
stagingViewTester.setSignedOff(true);
String commitMessage = stagingViewTester.getCommitMessage();
assertTrue(commitMessage.indexOf("Change-Id") > 0);
assertTrue(commitMessage.indexOf("Signed-off-by") > 0);
stagingViewTester.commit();
}
private void setContent(String content) throws Exception {
setTestFileContent(content);
TestUtil.joinJobs(JobFamilies.INDEX_DIFF_CACHE_UPDATE);
}
private void selectRepositoryNode() throws Exception {
SWTBotView repositoriesView = TestUtil
.showView(RepositoriesView.VIEW_ID);
SWTBotTree tree = repositoriesView.bot().tree();
SWTBotTreeItem repoNode = repoViewUtil
.getRootItem(tree, repositoryFile);
repoNode.select();
}
}