tikhomirov@526: /* tikhomirov@526: * Copyright (c) 2013 TMate Software Ltd tikhomirov@526: * tikhomirov@526: * This program is free software; you can redistribute it and/or modify tikhomirov@526: * it under the terms of the GNU General Public License as published by tikhomirov@526: * the Free Software Foundation; version 2 of the License. tikhomirov@526: * tikhomirov@526: * This program is distributed in the hope that it will be useful, tikhomirov@526: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@526: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@526: * GNU General Public License for more details. tikhomirov@526: * tikhomirov@526: * For information on how to redistribute this software under tikhomirov@526: * the terms of a license other than GNU General Public License tikhomirov@526: * contact TMate Software at support@hg4j.com tikhomirov@526: */ tikhomirov@526: package org.tmatesoft.hg.test; tikhomirov@526: tikhomirov@527: import static org.junit.Assert.assertEquals; tikhomirov@563: import static org.junit.Assert.assertTrue; tikhomirov@563: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@536: import static org.tmatesoft.hg.test.RepoUtils.cloneRepoToTempLocation; tikhomirov@527: tikhomirov@527: import java.io.File; tikhomirov@527: import java.io.FileFilter; tikhomirov@527: tikhomirov@527: import org.junit.Rule; tikhomirov@526: import org.junit.Test; tikhomirov@527: import org.tmatesoft.hg.core.HgCheckoutCommand; tikhomirov@527: import org.tmatesoft.hg.core.Nodeid; tikhomirov@527: import org.tmatesoft.hg.repo.HgLookup; tikhomirov@527: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@580: import org.tmatesoft.hg.util.FileInfo; tikhomirov@580: import org.tmatesoft.hg.util.FileWalker; tikhomirov@527: import org.tmatesoft.hg.util.Pair; tikhomirov@527: import org.tmatesoft.hg.util.Path; tikhomirov@526: tikhomirov@526: /** tikhomirov@526: * tikhomirov@526: * @author Artem Tikhomirov tikhomirov@526: * @author TMate Software Ltd. tikhomirov@526: */ tikhomirov@526: public class TestCheckout { tikhomirov@526: tikhomirov@527: @Rule tikhomirov@527: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@527: tikhomirov@527: private HgRepository repo; tikhomirov@527: private ExecHelper eh; tikhomirov@527: tikhomirov@526: tikhomirov@526: @Test tikhomirov@527: public void testCleanCheckoutInEmptyDir() throws Exception { tikhomirov@563: File testRepoLoc = cloneRepoToTempLocation("log-1", "test-checkout-clean", true); tikhomirov@527: repo = new HgLookup().detect(testRepoLoc); tikhomirov@527: // nothing but .hg dir tikhomirov@527: assertEquals("[sanity]", 0, testRepoLoc.listFiles(new FilesOnlyFilter()).length); tikhomirov@527: tikhomirov@563: new HgCheckoutCommand(repo).clean(true).changeset(1).execute(); tikhomirov@527: errorCollector.assertEquals(2, testRepoLoc.listFiles(new FilesOnlyFilter()).length); tikhomirov@527: tikhomirov@527: Pair workingCopyParents = repo.getWorkingCopyParents(); tikhomirov@527: errorCollector.assertEquals("da3461cd828dae8eb5fd11189d40e9df1961f191", workingCopyParents.first().toString()); tikhomirov@527: errorCollector.assertEquals(Nodeid.NULL, workingCopyParents.second()); tikhomirov@527: errorCollector.assertEquals(HgRepository.DEFAULT_BRANCH_NAME, repo.getWorkingCopyBranchName()); tikhomirov@527: tikhomirov@527: StatusOutputParser statusOutputParser = new StatusOutputParser(); tikhomirov@527: eh = new ExecHelper(statusOutputParser, testRepoLoc); tikhomirov@527: eh.run("hg", "status", "-A"); tikhomirov@527: errorCollector.assertEquals(2, statusOutputParser.getClean().size()); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("a"))); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("b"))); tikhomirov@527: tikhomirov@563: new HgCheckoutCommand(repo).clean(true).changeset(3).execute(); tikhomirov@527: statusOutputParser.reset(); tikhomirov@527: eh.run("hg", "status", "-A"); tikhomirov@527: errorCollector.assertEquals(3, statusOutputParser.getClean().size()); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("b"))); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("d"))); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("dir/b"))); tikhomirov@526: } tikhomirov@526: tikhomirov@563: /** tikhomirov@563: * Make sure WC is cleared prior to clean checkout tikhomirov@563: */ tikhomirov@526: @Test tikhomirov@563: public void testCleanCheckoutInDirtyDir() throws Exception { tikhomirov@563: File repoLoc = cloneRepoToTempLocation("log-1", "test-checkout-dirty", false); tikhomirov@563: File untrackedFile = new File(repoLoc, "aaa"); tikhomirov@563: RepoUtils.createFile(untrackedFile, "shall survive hg co --clean"); tikhomirov@563: File modifiedFile = new File(repoLoc, "b"); tikhomirov@563: assertTrue("[sanity]", modifiedFile.canRead()); tikhomirov@563: final long modifiedFileInitialLen = modifiedFile.length(); tikhomirov@563: RepoUtils.modifyFileAppend(modifiedFile, "the change shall not survive"); tikhomirov@563: assertTrue("[sanity]", modifiedFile.length() > modifiedFileInitialLen); tikhomirov@563: // tikhomirov@563: repo = new HgLookup().detect(repoLoc); tikhomirov@563: new HgCheckoutCommand(repo).clean(true).changeset(TIP).execute(); tikhomirov@563: errorCollector.assertTrue(untrackedFile.canRead()); tikhomirov@563: errorCollector.assertEquals(modifiedFileInitialLen, modifiedFile.length()); tikhomirov@526: } tikhomirov@526: tikhomirov@526: @Test tikhomirov@527: public void testBranchCheckout() throws Exception { tikhomirov@536: File testRepoLoc = cloneRepoToTempLocation("log-branches", "test-checkoutBranch", true); tikhomirov@527: repo = new HgLookup().detect(testRepoLoc); tikhomirov@527: tikhomirov@563: new HgCheckoutCommand(repo).clean(true).changeset(3 /*branch test*/).execute(); tikhomirov@527: tikhomirov@527: StatusOutputParser statusOutputParser = new StatusOutputParser(); tikhomirov@527: eh = new ExecHelper(statusOutputParser, testRepoLoc); tikhomirov@527: eh.run("hg", "status", "-A"); tikhomirov@527: errorCollector.assertEquals(3, statusOutputParser.getClean().size()); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("a"))); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("b"))); tikhomirov@527: errorCollector.assertTrue(statusOutputParser.getClean().contains(Path.create("c"))); tikhomirov@527: tikhomirov@527: errorCollector.assertEquals("test", repo.getWorkingCopyBranchName()); tikhomirov@527: } tikhomirov@580: tikhomirov@580: @Test tikhomirov@580: public void testCheckoutLinkAndExec() throws Exception { tikhomirov@580: File testRepoLoc = cloneRepoToTempLocation("test-flags", "test-checkout-flags", true); tikhomirov@580: repo = new HgLookup().detect(testRepoLoc); tikhomirov@580: new HgCheckoutCommand(repo).clean(true).changeset(0).execute(); tikhomirov@580: tikhomirov@580: FileWalker fw = new FileWalker(repo.getSessionContext(), testRepoLoc, new Path.SimpleSource()); tikhomirov@580: int execFound, linkFound, regularFound; tikhomirov@580: execFound = linkFound = regularFound = 0; tikhomirov@580: while(fw.hasNext()) { tikhomirov@580: fw.next(); tikhomirov@580: FileInfo fi = fw.file(); tikhomirov@580: boolean executable = fi.isExecutable(); tikhomirov@580: boolean symlink = fi.isSymlink(); tikhomirov@580: if (executable) { tikhomirov@580: execFound++; tikhomirov@580: } tikhomirov@580: if (symlink) { tikhomirov@580: linkFound++; tikhomirov@580: } tikhomirov@580: if (!executable && !symlink) { tikhomirov@580: regularFound++; tikhomirov@580: } tikhomirov@580: } tikhomirov@580: // TODO alter expected values to pass on Windows tikhomirov@580: errorCollector.assertEquals("Executable files", 1, execFound); tikhomirov@580: errorCollector.assertEquals("Symlink files", 1, linkFound); tikhomirov@580: errorCollector.assertEquals("Regular files", 1, regularFound); tikhomirov@580: } tikhomirov@527: tikhomirov@527: private static final class FilesOnlyFilter implements FileFilter { tikhomirov@527: public boolean accept(File f) { tikhomirov@527: return f.isFile(); tikhomirov@527: } tikhomirov@526: } tikhomirov@526: }