view test/org/tmatesoft/hg/test/ComplexTest.java @ 709:497e697636fc

Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 21 Aug 2013 16:23:27 +0200
parents 4ffc17c0b534
children
line wrap: on
line source
/*
 * Copyright (c) 2013 TMate Software Ltd
 *  
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * For information on how to redistribute this software under
 * the terms of a license other than GNU General Public License
 * contact TMate Software at support@hg4j.com
 */
package org.tmatesoft.hg.test;

import static org.junit.Assert.*;

import java.io.File;

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.HgInitCommand;
import org.tmatesoft.hg.core.HgMergeCommand;
import org.tmatesoft.hg.core.HgRevertCommand;
import org.tmatesoft.hg.repo.HgManifest;
import org.tmatesoft.hg.repo.HgMergeState;
import org.tmatesoft.hg.repo.HgRepository;
import org.tmatesoft.hg.util.Outcome;
import org.tmatesoft.hg.util.Path;

/**
 * @author Artem Tikhomirov
 * @author TMate Software Ltd.
 */
public class ComplexTest {
	
	@Rule
	public ErrorCollectorExt errorCollector = new ErrorCollectorExt();

	/**
	 * Regular work sequence with checkout, add, remove, revert and commit
	 */
	@Test
	public void testLocalScenario1() throws Exception {
		File repoLoc = RepoUtils.createEmptyDir("composite-scenario-1");
		// init empty
		HgRepository hgRepo = new HgInitCommand().location(repoLoc).revlogV1().execute();
		assertFalse("[sanity]", hgRepo.isInvalid());
		assertEquals("[sanity]", 0, hgRepo.getChangelog().getRevisionCount());
		// add 2 files
		Path fa = Path.create("a"), fb = Path.create("b");
		final File fileA = new File(repoLoc, fa.toString());
		final File fileB = new File(repoLoc, fb.toString());
		RepoUtils.createFile(fileA, "first file");
		RepoUtils.createFile(fileB, "second file");
		new HgAddRemoveCommand(hgRepo).add(fa, fb).execute();
		new HgCommitCommand(hgRepo).message("FIRST").execute();
		// add one more file
		// remove one initial file
		Path fc = Path.create("c");
		final File fileC = new File(repoLoc, fc.toString());
		RepoUtils.createFile(fileC, "third file");
		fileB.delete();
		// TODO HgAddRemoveCommand needs #copy(from, to) method 
		new HgAddRemoveCommand(hgRepo).add(fc).remove(fb).execute();
		new HgCommitCommand(hgRepo).message("SECOND").execute();
		//
		assertEquals(2, hgRepo.getChangelog().getRevisionCount());
		errorCollector.assertEquals("SECOND", hgRepo.getCommitLastMessage());
		// checkout previous version
		new HgCheckoutCommand(hgRepo).changeset(0).clean(true).execute();
		assertTrue(fileA.isFile());
		assertTrue(fileB.isFile());
		assertFalse(fileC.isFile());
		// branch/two heads
		RepoUtils.modifyFileAppend(fileA, "A1");
		RepoUtils.modifyFileAppend(fileB, "B1");
		new HgCommitCommand(hgRepo).message("THIRD").execute();
		//
		new HgCheckoutCommand(hgRepo).changeset(1).clean(true).execute();
		assertTrue(fileA.isFile());
		assertFalse(fileB.isFile());
		assertTrue(fileC.isFile());
		RepoUtils.modifyFileAppend(fileA, "A2");
		RepoUtils.modifyFileAppend(fileC, "C1");
		new HgRevertCommand(hgRepo).changeset(1).file(fa).execute();
		errorCollector.assertTrue(new File(fileA.getParent(), fileA.getName() + ".orig").isFile());
		new HgCommitCommand(hgRepo).message("FOURTH").execute();
		// TODO merge and HgMergeCommand
		
		errorCollector.assertEquals(2, hgRepo.getFileNode(fa).getRevisionCount());
		errorCollector.assertEquals(2, hgRepo.getFileNode(fb).getRevisionCount());
		errorCollector.assertEquals(2, hgRepo.getFileNode(fc).getRevisionCount());
		final HgManifest mf = hgRepo.getManifest();
		errorCollector.assertEquals(mf.getFileRevision(0, fa), mf.getFileRevision(3, fa)); // "A2" was reverted
	}

	@Test
	public void testMergeAndCommit() throws Exception {
		File repoLoc = RepoUtils.createEmptyDir("composite-scenario-2");
		HgRepository hgRepo = new HgInitCommand().location(repoLoc).revlogV1().execute();
		Path fa = Path.create("file1"), fb = Path.create("file2"), fc = Path.create("file3");
		final File fileA = new File(repoLoc, fa.toString());
		final File fileB = new File(repoLoc, fb.toString());
		// rev0: +file1, +file2
		RepoUtils.createFile(fileA, "first file");
		RepoUtils.createFile(fileB, "second file");
		new HgAddRemoveCommand(hgRepo).add(fa, fb).execute();
		final HgCommitCommand commitCmd = new HgCommitCommand(hgRepo);
		commitCmd.message("FIRST").execute();
		// rev1: *file1, *file2
		RepoUtils.modifyFileAppend(fileA, "A1");
		RepoUtils.modifyFileAppend(fileB, "B1");
		commitCmd.message("SECOND").execute();
		// rev2: *file1, -file2
		RepoUtils.modifyFileAppend(fileA, "A2");
		fileB.delete();
		new HgAddRemoveCommand(hgRepo).remove(fb).execute();
		commitCmd.message("THIRD").execute();
		// rev3: fork rev0, +file3, *file2
		new HgCheckoutCommand(hgRepo).changeset(0).clean(true).execute();
		final File fileC = new File(repoLoc, fc.toString());
		RepoUtils.createFile(fileC, "third file");
		RepoUtils.modifyFileAppend(fileB, "B2");
		new HgAddRemoveCommand(hgRepo).add(fc).execute();
		commitCmd.message("FOURTH").execute();
		// rev4: *file3
		RepoUtils.modifyFileAppend(fileC, "C1");
		commitCmd.message("FIFTH").execute();
		// rev5: merge rev2 with rev3
		new HgCheckoutCommand(hgRepo).changeset(2).clean(true).execute();
		new HgMergeCommand(hgRepo).changeset(3).execute(new HgMergeCommand.MediatorBase());
		commitCmd.message("SIXTH: merge rev2 and rev3");
		errorCollector.assertTrue(commitCmd.isMergeCommit());
		HgMergeState ms = hgRepo.getMergeState();
		ms.refresh();
		errorCollector.assertTrue(ms.isMerging());
		errorCollector.assertFalse(ms.isStale());
		errorCollector.assertEquals(0, ms.getConflicts().size());
		Outcome o = commitCmd.execute();
		errorCollector.assertTrue(o.getMessage(), o.isOk());
		ms.refresh();
		errorCollector.assertFalse(ms.isMerging());
		errorCollector.assertEquals(0, ms.getConflicts().size());
		RepoUtils.assertHgVerifyOk(errorCollector, repoLoc);
	}
}