tikhomirov@442: /* tikhomirov@442: * Copyright (c) 2012 TMate Software Ltd tikhomirov@442: * tikhomirov@442: * This program is free software; you can redistribute it and/or modify tikhomirov@442: * it under the terms of the GNU General Public License as published by tikhomirov@442: * the Free Software Foundation; version 2 of the License. tikhomirov@442: * tikhomirov@442: * This program is distributed in the hope that it will be useful, tikhomirov@442: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@442: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@442: * GNU General Public License for more details. tikhomirov@442: * tikhomirov@442: * For information on how to redistribute this software under tikhomirov@442: * the terms of a license other than GNU General Public License tikhomirov@442: * contact TMate Software at support@hg4j.com tikhomirov@442: */ tikhomirov@442: package org.tmatesoft.hg.test; tikhomirov@442: tikhomirov@442: import static org.junit.Assert.assertEquals; tikhomirov@442: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@442: tikhomirov@442: import java.io.File; tikhomirov@442: import java.util.List; tikhomirov@442: tikhomirov@442: import org.junit.Ignore; tikhomirov@442: import org.junit.Rule; tikhomirov@442: import org.junit.Test; tikhomirov@442: import org.tmatesoft.hg.core.HgStatusCommand; tikhomirov@442: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@442: import org.tmatesoft.hg.repo.HgSubrepoLocation; tikhomirov@442: import org.tmatesoft.hg.repo.HgSubrepoLocation.Kind; tikhomirov@442: import org.tmatesoft.hg.util.Path; tikhomirov@442: tikhomirov@442: /** tikhomirov@442: * tikhomirov@442: * @author Artem Tikhomirov tikhomirov@442: * @author TMate Software Ltd. tikhomirov@442: */ tikhomirov@442: public class TestSubrepo { tikhomirov@442: tikhomirov@442: @Rule tikhomirov@442: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@442: tikhomirov@442: private HgRepository repo; tikhomirov@442: private StatusOutputParser statusParser; tikhomirov@442: private ExecHelper eh; tikhomirov@442: tikhomirov@442: /* tikhomirov@442: * Layout of status-subrepo: tikhomirov@442: * first/ regular subrepo tikhomirov@442: * dir/second/ subrepo nested under a tracked folder tikhomirov@442: * third/ subrepo with another one tikhomirov@442: * third/fourth 2nd level of subrepo nesting (registered in third/.hgsub) tikhomirov@442: * third/fourth/file4_1 A, added file tikhomirov@442: * third/fourth/file4_2 ?, untracked file tikhomirov@442: * fifth/ nested repository not yet registered in .hgsub tikhomirov@442: * fifth/file5 untracked file tikhomirov@442: * tikhomirov@442: * Curiously, fifth/ shall not be reported (neither 'hg status -AS' nor '-A' don't report tikhomirov@442: * anything for it, no '?' for the file5 in particular. Once fifth/.hg/ is removed, tikhomirov@442: * file5 gets its ? as one would expect) tikhomirov@442: */ tikhomirov@442: tikhomirov@442: @Test tikhomirov@442: public void testAccessAPI() throws Exception { tikhomirov@442: repo = Configuration.get().find("status-subrepo"); tikhomirov@442: List subrepositories = repo.getSubrepositories(); tikhomirov@442: assertEquals(3, subrepositories.size()); tikhomirov@442: checkHgSubrepo(Path.create("first/"), true, repo, subrepositories.get(0)); tikhomirov@442: checkHgSubrepo(Path.create("dir/second/"), true, repo, subrepositories.get(1)); tikhomirov@442: checkHgSubrepo(Path.create("third/"), false, repo, subrepositories.get(2)); tikhomirov@442: } tikhomirov@442: tikhomirov@442: private void checkHgSubrepo(Path expectedLocation, boolean isCommitted, HgRepository topRepo, HgSubrepoLocation l) throws Exception { tikhomirov@442: errorCollector.assertEquals(expectedLocation, l.getLocation()); tikhomirov@442: errorCollector.assertEquals(Kind.Hg, l.getType()); tikhomirov@442: if (isCommitted) { tikhomirov@442: errorCollector.assertTrue(l.isCommitted()); tikhomirov@442: errorCollector.assertTrue(l.getRevision() != null); tikhomirov@442: errorCollector.assertTrue(!l.getRevision().isNull()); tikhomirov@442: } else { tikhomirov@442: errorCollector.assertTrue(!l.isCommitted()); tikhomirov@442: errorCollector.assertTrue(l.getRevision() == null); tikhomirov@442: } tikhomirov@442: errorCollector.assertEquals(topRepo, l.getOwner()); tikhomirov@442: HgRepository r = l.getRepo(); tikhomirov@442: String expectedSubRepoLoc = new File(topRepo.getLocation(), expectedLocation.toString()).toString(); tikhomirov@442: errorCollector.assertEquals(expectedSubRepoLoc, r.getLocation()); tikhomirov@442: errorCollector.assertTrue(r.getChangelog().getRevisionCount() > 0); tikhomirov@442: if (isCommitted) { tikhomirov@442: errorCollector.assertEquals(r.getChangelog().getRevision(TIP), l.getRevision()); tikhomirov@442: } tikhomirov@442: } tikhomirov@442: tikhomirov@442: @Test tikhomirov@442: @Ignore("StatusCommand doesn't suport subrepositories yet") tikhomirov@442: public void testStatusCommand() throws Exception { tikhomirov@442: repo = Configuration.get().find("status-subrepo"); tikhomirov@442: statusParser = new StatusOutputParser(); tikhomirov@442: eh = new ExecHelper(statusParser, repo.getWorkingDir()); tikhomirov@442: TestStatus.StatusReporter sr = new TestStatus.StatusReporter(errorCollector, statusParser); tikhomirov@442: HgStatusCommand cmd = new HgStatusCommand(repo).all(); tikhomirov@442: TestStatus.StatusCollector sc; tikhomirov@442: tikhomirov@442: eh.run("hg", "status", "-A", "-S"); tikhomirov@442: cmd.subrepo(true); tikhomirov@442: cmd.execute(sc = new TestStatus.StatusCollector()); tikhomirov@442: sr.report("status -A -S", sc); tikhomirov@442: tikhomirov@442: eh.run("hg", "status", "-A", "-S"); tikhomirov@442: cmd.subrepo(false); tikhomirov@442: cmd.execute(sc = new TestStatus.StatusCollector()); tikhomirov@442: sr.report("status -A", sc); tikhomirov@442: tikhomirov@442: } tikhomirov@442: tikhomirov@442: }