package org.paylogic.jenkins.advancedscm; import hudson.Launcher; import hudson.model.*; import hudson.plugins.mercurial.MercurialSCM; import hudson.scm.SCM; import org.jenkinsci.plugins.multiplescms.MultiSCM; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import java.io.File; import java.io.IOException; import java.util.ArrayList; public class BasicMercurialTest { @Rule public JenkinsRule j = new JenkinsRule(); @Rule public MercurialRule m = new MercurialRule(j); @Rule public TemporaryFolder tmp = new TemporaryFolder(); @Rule public TemporaryFolder tmp2 = new TemporaryFolder(); private File repo; private File repo2; @Before public void setUp() throws Exception { repo = tmp.getRoot(); repo2 = tmp2.getRoot(); } @Test public void testBasicMerge() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); p.setScm(new MercurialSCM(null, repo.getPath(), "tip", null, null, null, false)); // Init repo with release and feature branch. m.hg(repo, "init"); m.hg(repo, "branch", "r1336"); m.touchAndCommit(repo, "r1336"); m.hg(repo, "branch", "c3"); m.touchAndCommit(repo, "c3"); // Custom builder that merges feature branch with release branch using AdvancedSCMManager. p.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { try { AdvancedSCMManager amm = SCMManagerFactory.getManager(build, launcher, listener); amm.update("r1336"); amm.mergeWorkspaceWith("c3", null); amm.commit("merge c3", "test <testuser@example.com>"); return true; } catch (Exception e) { e.printStackTrace(listener.getLogger()); return false; } } }); // Assert file is here (should be after successful merge) m.buildAndCheck(p, "c3"); } @Test public void testBasicMultiSCMMerge() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); ArrayList<SCM> scmList = new ArrayList<SCM>(); scmList.add(new MercurialSCM(null, repo.getPath(), "tip", null, null, null, false)); scmList.add(new MercurialSCM(null, repo2.getPath(), "tip", null, "src/asdf", null, false)); p.setScm(new MultiSCM(scmList)); ArrayList<ParameterValue> parameters = new ArrayList<ParameterValue>(); parameters.add(new StringParameterValue("REPO_SUBDIR", "src/asdf")); // Init repo with release and feature branch. m.hg(repo, "init"); m.touchAndCommit(repo, "dummy"); m.hg(repo2, "init"); m.hg(repo2, "branch", "r1336"); m.touchAndCommit(repo2, "r1336"); m.hg(repo2, "branch", "c3"); m.touchAndCommit(repo2, "c3"); // Custom builder that merges feature branch with release branch using AdvancedSCMManager. p.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { try { AdvancedSCMManager amm = SCMManagerFactory.getManager(build, launcher, listener); amm.update("r1336"); amm.mergeWorkspaceWith("c3", null); amm.commit("merge c3", "test <testuser@example.com>"); return true; } catch (Exception e) { e.printStackTrace(listener.getLogger()); return false; } } }); // Assert file is here (should be after successful merge) m.buildAndCheck(p, "src/asdf/c3", new ParametersAction(parameters)); } }