Mercurial > hg4j
diff test/org/tmatesoft/hg/test/TestPull.java @ 663:46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 10 Jul 2013 16:41:49 +0200 |
parents | 4fd317a2fecf |
children | dde18bc7053b |
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/TestPull.java Wed Jul 10 11:53:19 2013 +0200 +++ b/test/org/tmatesoft/hg/test/TestPull.java Wed Jul 10 16:41:49 2013 +0200 @@ -16,22 +16,36 @@ */ package org.tmatesoft.hg.test; +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.tmatesoft.hg.repo.HgRepository.TIP; import java.io.File; +import java.util.Collections; import java.util.List; +import java.util.Map; import org.junit.Rule; import org.junit.Test; +import org.tmatesoft.hg.core.HgAddRemoveCommand; +import org.tmatesoft.hg.core.HgCheckoutCommand; +import org.tmatesoft.hg.core.HgCommitCommand; import org.tmatesoft.hg.core.HgIncomingCommand; import org.tmatesoft.hg.core.HgPullCommand; import org.tmatesoft.hg.core.Nodeid; +import org.tmatesoft.hg.internal.BasicSessionContext; +import org.tmatesoft.hg.internal.Internals; +import org.tmatesoft.hg.internal.PhasesHelper; +import org.tmatesoft.hg.internal.RevisionSet; +import org.tmatesoft.hg.repo.HgInternals; import org.tmatesoft.hg.repo.HgLookup; +import org.tmatesoft.hg.repo.HgPhase; import org.tmatesoft.hg.repo.HgRemoteRepository; import org.tmatesoft.hg.repo.HgRepository; +import org.tmatesoft.hg.util.Path; /** - * + * FIXME need TestTransaction to check transaction rolback/commit as it's tricky to test transactions as part of pull/push commands * @author Artem Tikhomirov * @author TMate Software Ltd. */ @@ -48,7 +62,7 @@ try { final HgLookup hgLookup = new HgLookup(); final HgRemoteRepository srcRemote = hgLookup.detect(server.getURL()); - HgRepository dstRepo = hgLookup.detect(dstRepoLoc); + final HgRepository dstRepo = hgLookup.detect(dstRepoLoc); HgPullCommand cmd = new HgPullCommand(dstRepo).source(srcRemote); cmd.execute(); final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); @@ -60,8 +74,135 @@ server.stop(); } } + + /** + * pull comes with 2 changes, one of them with new file + */ + @Test + public void testPullChanges() throws Exception { + + File srcRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-pull-src", false); + File dstRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-pull-dst", false); + File f1 = new File(srcRepoLoc, "file1"); + assertTrue("[sanity]", f1.canWrite()); + final HgLookup hgLookup = new HgLookup(); + // add two commits, one with new file at different branch + // commit 1 + final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); + assertEquals("[sanity]", "default", srcRepo.getWorkingCopyBranchName()); + RepoUtils.modifyFileAppend(f1, "change1"); + HgCommitCommand commitCmd = new HgCommitCommand(srcRepo).message("Commit 1"); + assertTrue(commitCmd.execute().isOk()); + final Nodeid cmt1 = commitCmd.getCommittedRevision(); + // commit 2 + new HgCheckoutCommand(srcRepo).changeset(7).clean(true).execute(); + assertEquals("[sanity]", "no-merge", srcRepo.getWorkingCopyBranchName()); + RepoUtils.createFile(new File(srcRepoLoc, "file-new"), "whatever"); + new HgAddRemoveCommand(srcRepo).add(Path.create("file-new")).execute(); + commitCmd = new HgCommitCommand(srcRepo).message("Commit 2"); + assertTrue(commitCmd.execute().isOk()); + final Nodeid cmt2 = commitCmd.getCommittedRevision(); + // + // pull + HgServer server = new HgServer().start(srcRepoLoc); + final HgRepository dstRepo = hgLookup.detect(dstRepoLoc); + try { + final HgRemoteRepository srcRemote = hgLookup.detect(server.getURL()); + new HgPullCommand(dstRepo).source(srcRemote).execute(); + } finally { + server.stop(); + } + // + errorCollector.assertTrue(dstRepo.getChangelog().isKnown(cmt1)); + errorCollector.assertTrue(dstRepo.getChangelog().isKnown(cmt2)); + checkRepositoriesAreSame(srcRepo, dstRepo); + RepoUtils.assertHgVerifyOk(errorCollector, dstRepoLoc); + } - // test when pull comes with new file (if AddRevInspector/RevlogStreamWriter is ok with file that doesn't exist + /** + * Add two draft changesets, one child of r8 (local:draft, remote:public) and another + * as child of r4 (public), pull and see if 5, 7 and 8 became public, but newly added drafts remained + */ + @Test + public void testPullFromPublishing() throws Exception { + // copy, not clone as latter updates phase information + File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-pull-pub-src"); + File dstRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-pull-pub-dst"); + File f1 = new File(dstRepoLoc, "hello.c"); + assertTrue("[sanity]", f1.canWrite()); + final HgLookup hgLookup = new HgLookup(); + HgRepository dstRepo = hgLookup.detect(dstRepoLoc); + PhasesHelper phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); + // + // new child revision for shared public parent + assertEquals(HgPhase.Public, phaseHelper.getPhase(4, null)); + new HgCheckoutCommand(dstRepo).changeset(4).clean(true).execute(); + RepoUtils.modifyFileAppend(f1, "// aaa"); + HgCommitCommand commitCmd = new HgCommitCommand(dstRepo).message("Commit 1"); + assertTrue(commitCmd.execute().isOk()); + final Nodeid cmt1 = commitCmd.getCommittedRevision(); + // + // new child rev for parent locally draft, remotely public + assertEquals(HgPhase.Draft, phaseHelper.getPhase(5, null)); + assertEquals(HgPhase.Draft, phaseHelper.getPhase(7, null)); + assertEquals(HgPhase.Draft, phaseHelper.getPhase(8, null)); + new HgCheckoutCommand(dstRepo).changeset(8).clean(true).execute(); + RepoUtils.modifyFileAppend(f1, "// bbb"); + commitCmd = new HgCommitCommand(dstRepo).message("Commit 2"); + assertTrue(commitCmd.execute().isOk()); + final Nodeid cmt2 = commitCmd.getCommittedRevision(); + // both new revisions shall be draft + phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); // refresh PhasesHelper + assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(cmt1), cmt1)); + assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(cmt2), cmt2)); + // + + HgServer server = new HgServer().publishing(true).start(srcRepoLoc); + try { + final HgRemoteRepository srcRemote = hgLookup.detect(server.getURL()); + new HgPullCommand(dstRepo).source(srcRemote).execute(); + } finally { + server.stop(); + } + // refresh PhasesHelper + phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); + errorCollector.assertEquals(HgPhase.Public, phaseHelper.getPhase(5, null)); + errorCollector.assertEquals(HgPhase.Public, phaseHelper.getPhase(7, null)); + errorCollector.assertEquals(HgPhase.Public, phaseHelper.getPhase(8, null)); + // phase of local-only new revisions shall not change + errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(cmt1), cmt1)); + errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(cmt2), cmt2)); + } + + @Test + public void testPullFromNonPublishing() throws Exception { + // copy, not clone as latter updates phase information + File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-pull-nopub-src"); + File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-pull-nopub-dst"); + Map<String,?> props = Collections.singletonMap(Internals.CFG_PROPERTY_CREATE_PHASEROOTS, true); + final HgLookup hgLookup = new HgLookup(new BasicSessionContext(props, null)); + HgRepository srcRepo = hgLookup.detect(srcRepoLoc); + // revisions 6 and 9 are secret, so + // index of revisions 4 and 5 won't change, but that of 7 and 8 would + Nodeid r7 = srcRepo.getChangelog().getRevision(7); + Nodeid r8 = srcRepo.getChangelog().getRevision(8); + + HgRepository dstRepo = hgLookup.detect(dstRepoLoc); + HgServer server = new HgServer().publishing(false).start(srcRepoLoc); + try { + final HgRemoteRepository srcRemote = hgLookup.detect(server.getURL()); + new HgPullCommand(dstRepo).source(srcRemote).execute(); + } finally { + server.stop(); + } + PhasesHelper phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); + errorCollector.assertEquals(HgPhase.Public, phaseHelper.getPhase(4, null)); + errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(5, null)); + errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(r7), r7)); + errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(dstRepo.getChangelog().getRevisionIndex(r8), r8)); + final RevisionSet dstSecret = phaseHelper.allSecret(); + errorCollector.assertTrue(dstSecret.toString(), dstSecret.isEmpty()); + } private void checkRepositoriesAreSame(HgRepository srcRepo, HgRepository dstRepo) { // XXX copy of TestPush#checkRepositoriesAreSame