diff options
Diffstat (limited to 'org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow')
18 files changed, 1252 insertions, 0 deletions
diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/BranchNameValidatorTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/BranchNameValidatorTest.java new file mode 100644 index 0000000000..1aed342b0c --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/BranchNameValidatorTest.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow; + +import static org.eclipse.egit.gitflow.BranchNameValidator.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.eclipse.egit.gitflow.op.AbstractGitFlowOperationTest; +import org.eclipse.egit.gitflow.op.FeatureStartOperation; +import org.eclipse.egit.gitflow.op.InitOperation; +import org.eclipse.egit.gitflow.op.ReleaseStartOperation; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class BranchNameValidatorTest extends AbstractGitFlowOperationTest { + + @Test + public void testFeatureExists() throws Exception { + testRepository + .createInitialCommit("testInitOperation\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + + assertTrue(featureExists(gfRepo, MY_FEATURE)); + } + + @Test + public void testReleaseExists() throws Exception { + testRepository + .createInitialCommit("testInitOperation\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + assertTrue(releaseExists(gfRepo, MY_RELEASE)); + } + + @Test + public void testBranchNotExists() throws Exception { + testRepository + .createInitialCommit("testInitOperation\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + assertFalse(releaseExists(gfRepo, "notThere")); + } + + @Test + public void testBranchNameValid() throws Exception { + assertTrue(isBranchNameValid(MY_RELEASE)); + assertTrue(isBranchNameValid(MY_FEATURE)); + assertFalse(isBranchNameValid("/")); + assertFalse(isBranchNameValid("")); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryConfigTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryConfigTest.java new file mode 100644 index 0000000000..c51b7e0fdb --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryConfigTest.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.eclipse.egit.gitflow.op.AbstractDualRepositoryTestCase; +import org.eclipse.egit.gitflow.op.InitOperation; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class GitFlowRepositoryConfigTest extends AbstractDualRepositoryTestCase { + @Test + public void testIsInitialized() throws Exception { + repository1 + .createInitialCommit("testIsInitialized\n\nfirst commit\n"); + + Repository repository = repository2.getRepository(); + GitFlowConfig gitFlowConfig = new GitFlowConfig(repository); + + assertFalse(gitFlowConfig.isInitialized()); + + new InitOperation(repository).execute(null); + + assertTrue(gitFlowConfig.isInitialized()); + } + + @Test + public void testHasDefaultRemote() throws Exception { + repository1 + .createInitialCommit("testHasDefaultRemote\n\nfirst commit\n"); + + Repository repository = repository1.getRepository(); + GitFlowConfig gitFlowConfig = new GitFlowConfig(repository); + + assertFalse(gitFlowConfig.hasDefaultRemote()); + + GitFlowConfig gitFlowConfig2 = new GitFlowConfig(repository2.getRepository()); + assertTrue(gitFlowConfig2.hasDefaultRemote()); + } + +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java new file mode 100644 index 0000000000..62a8fab98e --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow; + +import static org.eclipse.egit.gitflow.GitFlowDefaults.DEVELOP; +import static org.eclipse.egit.gitflow.GitFlowDefaults.FEATURE_PREFIX; +import static org.eclipse.egit.gitflow.GitFlowDefaults.HOTFIX_PREFIX; +import static org.eclipse.egit.gitflow.GitFlowDefaults.RELEASE_PREFIX; +import static org.eclipse.egit.gitflow.GitFlowDefaults.VERSION_TAG; +import static org.eclipse.jgit.lib.Constants.R_HEADS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.eclipse.egit.gitflow.op.AbstractDualRepositoryTestCase; +import org.eclipse.egit.gitflow.op.FeatureStartOperation; +import org.eclipse.egit.gitflow.op.HotfixStartOperation; +import org.eclipse.egit.gitflow.op.InitOperation; +import org.eclipse.egit.gitflow.op.ReleaseFinishOperation; +import org.eclipse.egit.gitflow.op.ReleaseStartOperation; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class GitFlowRepositoryTest extends AbstractDualRepositoryTestCase { + @Test + public void testIsMaster() throws Exception { + repository1.createInitialCommit("testIsMaster\n\nfirst commit\n"); + + Repository repository = repository2.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + assertTrue(gfRepo.isMaster()); + + new InitOperation(repository).execute(null); + + assertFalse(gfRepo.isMaster()); + } + + @Test + public void testGetFeatureBranches() throws Exception { + repository1 + .createInitialCommit("testGetFeatureBranches\n\nfirst commit\n"); + + Repository repository = repository1.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new InitOperation(repository).execute(null); + + assertTrue(gfRepo.getFeatureBranches().isEmpty()); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + + assertEquals(R_HEADS + gfRepo.getConfig().getFeaturePrefix() + + MY_FEATURE, gfRepo.getFeatureBranches().get(0).getName()); + } + + @Test + public void testGetReleaseBranches() throws Exception { + repository1 + .createInitialCommit("testGetReleaseBranches\n\nfirst commit\n"); + + Repository repository = repository1.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new InitOperation(repository).execute(null); + + assertTrue(gfRepo.getReleaseBranches().isEmpty()); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + assertEquals(R_HEADS + gfRepo.getConfig().getReleasePrefix() + + MY_RELEASE, gfRepo.getReleaseBranches().get(0).getName()); + } + + @Test + public void testGetHotfixBranches() throws Exception { + repository1 + .createInitialCommit("testGetHotfixBranches\n\nfirst commit\n"); + + Repository repository = repository1.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new InitOperation(repository).execute(null); + + assertTrue(gfRepo.getHotfixBranches().isEmpty()); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + new ReleaseFinishOperation(gfRepo, MY_RELEASE).execute(null); + new HotfixStartOperation(gfRepo, MY_HOTFIX).execute(null); + + assertEquals( + R_HEADS + gfRepo.getConfig().getHotfixPrefix() + MY_HOTFIX, + gfRepo.getHotfixBranches().get(0).getName()); + } + + @Test + public void testGetFeatureBranchName() throws Exception { + repository1 + .createInitialCommit("testGetFeatureBranchName\n\nfirst commit\n"); + + Repository repository = repository1.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new InitOperation(repository, DEVELOP, GitFlowDefaults.MASTER, + FEATURE_PREFIX, RELEASE_PREFIX, HOTFIX_PREFIX, VERSION_TAG) + .execute(null); + + assertTrue(gfRepo.getFeatureBranches().isEmpty()); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + + Ref actualFeatureRef = repository.getRef(R_HEADS + + gfRepo.getConfig().getFeaturePrefix() + MY_FEATURE); + assertEquals(MY_FEATURE, gfRepo.getFeatureBranchName(actualFeatureRef)); + } + +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java new file mode 100644 index 0000000000..0d7bd1d9f6 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME; +import static org.eclipse.jgit.lib.Constants.DOT_GIT; +import static org.eclipse.jgit.lib.Constants.HEAD; +import static org.eclipse.jgit.lib.Constants.R_HEADS; +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.egit.core.Activator; +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.core.op.CloneOperation; +import org.eclipse.egit.core.test.DualRepositoryTestCase; +import org.eclipse.egit.core.test.TestRepository; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.errors.RevisionSyntaxException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.transport.URIish; +import org.junit.Before; + +public class AbstractDualRepositoryTestCase extends DualRepositoryTestCase { + protected static final String MY_FEATURE = "myFeature"; + + protected static final String MY_MASTER = "master"; + + protected static final String MY_RELEASE = "myRelease"; + + protected static final String MY_VERSION_TAG = "v"; + + protected static final String MY_HOTFIX = "myHotfix"; + + private File workdir; + + private File workdir2; + + String projectName = "FeaturePublishTest"; + + @Override + @Before + public void beforeTestCase() throws Exception { + workdir = testUtils.createTempDir("Repository1"); + workdir2 = testUtils.createTempDir("Repository2"); + + repository1 = new TestRepository(new File(workdir, DOT_GIT)); + + repository1.createInitialCommit("setUp"); + + Repository repository = repository1.getRepository(); + new InitOperation(repository).execute(null); + + // now we create a project in repo1 + IProject project = testUtils.createProjectInLocalFileSystem(workdir, + projectName); + testUtils.addFileToProject(project, "folder1/file1.txt", "Hello world"); + + repository1.connect(project); + repository1.trackAllFiles(project); + repository1.commit("Initial commit"); + + // let's get rid of the project + project.delete(false, false, null); + + // let's clone repository1 to repository2 + URIish uri = repository1.getUri(); + CloneOperation clop = new CloneOperation(uri, true, null, workdir2, + R_HEADS + MY_MASTER, DEFAULT_REMOTE_NAME, 0); + clop.run(null); + + Repository repo2 = Activator.getDefault().getRepositoryCache() + .lookupRepository(new File(workdir2, DOT_GIT)); + repository2 = new TestRepository(repo2); + new InitOperation(repository).execute(null); + } + + protected void assertCommitArrivedAtRemote(RevCommit branchCommit, + Repository remote) throws CoreException { + GitFlowRepository gfRepo = new GitFlowRepository(remote); + BranchOperation checkoutOperation = new BranchOperation(remote, + gfRepo.getConfig().getFullFeatureBranchName(MY_FEATURE)); + checkoutOperation.execute(null); + RevCommit developHead = findHead(remote); + assertEquals(branchCommit, developHead); + } + + protected RevCommit findHead(Repository repo) { + try (RevWalk walk = new RevWalk(repo)) { + try { + ObjectId head = repo.resolve(HEAD); + return walk.parseCommit(head); + } catch (RevisionSyntaxException | IOException e) { + throw new RuntimeException(e); + } + } + } + + protected String getRemoteName(GitFlowRepository gfRepo, String featureName) { + return gfRepo.getConfig().getRemoteName(featureName); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractFeatureOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractFeatureOperationTest.java new file mode 100644 index 0000000000..5d2bc10b5a --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractFeatureOperationTest.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.Repository; + +abstract public class AbstractFeatureOperationTest extends + AbstractGitFlowOperationTest { + + protected GitFlowRepository init(String initalCommit) throws Exception { + testRepository.createInitialCommit(initalCommit); + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + return new GitFlowRepository(repository); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractGitFlowOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractGitFlowOperationTest.java new file mode 100644 index 0000000000..bd89a7e558 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractGitFlowOperationTest.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.jgit.lib.Constants.DOT_GIT; +import static org.eclipse.jgit.lib.Constants.R_HEADS; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import org.eclipse.core.resources.IFile; +import org.eclipse.egit.core.test.GitTestCase; +import org.eclipse.egit.core.test.TestRepository; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; +import org.junit.After; +import org.junit.Before; + +abstract public class AbstractGitFlowOperationTest extends GitTestCase { + protected TestRepository testRepository; + + protected static final String MY_FEATURE = "myFeature"; + + protected static final String MY_RELEASE = "myRelease"; + + protected static final String MY_VERSION_TAG = "v"; + + protected static final String MY_MASTER = "master"; + + protected static final String MY_HOTFIX = "myHotfix"; + + @Before + public void setUp() throws Exception { + super.setUp(); + gitDir = new File(project.getProject().getLocationURI().getPath(), + DOT_GIT); + testRepository = new TestRepository(gitDir); + testRepository.connect(project.getProject()); + } + + @After + public void tearDown() throws Exception { + testRepository.dispose(); + super.tearDown(); + } + + protected Ref findBranch(Repository repository, String branchName) + throws IOException { + return repository.getRef(R_HEADS + branchName); + } + + protected RevCommit parseCommit(Repository repo, AnyObjectId id) + throws MissingObjectException, IncorrectObjectTypeException, + IOException { + try (RevWalk revWalk = new RevWalk(repo)) { + return revWalk.parseCommit(id); + } + } + + protected RevCommit addFileAndCommit(String fileName, String commitMessage) + throws Exception, UnsupportedEncodingException { + IFile file = project.createFile(fileName, + "Hello, world".getBytes("UTF-8")); + return testRepository.addAndCommit(project.project, + new File(file.getLocationURI()), commitMessage); + } +}
\ No newline at end of file diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/CurrentBranchPublishOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/CurrentBranchPublishOperationTest.java new file mode 100644 index 0000000000..97c0c5a42c --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/CurrentBranchPublishOperationTest.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME; +import static org.eclipse.jgit.lib.Constants.R_HEADS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.eclipse.egit.core.op.PushOperationResult; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.PushResult; +import org.junit.Test; + +public class CurrentBranchPublishOperationTest extends AbstractDualRepositoryTestCase { + @Test + public void testFeaturePublish() throws Exception { + new InitOperation(repository2.getRepository()).execute(null); + GitFlowRepository gfRepo2 = new GitFlowRepository( + repository2.getRepository()); + + new FeatureStartOperation(gfRepo2, MY_FEATURE).execute(null); + RevCommit branchCommit = repository2 + .createInitialCommit("testFeaturePublish"); + CurrentBranchPublishOperation featurePublishOperation = new CurrentBranchPublishOperation( + gfRepo2, 0); + featurePublishOperation.execute(null); + PushOperationResult result = featurePublishOperation + .getOperationResult(); + + assertTrue(result.isSuccessfulConnection(repository1.getUri())); + PushResult pushResult = result.getPushResult(repository1.getUri()); + assertEquals(RefUpdate.Result.NEW, pushResult.getTrackingRefUpdates() + .iterator().next().getResult()); + + assertCommitArrivedAtRemote(branchCommit, repository1.getRepository()); + + // config updated? + assertEquals(DEFAULT_REMOTE_NAME, getRemoteName(gfRepo2, MY_FEATURE)); + assertEquals(R_HEADS + gfRepo2.getConfig().getFeatureBranchName(MY_FEATURE), + gfRepo2.getUpstreamBranchName(MY_FEATURE)); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureCheckoutOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureCheckoutOperationTest.java new file mode 100644 index 0000000000..1dba8b5679 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureCheckoutOperationTest.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.core.resources.IFile; +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.api.CheckoutResult.Status; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class FeatureCheckoutOperationTest extends AbstractFeatureOperationTest { + @Test + public void testFeatureCheckout() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureCheckout\n\nfirst commit\n"); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + new BranchOperation(repository, gfRepo.getConfig().getDevelop()).execute(null); + + new FeatureCheckoutOperation(gfRepo, MY_FEATURE).execute(null); + + assertEquals(gfRepo.getConfig().getFullFeatureBranchName(MY_FEATURE), + repository.getFullBranch()); + } + + @Test + public void testFeatureCheckoutConflicts() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureCheckoutConflicts\n\nfirst commit\n"); + + // setup something we can modify later + IFile file = testUtils.addFileToProject(project.getProject(), + "folder1/file1.txt", "Hello world"); + testRepository.connect(project.getProject()); + testRepository.trackAllFiles(project.getProject()); + testRepository.commit("Initial commit"); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + // modify on first branch + testUtils.changeContentOfFile(project.getProject(), file, + "Hello Feature"); + testRepository.addToIndex(file); + testRepository.commit("Feature commit"); + new BranchOperation(repository, gfRepo.getConfig().getDevelop()).execute(null); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + // modify on second branch + testUtils.changeContentOfFile(project.getProject(), file, + "Hello Develop"); + testRepository.addToIndex(file); + + FeatureCheckoutOperation featureCheckoutOperation = new FeatureCheckoutOperation( + gfRepo, MY_FEATURE); + featureCheckoutOperation.execute(null); + + assertEquals(Status.CONFLICTS, featureCheckoutOperation.getResult() + .getStatus()); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureFinishOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureFinishOperationTest.java new file mode 100644 index 0000000000..034c8ef7ca --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureFinishOperationTest.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.egit.gitflow.WrongGitFlowStateException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Test; + +public class FeatureFinishOperationTest extends AbstractFeatureOperationTest { + @Test + public void testFeatureFinish() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureFinish\n\nfirst commit\n"); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + new FeatureFinishOperation(gfRepo).execute(null); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + String branchName = gfRepo.getConfig().getFeatureBranchName(MY_FEATURE); + RevCommit branchCommit = testRepository + .createInitialCommit("testFeatureFinish\n\nbranch commit\n"); + assertEquals(findBranch(repository, branchName), null); + + RevCommit developHead = gfRepo.findHead(); + assertEquals(branchCommit, developHead); + } + + @Test(expected = WrongGitFlowStateException.class) + public void testFeatureFinishFail() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureFinishFail\n\nfirst commit\n"); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + new BranchOperation(repository, gfRepo.getConfig().getDevelop()).execute(null); + new FeatureFinishOperation(gfRepo).execute(null); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureListOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureListOperationTest.java new file mode 100644 index 0000000000..1591bdab2b --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureListOperationTest.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.eclipse.egit.gitflow.GitFlowRepository; +import static org.eclipse.jgit.lib.Constants.*; +import org.eclipse.jgit.lib.Ref; +import org.junit.Test; + +import static org.eclipse.egit.gitflow.op.AbstractFeatureOperation.*; + +public class FeatureListOperationTest extends AbstractDualRepositoryTestCase { + @Test + public void testFeatureList() throws Exception { + GitFlowRepository gfRepo1 = new GitFlowRepository( + repository1.getRepository()); + GitFlowRepository gfRepo2 = new GitFlowRepository( + repository2.getRepository()); + new FeatureStartOperation(gfRepo1, MY_FEATURE).execute(null); + + FeatureListOperation featureListOperation = new FeatureListOperation( + gfRepo2, 0); + featureListOperation.execute(null); + String name = gfRepo2.getConfig().getFullFeatureBranchName(MY_FEATURE); + assertNotNull(featureListOperation.getOperationResult() + .getAdvertisedRef(name)); + List<Ref> result = featureListOperation.getResult(); + assertEquals(1, result.size()); + assertEquals( + R_REMOTES + DEFAULT_REMOTE_NAME + SEP + + gfRepo2.getConfig().getFeatureBranchName(MY_FEATURE), + result.get(0).getName()); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureRebaseOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureRebaseOperationTest.java new file mode 100644 index 0000000000..54199c3fb1 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureRebaseOperationTest.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.*; + +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.api.RebaseResult; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Test; + +public class FeatureRebaseOperationTest extends AbstractFeatureOperationTest { + @Test + public void testFeatureRebase() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureRebase\n\nfirst commit\n"); + RevCommit initialCommit = gfRepo.findHead(); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + String branchCommitMessage = "adding first file on feature branch"; + addFileAndCommit("theFile.txt", branchCommitMessage); + + testRepository.checkoutBranch(gfRepo.getConfig().getDevelop()); + RevCommit developCommit = addFileAndCommit("theOtherFile.txt", + "adding second file on develop branch"); + + new FeatureCheckoutOperation(gfRepo, MY_FEATURE).execute(null); + assertEquals(initialCommit, gfRepo.findHead().getParent(0)); + FeatureRebaseOperation featureRebaseOperation = new FeatureRebaseOperation( + gfRepo); + featureRebaseOperation.execute(null); + + RebaseResult res = featureRebaseOperation.getOperationResult(); + assertEquals(RebaseResult.Status.OK, res.getStatus()); + + assertEquals(branchCommitMessage, gfRepo.findHead().getShortMessage()); + assertEquals(developCommit, + parseCommit(repository, repository.resolve("HEAD^"))); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureStartOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureStartOperationTest.java new file mode 100644 index 0000000000..55771a7118 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureStartOperationTest.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class FeatureStartOperationTest extends AbstractFeatureOperationTest { + @Test + public void testFeatureStart() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureStart\n\nfirst commit\n"); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + + assertEquals(gfRepo.getConfig().getFullFeatureBranchName(MY_FEATURE), + repository.getFullBranch()); + } + + @Test(expected = CoreException.class) + public void testFeatureStartFail() throws Exception { + Repository repository = testRepository.getRepository(); + GitFlowRepository gfRepo = init("testFeatureStart\n\nfirst commit\n"); + + BranchOperation branchOperation = new BranchOperation(repository, + MY_MASTER); + branchOperation.execute(null); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureTrackOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureTrackOperationTest.java new file mode 100644 index 0000000000..47cee9fcc1 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/FeatureTrackOperationTest.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME; +import static org.eclipse.jgit.lib.Constants.R_HEADS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.transport.FetchResult; +import org.junit.Test; + +public class FeatureTrackOperationTest extends AbstractDualRepositoryTestCase { + @Test + public void testFeatureTrack() throws Exception { + GitFlowRepository gfRepo1 = new GitFlowRepository( + repository1.getRepository()); + GitFlowRepository gfRepo2 = new GitFlowRepository( + repository2.getRepository()); + new FeatureStartOperation(gfRepo1, MY_FEATURE).execute(null); + RevCommit branchCommit = repository1 + .createInitialCommit("testFeatureTrack"); + + FeatureTrackOperation featureTrackOperation = new FeatureTrackOperation( + gfRepo2, getFirstRemoteFeatureRef(gfRepo2)); + featureTrackOperation.execute(null); + FetchResult operationResult = featureTrackOperation + .getOperationResult(); + assertNotNull(operationResult.getAdvertisedRef(gfRepo2 + .getConfig().getFullFeatureBranchName(MY_FEATURE))); + assertEquals(gfRepo2.getConfig().getFeatureBranchName(MY_FEATURE), + repository2.getRepository().getBranch()); + assertEquals(branchCommit, findHead(repository2.getRepository())); + + RevCommit localCommit = repository2 + .createInitialCommit("testFeatureTrack2"); + new CurrentBranchPublishOperation(gfRepo2, 0).execute(null); + assertEquals(localCommit, findHead(repository2.getRepository())); + + // config updated? + assertEquals(DEFAULT_REMOTE_NAME, getRemoteName(gfRepo2, MY_FEATURE)); + assertEquals(R_HEADS + gfRepo2.getConfig().getFeatureBranchName(MY_FEATURE), + gfRepo2.getUpstreamBranchName(MY_FEATURE)); + } + + private Ref getFirstRemoteFeatureRef(GitFlowRepository gfRepo) + throws CoreException { + FeatureListOperation featureListOperation = new FeatureListOperation( + gfRepo, 0); + featureListOperation.execute(null); + return featureListOperation.getResult().get(0); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixFinishOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixFinishOperationTest.java new file mode 100644 index 0000000000..f7121845f8 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixFinishOperationTest.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.egit.gitflow.GitFlowDefaults.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import java.io.File; + +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.api.MergeResult; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Test; + +public class HotfixFinishOperationTest extends AbstractGitFlowOperationTest { + @Test + public void testHotfixFinish() throws Exception { + testRepository + .createInitialCommit("testHotfixFinish\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new HotfixStartOperation(gfRepo, MY_HOTFIX).execute(null); + + RevCommit branchCommit = testRepository + .createInitialCommit("testHotfixFinish\n\nbranch commit\n"); + + new HotfixFinishOperation(gfRepo).execute(null); + + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + String branchName = gfRepo.getConfig().getHotfixBranchName(MY_HOTFIX); + + // tag created? + assertEquals(branchCommit, gfRepo.findCommitForTag(MY_HOTFIX)); + + // branch removed? + assertEquals(findBranch(repository, branchName), null); + + RevCommit developHead = gfRepo.findHead(DEVELOP); + assertEquals(branchCommit, developHead); + + RevCommit masterHead = gfRepo.findHead(MY_MASTER); + assertEquals(branchCommit, masterHead); + } + + @Test + public void testMergeToDevelopFail() throws Exception { + testRepository + .createInitialCommit("testMergeToDevelopFail\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + // setup something we can modify later + File file = testRepository.createFile(project.getProject(), + "folder1/file1.txt"); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + testRepository.appendContentAndCommit(project.getProject(), file, + "Hello Release", "Release Commit"); + + new ReleaseFinishOperation(gfRepo).execute(null); + + new HotfixStartOperation(gfRepo, MY_HOTFIX).execute(null); + // modify on first branch + RevCommit hotfixCommit = testRepository.appendContentAndCommit( + project.getProject(), file, "Hello Hotfix", "Hotfix Commit"); + new BranchOperation(repository, gfRepo.getConfig().getDevelop()).execute(null); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + // modify on second branch + RevCommit developCommit = testRepository.appendContentAndCommit( + project.getProject(), file, "Hello Develop", "Develop Commit"); + + String branchName = gfRepo.getConfig().getHotfixBranchName(MY_HOTFIX); + new BranchOperation(repository, branchName).execute(null); + HotfixFinishOperation hotfixFinishOperation = new HotfixFinishOperation( + gfRepo); + hotfixFinishOperation.execute(null); + + // tag not created? + assertNotEquals(hotfixCommit, gfRepo.findCommitForTag(MY_HOTFIX)); + + // branch not removed? + assertNotEquals(findBranch(repository, branchName), null); + + // not merged on develop => conflict + RevCommit developHead = gfRepo.findHead(DEVELOP); + assertEquals(developCommit, developHead); + assertEquals(MergeResult.MergeStatus.CONFLICTING, hotfixFinishOperation + .getOperationResult().getMergeStatus()); + + // merged on master + RevCommit masterHead = gfRepo.findHead(MY_MASTER); + assertEquals(hotfixCommit, masterHead); + + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixStartOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixStartOperationTest.java new file mode 100644 index 0000000000..77ea7da9ec --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/HotfixStartOperationTest.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; + +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.Repository; +import org.junit.Test; + +public class HotfixStartOperationTest extends AbstractGitFlowOperationTest { + @Test + public void testHotfixStart() throws Exception { + testRepository.createInitialCommit("testHotfixStart\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new HotfixStartOperation(gfRepo, MY_HOTFIX).execute(null); + + assertEquals(gfRepo.getConfig().getFullHotfixBranchName(MY_HOTFIX), + repository.getFullBranch()); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/InitOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/InitOperationTest.java new file mode 100644 index 0000000000..0f0d8f012a --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/InitOperationTest.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; +import static org.eclipse.egit.gitflow.GitFlowDefaults.*; + +import org.eclipse.egit.gitflow.GitFlowRepository; + +import static org.eclipse.egit.gitflow.GitFlowConfig.*; + +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.StoredConfig; +import org.junit.Test; + +public class InitOperationTest extends AbstractGitFlowOperationTest { + + @Test + public void testInit() throws Exception { + testRepository + .createInitialCommit("testInitOperation\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + InitOperation initOperation = new InitOperation(repository); + initOperation.execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + assertEquals(FEATURE_PREFIX, getPrefix(repository, FEATURE_KEY)); + assertEquals(RELEASE_PREFIX, getPrefix(repository, RELEASE_KEY)); + assertEquals(HOTFIX_PREFIX, getPrefix(repository, HOTFIX_KEY)); + assertEquals(VERSION_TAG, getPrefix(repository, VERSION_TAG_KEY)); + assertEquals(DEVELOP, getBranch(repository, DEVELOP_KEY)); + assertEquals(MASTER, getBranch(repository, MASTER_KEY)); + } + + private String getPrefix(Repository repository, String prefixName) { + StoredConfig config = repository.getConfig(); + return config.getString(GITFLOW_SECTION, PREFIX_SECTION, prefixName); + } + + private String getBranch(Repository repository, String branch) { + StoredConfig config = repository.getConfig(); + return config.getString(GITFLOW_SECTION, BRANCH_SECTION, branch); + } + + @Test + public void testInitEmptyRepository() throws Exception { + Repository repository = testRepository.getRepository(); + InitOperation initOperation = new InitOperation(repository); + initOperation.execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseFinishOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseFinishOperationTest.java new file mode 100644 index 0000000000..7637870c9c --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseFinishOperationTest.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.eclipse.egit.gitflow.GitFlowDefaults.DEVELOP; +import static org.eclipse.egit.gitflow.GitFlowDefaults.FEATURE_PREFIX; +import static org.eclipse.egit.gitflow.GitFlowDefaults.HOTFIX_PREFIX; +import static org.eclipse.egit.gitflow.GitFlowDefaults.MASTER; +import static org.eclipse.egit.gitflow.GitFlowDefaults.RELEASE_PREFIX; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.fail; + +import java.util.Iterator; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.egit.core.op.BranchOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.egit.gitflow.WrongGitFlowStateException; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.NoHeadException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Test; + +public class ReleaseFinishOperationTest extends AbstractGitFlowOperationTest { + @Test + public void testReleaseFinish() throws Exception { + testRepository + .createInitialCommit("testReleaseFinish\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository, DEVELOP, MASTER, FEATURE_PREFIX, + RELEASE_PREFIX, HOTFIX_PREFIX, MY_VERSION_TAG).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + RevCommit branchCommit = testRepository + .createInitialCommit("testReleaseFinish\n\nbranch commit\n"); + new ReleaseFinishOperation(gfRepo).execute(null); + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + + String branchName = gfRepo.getConfig().getReleaseBranchName(MY_RELEASE); + // tag created? + assertEquals(branchCommit, + gfRepo.findCommitForTag(MY_VERSION_TAG + MY_RELEASE)); + // branch removed? + assertEquals(findBranch(repository, branchName), null); + + RevCommit developHead = gfRepo.findHead(); + assertEquals(branchCommit, developHead); + + RevCommit masterHead = gfRepo.findHead(MY_MASTER); + assertEquals(branchCommit, masterHead); + } + + @Test + public void testReleaseFinishFail() throws Exception { + testRepository + .createInitialCommit("testReleaseFinishFail\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + new BranchOperation(repository, gfRepo.getConfig().getDevelop()).execute(null); + + try { + new ReleaseFinishOperation(gfRepo).execute(null); + fail(); + } catch (WrongGitFlowStateException e) { + // success + } + } + + @Test + public void testReleaseTagWithWrongReferenceExists() throws Exception { + testRepository + .createInitialCommit("testReleaseTagExists\n\nfirst commit\n"); + testRepository + .createInitialCommit("testReleaseTagExists\n\nsecond commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + RevCommit next = getPreviousCommit(repository, 1); + ReleaseFinishOperation releaseFinishOperation = new ReleaseFinishOperation( + gfRepo); + releaseFinishOperation.createTag(null, next, MY_RELEASE, "irrelevant"); + + try { + releaseFinishOperation.execute(null); + fail(); + } catch (CoreException e) { + assertFalse(e.getStatus().isOK()); + } + } + + @Test + public void testReleaseTagWithCorrectReferenceExists() throws Exception { + testRepository + .createInitialCommit("testReleaseTagExists\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + RevCommit next = getPreviousCommit(repository, 0); + ReleaseFinishOperation releaseFinishOperation = new ReleaseFinishOperation( + gfRepo); + releaseFinishOperation.createTag(null, next, MY_RELEASE, "irrelevant"); + releaseFinishOperation.execute(null); + } + + private RevCommit getPreviousCommit(Repository repository, int count) + throws GitAPIException, NoHeadException { + Iterable<RevCommit> logs = Git.wrap(repository).log().call(); + Iterator<RevCommit> i = logs.iterator(); + for (int j = 0; j < count; j++) { + i.next(); + } + RevCommit next = i.next(); + return next; + } +} diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java new file mode 100644 index 0000000000..53f9a0f2e2 --- /dev/null +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/ReleaseStartOperationTest.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> + * + * 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.gitflow.op; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.egit.core.op.TagOperation; +import org.eclipse.egit.gitflow.GitFlowRepository; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.TagBuilder; +import org.eclipse.jgit.revwalk.RevCommit; +import org.junit.Test; + +public class ReleaseStartOperationTest extends AbstractGitFlowOperationTest { + @Test + public void testReleaseBranchCreated() throws Exception { + testRepository + .createInitialCommit("testReleaseStart\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + assertEquals(gfRepo.getConfig().getFullReleaseBranchName(MY_RELEASE), + repository.getFullBranch()); + } + + @Test + public void testReleaseStartWithContent() throws Exception { + testRepository + .createInitialCommit("testReleaseStartWithContent\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + testUtils.addFileToProject(project.getProject(), "folder1/file1.txt", + "Hello world"); + testRepository.connect(project.getProject()); + testRepository.trackAllFiles(project.getProject()); + RevCommit developCommit = testRepository.commit("Initial commit"); + + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + + RevCommit releaseHead = gfRepo.findHead(gfRepo + .getConfig().getReleaseBranchName(MY_RELEASE)); + assertEquals(developCommit, releaseHead); + } + + @Test + public void testReleaseStartFailed() throws Exception { + testRepository + .createInitialCommit("testReleaseStart\n\nfirst commit\n"); + + Repository repository = testRepository.getRepository(); + new InitOperation(repository).execute(null); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + createTag(gfRepo.findHead(), MY_RELEASE, "irrelevant", repository); + + try { + new ReleaseStartOperation(gfRepo, MY_RELEASE).execute(null); + fail(); + } catch (CoreException e) { + assertEquals(gfRepo.getConfig().getDevelopFull(), repository.getFullBranch()); + } + } + + protected void createTag(RevCommit head, String name, String message, + Repository repository) throws CoreException { + TagBuilder tag = new TagBuilder(); + tag.setTag(name); + tag.setMessage(message); + tag.setObjectId(head); + new TagOperation(repository, tag, false).execute(null); + } +} |