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