tikhomirov@651: /* tikhomirov@651: * Copyright (c) 2013 TMate Software Ltd tikhomirov@651: * tikhomirov@651: * This program is free software; you can redistribute it and/or modify tikhomirov@651: * it under the terms of the GNU General Public License as published by tikhomirov@651: * the Free Software Foundation; version 2 of the License. tikhomirov@651: * tikhomirov@651: * This program is distributed in the hope that it will be useful, tikhomirov@651: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@651: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@651: * GNU General Public License for more details. tikhomirov@651: * tikhomirov@651: * For information on how to redistribute this software under tikhomirov@651: * the terms of a license other than GNU General Public License tikhomirov@651: * contact TMate Software at support@hg4j.com tikhomirov@651: */ tikhomirov@651: package org.tmatesoft.hg.test; tikhomirov@651: tikhomirov@651: import static org.junit.Assert.*; tikhomirov@651: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@651: tikhomirov@651: import java.io.File; tikhomirov@651: import java.util.List; tikhomirov@651: tikhomirov@651: import org.junit.Rule; tikhomirov@651: import org.junit.Test; tikhomirov@651: import org.tmatesoft.hg.core.HgCheckoutCommand; tikhomirov@651: import org.tmatesoft.hg.core.HgCommitCommand; tikhomirov@651: import org.tmatesoft.hg.core.HgOutgoingCommand; tikhomirov@651: import org.tmatesoft.hg.core.HgPushCommand; tikhomirov@651: import org.tmatesoft.hg.core.Nodeid; tikhomirov@651: import org.tmatesoft.hg.internal.PhasesHelper; tikhomirov@651: import org.tmatesoft.hg.internal.RevisionSet; tikhomirov@652: import org.tmatesoft.hg.repo.HgBookmarks; tikhomirov@651: import org.tmatesoft.hg.repo.HgChangelog; tikhomirov@651: import org.tmatesoft.hg.repo.HgInternals; tikhomirov@651: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@652: import org.tmatesoft.hg.repo.HgPhase; tikhomirov@651: import org.tmatesoft.hg.repo.HgRemoteRepository; tikhomirov@651: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@651: tikhomirov@651: /** tikhomirov@651: * @author Artem Tikhomirov tikhomirov@651: * @author TMate Software Ltd. tikhomirov@651: */ tikhomirov@651: public class TestPush { tikhomirov@651: tikhomirov@651: @Rule tikhomirov@651: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testPushToEmpty() throws Exception { tikhomirov@651: File srcRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-push2empty-src", false); tikhomirov@651: File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-push2empty-dst"); tikhomirov@651: HgServer server = new HgServer().start(dstRepoLoc); tikhomirov@651: try { tikhomirov@651: final HgLookup hgLookup = new HgLookup(); tikhomirov@651: HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@651: HgPushCommand cmd = new HgPushCommand(srcRepo); tikhomirov@651: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@651: cmd.destination(dstRemote); tikhomirov@651: cmd.execute(); tikhomirov@651: final HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@651: checkRepositoriesAreSame(srcRepo, dstRepo); tikhomirov@651: final List outgoing = new HgOutgoingCommand(srcRepo).against(dstRemote).executeLite(); tikhomirov@651: errorCollector.assertTrue(outgoing.toString(), outgoing.isEmpty()); tikhomirov@651: } finally { tikhomirov@651: server.stop(); tikhomirov@651: } tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testPushChanges() throws Exception { tikhomirov@651: File srcRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-push-src", false); tikhomirov@651: File dstRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-push-dst", false); tikhomirov@651: File f1 = new File(srcRepoLoc, "file1"); tikhomirov@651: assertTrue("[sanity]", f1.canWrite()); tikhomirov@651: HgServer server = new HgServer().start(dstRepoLoc); tikhomirov@651: try { tikhomirov@651: final HgLookup hgLookup = new HgLookup(); tikhomirov@651: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@651: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@651: RepoUtils.modifyFileAppend(f1, "change1"); tikhomirov@651: new HgCommitCommand(srcRepo).message("Commit 1").execute(); tikhomirov@651: new HgCheckoutCommand(srcRepo).changeset(7).clean(true).execute(); tikhomirov@651: assertEquals("[sanity]", "no-merge", srcRepo.getWorkingCopyBranchName()); tikhomirov@651: RepoUtils.modifyFileAppend(f1, "change2"); tikhomirov@651: new HgCommitCommand(srcRepo).message("Commit 2").execute(); tikhomirov@651: // tikhomirov@651: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@651: checkRepositoriesAreSame(srcRepo, hgLookup.detect(dstRepoLoc)); tikhomirov@651: final List outgoing = new HgOutgoingCommand(srcRepo).against(dstRemote).executeLite(); tikhomirov@651: errorCollector.assertTrue(outgoing.toString(), outgoing.isEmpty()); tikhomirov@651: } finally { tikhomirov@651: server.stop(); tikhomirov@651: } tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testPushToNonPublishingServer() throws Exception { tikhomirov@652: // check drafts are same as on server tikhomirov@652: // copy, not clone as latter updates phase information tikhomirov@652: File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-nopub-src"); tikhomirov@652: File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-push-nopub-dst"); tikhomirov@652: File f1 = new File(srcRepoLoc, "hello.c"); tikhomirov@652: assertTrue("[sanity]", f1.canWrite()); tikhomirov@652: HgServer server = new HgServer().publishing(false).start(dstRepoLoc); tikhomirov@652: try { tikhomirov@652: final HgLookup hgLookup = new HgLookup(); tikhomirov@652: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@652: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@652: PhasesHelper phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: final RevisionSet allDraft = phaseHelper.allDraft(); tikhomirov@652: assertFalse("[sanity]", allDraft.isEmpty()); tikhomirov@652: final int publicCsetToBranchAt = 4; tikhomirov@652: assertEquals("[sanity]", HgPhase.Public, phaseHelper.getPhase(publicCsetToBranchAt, null)); tikhomirov@652: // in addition to existing draft csets, add one more draft, branching at some other public revision tikhomirov@652: new HgCheckoutCommand(srcRepo).changeset(publicCsetToBranchAt).clean(true).execute(); tikhomirov@652: RepoUtils.modifyFileAppend(f1, "// aaa"); tikhomirov@652: final HgCommitCommand commitCmd = new HgCommitCommand(srcRepo).message("Commit aaa"); tikhomirov@652: assertTrue(commitCmd.execute().isOk()); tikhomirov@652: Nodeid newCommit = commitCmd.getCommittedRevision(); tikhomirov@652: // tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@652: final HgChangelog srcClog = srcRepo.getChangelog(); tikhomirov@652: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@652: // refresh PhasesHelper tikhomirov@652: phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: // check if phase didn't change tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(srcClog.getRevisionIndex(newCommit), newCommit)); tikhomirov@652: for (Nodeid n : allDraft) { tikhomirov@652: // check drafts from src were actually pushed to dst tikhomirov@652: errorCollector.assertTrue(dstClog.isKnown(n)); tikhomirov@652: // check drafts didn't change their phase tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, phaseHelper.getPhase(srcClog.getRevisionIndex(n), n)); tikhomirov@652: } tikhomirov@652: } finally { tikhomirov@652: server.stop(); tikhomirov@652: } tikhomirov@651: } tikhomirov@651: tikhomirov@652: /** tikhomirov@652: * If server lists revisions we know as drafts as public, update them locally tikhomirov@652: */ tikhomirov@652: @Test tikhomirov@652: public void testPushUpdatesPublishedDrafts() throws Exception { tikhomirov@652: /* o r9, secret tikhomirov@652: * | o r8, draft tikhomirov@652: * | | tikhomirov@652: * | o r7, draft tikhomirov@652: * o | r6, secret tikhomirov@652: * | / tikhomirov@652: * o r5, draft tikhomirov@652: * | tikhomirov@652: * o r4, public tikhomirov@652: */ tikhomirov@652: // remote: r5 -> public, r6 -> draft, r8 -> secret tikhomirov@652: // local: new draft from r4, push tikhomirov@652: File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-phase-update-1-src"); tikhomirov@652: File dstRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-phase-update-1-dst"); tikhomirov@652: File f1 = new File(srcRepoLoc, "hello.c"); tikhomirov@652: assertTrue("[sanity]", f1.canWrite()); tikhomirov@652: final HgLookup hgLookup = new HgLookup(); tikhomirov@652: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@652: final ExecHelper dstRun = new ExecHelper(new OutputParser.Stub(), dstRepoLoc); tikhomirov@652: final int publicCsetToBranchAt = 4; tikhomirov@652: final int r5 = 5, r6 = 6, r8 = 8; tikhomirov@652: PhasesHelper srcPhase = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: assertEquals("[sanity]", HgPhase.Draft, srcPhase.getPhase(r5, null)); tikhomirov@652: assertEquals("[sanity]", HgPhase.Secret, srcPhase.getPhase(r6, null)); tikhomirov@652: assertEquals("[sanity]", HgPhase.Draft, srcPhase.getPhase(r8, null)); tikhomirov@652: // change phases in repository of remote server: tikhomirov@652: dstRun.exec("hg", "phase", "--public", String.valueOf(r5)); tikhomirov@652: assertEquals(0, dstRun.getExitValue()); tikhomirov@652: dstRun.exec("hg", "phase", "--draft", String.valueOf(r6)); tikhomirov@652: assertEquals(0, dstRun.getExitValue()); tikhomirov@652: dstRun.exec("hg", "phase", "--secret", "--force", String.valueOf(r8)); tikhomirov@652: assertEquals(0, dstRun.getExitValue()); tikhomirov@652: HgServer server = new HgServer().publishing(false).start(dstRepoLoc); tikhomirov@652: try { tikhomirov@652: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@652: // commit new draft head tikhomirov@652: new HgCheckoutCommand(srcRepo).changeset(publicCsetToBranchAt).clean(true).execute(); tikhomirov@652: RepoUtils.modifyFileAppend(f1, "// aaa"); tikhomirov@652: final HgCommitCommand commitCmd = new HgCommitCommand(srcRepo).message("Commit aaa"); tikhomirov@652: assertTrue(commitCmd.execute().isOk()); tikhomirov@652: final Nodeid newCommit = commitCmd.getCommittedRevision(); tikhomirov@652: // tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: // refresh phase information tikhomirov@652: srcPhase = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: // r5 and r6 are changed to match server phases (more exposed) tikhomirov@652: errorCollector.assertEquals(HgPhase.Public, srcPhase.getPhase(r5, null)); tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, srcPhase.getPhase(r6, null)); tikhomirov@652: // r8 is secret on server, locally can't make it less exposed though tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, srcPhase.getPhase(r8, null)); tikhomirov@652: // tikhomirov@652: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@652: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@652: assertTrue(dstClog.isKnown(newCommit)); tikhomirov@652: PhasesHelper dstPhase = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, dstPhase.getPhase(dstClog.getRevisionIndex(newCommit), newCommit)); tikhomirov@652: // the one that was secret is draft now tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, srcPhase.getPhase(r8, null)); tikhomirov@652: } finally { tikhomirov@652: server.stop(); tikhomirov@652: } tikhomirov@652: } tikhomirov@652: tikhomirov@652: /** tikhomirov@652: * update phases of local revisions and push changes tikhomirov@652: */ tikhomirov@652: @Test tikhomirov@652: public void testPushPublishAndUpdates() throws Exception { tikhomirov@652: File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-phase-update-2-src"); tikhomirov@652: File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-push-phase-update-1-dst"); tikhomirov@652: final int r4 = 4, r5 = 5, r6 = 6, r9 = 9; tikhomirov@652: HgServer server = new HgServer().publishing(false).start(dstRepoLoc); tikhomirov@652: try { tikhomirov@652: final HgLookup hgLookup = new HgLookup(); tikhomirov@652: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@652: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: // tikhomirov@652: // make sure pushed repository got same draft root tikhomirov@652: final Nodeid r4PublicHead = srcRepo.getChangelog().getRevision(r4); tikhomirov@652: final Nodeid r5DraftRoot = srcRepo.getChangelog().getRevision(r5); tikhomirov@652: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@652: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@652: PhasesHelper dstPhase = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); tikhomirov@652: assertEquals(HgPhase.Public, dstPhase.getPhase(dstClog.getRevisionIndex(r4PublicHead), r4PublicHead)); tikhomirov@652: assertEquals(HgPhase.Draft, dstPhase.getPhase(dstClog.getRevisionIndex(r5DraftRoot), r5DraftRoot)); tikhomirov@652: // tikhomirov@652: // now, graduate some local revisions, r5:draft->public, r6:secret->public, r9: secret->draft tikhomirov@652: final ExecHelper srcRun = new ExecHelper(new OutputParser.Stub(), srcRepoLoc); tikhomirov@652: srcRun.exec("hg", "phase", "--public", String.valueOf(r5)); tikhomirov@652: srcRun.exec("hg", "phase", "--public", String.valueOf(r6)); tikhomirov@652: srcRun.exec("hg", "phase", "--draft", String.valueOf(r9)); tikhomirov@652: // PhaseHelper shall be new for the command, and would pick up these external changes tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: final Nodeid r6Nodeid = srcRepo.getChangelog().getRevision(r6); tikhomirov@652: final Nodeid r9Nodeid = srcRepo.getChangelog().getRevision(r9); tikhomirov@652: // refresh tikhomirov@652: dstPhase = new PhasesHelper(HgInternals.getImplementationRepo(dstRepo)); tikhomirov@652: // not errorCollector as subsequent code would fail if these secret revs didn't get into dst tikhomirov@652: assertTrue(dstClog.isKnown(r6Nodeid)); tikhomirov@652: assertTrue(dstClog.isKnown(r9Nodeid)); tikhomirov@652: errorCollector.assertEquals(HgPhase.Public, dstPhase.getPhase(dstClog.getRevisionIndex(r5DraftRoot), r5DraftRoot)); tikhomirov@652: errorCollector.assertEquals(HgPhase.Public, dstPhase.getPhase(dstClog.getRevisionIndex(r6Nodeid), r6Nodeid)); tikhomirov@652: errorCollector.assertEquals(HgPhase.Draft, dstPhase.getPhase(dstClog.getRevisionIndex(r9Nodeid), r9Nodeid)); tikhomirov@652: } finally { tikhomirov@652: server.stop(); tikhomirov@652: } tikhomirov@652: } tikhomirov@652: tikhomirov@652: tikhomirov@663: /** tikhomirov@663: * XXX doesn't check the case when we push child of a draft revision which is tikhomirov@663: * known as public on server ((presentLocalDrafts \ outgoing) leaves bogus draft revision, tikhomirov@663: * the parent one of the child added and pushed) tikhomirov@663: * For the time being, TestPull.testPullFromPublishing covers this case (as both push and tikhomirov@663: * pull share same phase update functionality) tikhomirov@663: */ tikhomirov@651: @Test tikhomirov@651: public void testPushToPublishingServer() throws Exception { tikhomirov@652: // copy, not clone as latter updates phase information tikhomirov@652: File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-pub-src"); tikhomirov@652: File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-push-pub-dst"); tikhomirov@652: HgServer server = new HgServer().publishing(true).start(dstRepoLoc); tikhomirov@652: try { tikhomirov@652: final HgLookup hgLookup = new HgLookup(); tikhomirov@652: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@652: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@652: PhasesHelper phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: final RevisionSet allDraft = phaseHelper.allDraft(); tikhomirov@652: assertFalse("[sanity]", allDraft.isEmpty()); tikhomirov@652: // push all changes tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@652: final HgChangelog srcClog = srcRepo.getChangelog(); tikhomirov@652: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@652: // refresh PhasesHelper tikhomirov@652: phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@652: for (Nodeid n : allDraft) { tikhomirov@652: // check drafts from src were actually pushed to dst tikhomirov@652: errorCollector.assertTrue(dstClog.isKnown(n)); tikhomirov@652: // check drafts became public tikhomirov@652: errorCollector.assertEquals(HgPhase.Public, phaseHelper.getPhase(srcClog.getRevisionIndex(n), n)); tikhomirov@652: } tikhomirov@652: } finally { tikhomirov@652: server.stop(); tikhomirov@652: } tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testPushSecretChangesets() throws Exception { tikhomirov@651: // copy, not clone as latter updates phase information tikhomirov@651: File srcRepoLoc = RepoUtils.copyRepoToTempLocation("test-phases", "test-push-no-secret-src"); tikhomirov@651: File dstRepoLoc = RepoUtils.initEmptyTempRepo("test-push-no-secret-dst"); tikhomirov@651: HgServer server = new HgServer().start(dstRepoLoc); tikhomirov@651: try { tikhomirov@651: final HgLookup hgLookup = new HgLookup(); tikhomirov@651: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@651: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@651: PhasesHelper phaseHelper = new PhasesHelper(HgInternals.getImplementationRepo(srcRepo)); tikhomirov@651: final RevisionSet allSecret = phaseHelper.allSecret(); tikhomirov@651: assertFalse("[sanity]", allSecret.isEmpty()); tikhomirov@651: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@651: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@651: final HgChangelog srcClog = srcRepo.getChangelog(); tikhomirov@651: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@651: errorCollector.assertEquals(srcClog.getRevisionCount() - allSecret.size(), dstClog.getRevisionCount()); tikhomirov@651: for (Nodeid n : allSecret) { tikhomirov@651: errorCollector.assertTrue(n.toString(), !dstClog.isKnown(n)); tikhomirov@651: } tikhomirov@651: } finally { tikhomirov@651: server.stop(); tikhomirov@651: } tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testUpdateBookmarkOnPush() throws Exception { tikhomirov@652: File srcRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-push-src", false); tikhomirov@652: File dstRepoLoc = RepoUtils.cloneRepoToTempLocation("test-annotate", "test-push-dst", false); tikhomirov@652: final ExecHelper srcRun = new ExecHelper(new OutputParser.Stub(), srcRepoLoc); tikhomirov@652: final ExecHelper dstRun = new ExecHelper(new OutputParser.Stub(), dstRepoLoc); tikhomirov@652: File f1 = new File(srcRepoLoc, "file1"); tikhomirov@652: assertTrue("[sanity]", f1.canWrite()); tikhomirov@652: // tikhomirov@652: final String bm1 = "mark1", bm2 = "mark2", bm3 = "mark3", bm4 = "mark4", bm5 = "mark5"; tikhomirov@652: final int bm2Local = 1, bm2Remote = 6, bm3Local = 7, bm3Remote = 2, bm_4_5 = 3; tikhomirov@652: // 1) bm1 - local active bookmark, check that push updates in remote tikhomirov@652: srcRun.exec("hg", "bookmark", bm1); tikhomirov@652: dstRun.exec("hg", "bookmark", "-r", "8", bm1); tikhomirov@652: // 2) bm2 - local points to ancestor of revision remote points to tikhomirov@652: srcRun.exec("hg", "bookmark", "-r", String.valueOf(bm2Local), bm2); tikhomirov@652: dstRun.exec("hg", "bookmark", "-r", String.valueOf(bm2Remote), bm2); tikhomirov@652: // 3) bm3 - remote points to ancestor of revision local one points to tikhomirov@652: srcRun.exec("hg", "bookmark", "-r", String.valueOf(bm3Local), bm3); tikhomirov@652: dstRun.exec("hg", "bookmark", "-r", String.valueOf(bm3Remote), bm3); tikhomirov@652: // 4) bm4 - remote bookmark, not known locally tikhomirov@652: dstRun.exec("hg", "bookmark", "-r", String.valueOf(bm_4_5), bm4); tikhomirov@652: // 5) bm5 - local bookmark, not known remotely tikhomirov@652: srcRun.exec("hg", "bookmark", "-r", String.valueOf(bm_4_5), bm5); tikhomirov@652: // tikhomirov@652: HgServer server = new HgServer().start(dstRepoLoc); tikhomirov@652: try { tikhomirov@652: final HgLookup hgLookup = new HgLookup(); tikhomirov@652: final HgRepository srcRepo = hgLookup.detect(srcRepoLoc); tikhomirov@652: final HgRemoteRepository dstRemote = hgLookup.detect(server.getURL()); tikhomirov@652: RepoUtils.modifyFileAppend(f1, "change1"); tikhomirov@652: final HgCommitCommand commitCmd = new HgCommitCommand(srcRepo).message("Commit 1"); tikhomirov@652: assertTrue(commitCmd.execute().isOk()); tikhomirov@652: assertEquals(bm1, srcRepo.getBookmarks().getActiveBookmarkName()); tikhomirov@652: assertEquals(commitCmd.getCommittedRevision(), srcRepo.getBookmarks().getRevision(bm1)); tikhomirov@652: // tikhomirov@652: new HgPushCommand(srcRepo).destination(dstRemote).execute(); tikhomirov@652: Thread.sleep(300); // let the server perform the update tikhomirov@652: // tikhomirov@652: HgBookmarks srcBookmarks = srcRepo.getBookmarks(); tikhomirov@652: final HgChangelog srcClog = srcRepo.getChangelog(); tikhomirov@652: // first, check local bookmarks are intact tikhomirov@652: errorCollector.assertEquals(srcClog.getRevision(bm2Local), srcBookmarks.getRevision(bm2)); tikhomirov@652: errorCollector.assertEquals(srcClog.getRevision(bm3Local), srcBookmarks.getRevision(bm3)); tikhomirov@652: errorCollector.assertEquals(null, srcBookmarks.getRevision(bm4)); tikhomirov@652: errorCollector.assertEquals(srcClog.getRevision(bm_4_5), srcBookmarks.getRevision(bm5)); tikhomirov@652: // now, check remote bookmarks were touched tikhomirov@652: HgRepository dstRepo = hgLookup.detect(dstRepoLoc); tikhomirov@652: HgBookmarks dstBookmarks = dstRepo.getBookmarks(); tikhomirov@652: final HgChangelog dstClog = dstRepo.getChangelog(); tikhomirov@652: // bm1 changed and points to newly pushed commit. tikhomirov@652: // if the test fails (bm1 points to r8), chances are server didn't manage to update tikhomirov@652: // bookmarks yet (there's Thread.sleep() above to give it a chance). tikhomirov@652: errorCollector.assertEquals(commitCmd.getCommittedRevision(), dstBookmarks.getRevision(bm1)); tikhomirov@652: // bm2 didn't change tikhomirov@652: errorCollector.assertEquals(dstClog.getRevision(bm2Remote), dstBookmarks.getRevision(bm2)); tikhomirov@652: // bm3 did change, now points to value we've got in srcRepo tikhomirov@652: errorCollector.assertEquals(srcClog.getRevision(bm3Local), dstBookmarks.getRevision(bm3)); tikhomirov@652: // bm4 is not affected tikhomirov@652: errorCollector.assertEquals(dstClog.getRevision(bm_4_5), dstBookmarks.getRevision(bm4)); tikhomirov@652: // bm5 is not known remotely tikhomirov@652: errorCollector.assertEquals(null, dstBookmarks.getRevision(bm5)); tikhomirov@652: } finally { tikhomirov@652: server.stop(); tikhomirov@652: } tikhomirov@651: } tikhomirov@651: tikhomirov@651: private void checkRepositoriesAreSame(HgRepository srcRepo, HgRepository dstRepo) { tikhomirov@651: errorCollector.assertEquals(srcRepo.getChangelog().getRevisionCount(), dstRepo.getChangelog().getRevisionCount()); tikhomirov@651: errorCollector.assertEquals(srcRepo.getChangelog().getRevision(0), dstRepo.getChangelog().getRevision(0)); tikhomirov@651: errorCollector.assertEquals(srcRepo.getChangelog().getRevision(TIP), dstRepo.getChangelog().getRevision(TIP)); tikhomirov@651: } tikhomirov@651: }