package ut.com.atlassian.maven.plugins.jgitflow.manager; import java.io.File; import java.util.List; import java.util.Properties; import com.atlassian.jgitflow.core.JGitFlow; import com.atlassian.jgitflow.core.JGitFlowInitCommand; import com.atlassian.jgitflow.core.util.GitHelper; import com.atlassian.maven.plugins.jgitflow.ReleaseContext; import com.atlassian.maven.plugins.jgitflow.exception.MavenJGitFlowException; import com.atlassian.maven.plugins.jgitflow.helper.JGitFlowSetupHelper; import com.atlassian.maven.plugins.jgitflow.helper.ProjectHelper; import com.atlassian.maven.plugins.jgitflow.manager.FlowReleaseManager; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; import org.codehaus.plexus.util.FileUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.Ref; import org.junit.Test; import ut.com.atlassian.maven.plugins.jgitflow.TestFinishExtension; import ut.com.atlassian.maven.plugins.jgitflow.testutils.RepoUtil; import static org.junit.Assert.*; /** * @since version */ public class ReleaseManagerFinishReleaseTest extends AbstractFlowManagerTest { @Test public void releaseBasicPomWithoutOrigin() throws Exception { String commentPrefix = "woot!"; String commentSuffix = "+review CR-XYZ @reviewer1 @reviewer2"; String projectName = "basic-pom"; Git git = null; Git remoteGit = null; String projectSubdir = "basic-pom"; List<MavenProject> remoteProjects = createReactorProjects("remote-git-project", null); File remoteDir = remoteProjects.get(0).getBasedir(); //make sure we're clean File remoteGitDir = new File(remoteDir, ".git"); if (remoteGitDir.exists()) { FileUtils.cleanDirectory(remoteGitDir); } remoteGit = RepoUtil.createRepositoryWithMasterAndDevelop(remoteDir); List<MavenProject> projects = createReactorProjects("release-projects", projectName); File projectRoot = projects.get(0).getBasedir(); MavenSession session = new MavenSession(getContainer(), new Settings(), localRepository, null, null, null, projectRoot.getAbsolutePath(), new Properties(), new Properties(), null); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false); ctx.setNoBuild(true).setScmCommentPrefix(commentPrefix).setScmCommentSuffix(commentSuffix); JGitFlow flow = JGitFlow.getOrInit(projectRoot); setupProjectsForMasterAndDevelop(projectRoot, projectName); FlowReleaseManager relman = getReleaseManager(); relman.start(ctx, projects, session); assertOnRelease(flow, ctx.getDefaultReleaseVersion()); //reload the projects projects = createReactorProjectsNoClean("release-projects", projectName); relman.finish(ctx, projects, session); String fullMessage = GitHelper.getLatestCommit(flow.git(), flow.git().getRepository().getBranch()).getFullMessage(); assertTrue(fullMessage.startsWith(commentPrefix)); assertTrue(fullMessage.endsWith(commentSuffix)); } @Test public void releaseBasicPomWithEmptyMaster() throws Exception { ProjectHelper projectHelper = (ProjectHelper) lookup(ProjectHelper.class.getName()); JGitFlowSetupHelper setupHelper = (JGitFlowSetupHelper) lookup(JGitFlowSetupHelper.class.getName()); Git git = null; Git remoteGit = null; List<MavenProject> remoteProjects = createReactorProjects("remote-git-project", null); File remoteDir = remoteProjects.get(0).getBasedir(); //make sure we're clean FileUtils.cleanDirectory(remoteDir); remoteGit = RepoUtil.createRepositoryWithMasterAndDevelop(remoteDir); remoteGit.checkout().setName("develop").call(); copyTestProject("remote-git-project", null); remoteGit.add().addFilepattern(".").call(); remoteGit.commit().setMessage("pom commit").call(); File localProject = new File(testFileBase, "projects/local/local-git-project"); git = Git.cloneRepository().setDirectory(localProject).setURI("file://" + remoteGit.getRepository().getWorkTree().getPath()).call(); List<MavenProject> projects = createReactorProjects("remote-git-project", "local/local-git-project", null, false); File projectRoot = projects.get(0).getBasedir(); MavenSession session = new MavenSession(getContainer(), new Settings(), localRepository, null, null, null, projectRoot.getAbsolutePath(), new Properties(), new Properties(), null); JGitFlowInitCommand initCommand = new JGitFlowInitCommand(); JGitFlow flow = initCommand.setDirectory(git.getRepository().getWorkTree()).call(); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false).setNoBuild(true); FlowReleaseManager relman = getReleaseManager(); relman.start(ctx, projects, session); assertEquals(flow.getReleaseBranchPrefix() + "1.0", git.getRepository().getBranch()); relman.finish(ctx, projects, session); } @Test public void releaseFinishWithComplexVersionAndSuffix() throws Exception { String commentPrefix = "woot!"; String projectName = "complex-version-and-suffix"; List<MavenProject> projects = createReactorProjects("rewrite-for-release", projectName); File projectRoot = projects.get(0).getBasedir(); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false).setNoTag(true).setAllowSnapshots(true).setReleaseBranchVersionSuffix("RC"); basicReleaseRewriteTest(projectName, ctx); } @Test(expected = MavenJGitFlowException.class) public void releaseFinishWithoutReleaseStart() throws Exception { String projectName = "master-and-develop"; Git git = null; List<MavenProject> projects = createReactorProjects("release-projects", projectName); File projectRoot = projects.get(0).getBasedir(); MavenSession session = new MavenSession(getContainer(), new Settings(), localRepository, null, null, null, projectRoot.getAbsolutePath(), new Properties(), new Properties(), null); TestFinishExtension extension = new TestFinishExtension(); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false) .setNoTag(true) .setAllowSnapshots(true) .setNoBuild(true); setupProjectsForMasterAndDevelop(projectRoot, projectName); FlowReleaseManager relman = getReleaseManager(); relman.finish(ctx, projects, session); fail("release finish should throw if there's no release branch!!!"); } @Test public void releaseFinishWithExternalExtension() throws Exception { String projectName = "master-and-develop"; Git git = null; List<MavenProject> projects = createReactorProjects("release-projects", projectName); File projectRoot = projects.get(0).getBasedir(); MavenSession session = new MavenSession(getContainer(), new Settings(), localRepository, null, null, null, projectRoot.getAbsolutePath(), new Properties(), new Properties(), null); TestFinishExtension extension = new TestFinishExtension(); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false) .setNoTag(true) .setAllowSnapshots(true) .setNoBuild(true) .setReleaseFinishExtension(extension); setupProjectsForMasterAndDevelop(projectRoot, projectName); FlowReleaseManager relman = getReleaseManager(); relman.start(ctx, projects, session); relman.finish(ctx, projects, session); assertEquals("old version incorrect", "1.0", extension.getOldVersion()); assertEquals("new version incorrect", "1.1", extension.getNewVersion()); } @Test public void releaseBasicPomWithOnlyRemoteReleaseBranch() throws Exception { ProjectHelper projectHelper = (ProjectHelper) lookup(ProjectHelper.class.getName()); JGitFlowSetupHelper setupHelper = (JGitFlowSetupHelper) lookup(JGitFlowSetupHelper.class.getName()); Git git = null; Git remoteGit = null; List<MavenProject> remoteProjects = createReactorProjects("remote-git-project", null); File remoteDir = remoteProjects.get(0).getBasedir(); //make sure we're clean File remoteGitDir = new File(remoteDir, ".git"); if (remoteGitDir.exists()) { FileUtils.cleanDirectory(remoteGitDir); } remoteGit = RepoUtil.createRepositoryWithMasterAndDevelop(remoteDir); remoteGit.add().addFilepattern(".").call(); remoteGit.commit().setMessage("pom commit").call(); File localProject = new File(testFileBase, "projects/local/local-git-project"); git = Git.cloneRepository().setDirectory(localProject).setURI("file://" + remoteGit.getRepository().getWorkTree().getPath()).call(); List<MavenProject> projects = createReactorProjects("remote-git-project", "local/local-git-project", null, false); File projectRoot = projects.get(0).getBasedir(); MavenSession session = new MavenSession(getContainer(), new Settings(), localRepository, null, null, null, projectRoot.getAbsolutePath(), new Properties(), new Properties(), null); JGitFlowInitCommand initCommand = new JGitFlowInitCommand(); JGitFlow flow = initCommand.setDirectory(git.getRepository().getWorkTree()).call(); ReleaseContext ctx = new ReleaseContext(projectRoot); ctx.setInteractive(false).setNoBuild(true).setPushReleases(true); FlowReleaseManager relman = getReleaseManager(); relman.start(ctx, projects, session); assertEquals(flow.getReleaseBranchPrefix() + "1.0", git.getRepository().getBranch()); //delete the local release branch git.checkout().setName("develop").call(); git.branchDelete().setBranchNames(flow.getReleaseBranchPrefix() + "1.0").setForce(true).call(); relman.finish(ctx, projects, session); assertOnDevelop(flow); } private void setupProjectsForMasterAndDevelop(File projectRoot, String projectName) throws Exception { JGitFlow flow = JGitFlow.getOrInit(projectRoot); flow.git().checkout().setName(flow.getMasterBranchName()).call(); copyTestProject("release-projects", projectName); assertOnMaster(flow); initialCommitAll(flow); Ref masterRef = flow.git().getRepository().getRef("HEAD"); flow.git().checkout().setName(flow.getDevelopBranchName()).call(); assertOnDevelop(flow); flow.git().merge().include("master", masterRef.getObjectId()).call(); updatePomVersion(new File(projectRoot, "pom.xml"), "1.0", "1.1-SNAPSHOT"); commitAll(flow, "bumping develop"); } private void setupProjectsForDevelopOnly(File projectRoot, String projectName) throws Exception { JGitFlow flow = JGitFlow.getOrInit(projectRoot); flow.git().checkout().setName(flow.getDevelopBranchName()).call(); copyTestProject("release-projects", projectName); assertOnDevelop(flow); initialCommitAll(flow); updatePomVersion(new File(projectRoot, "pom.xml"), "1.0", "1.1-SNAPSHOT"); commitAll(flow, "bumping develop"); } }