tikhomirov@67: /* tikhomirov@67: * Copyright (c) 2011 TMate Software Ltd tikhomirov@67: * tikhomirov@67: * This program is free software; you can redistribute it and/or modify tikhomirov@67: * it under the terms of the GNU General Public License as published by tikhomirov@67: * the Free Software Foundation; version 2 of the License. tikhomirov@67: * tikhomirov@67: * This program is distributed in the hope that it will be useful, tikhomirov@67: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@67: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@67: * GNU General Public License for more details. tikhomirov@67: * tikhomirov@67: * For information on how to redistribute this software under tikhomirov@67: * the terms of a license other than GNU General Public License tikhomirov@67: * contact TMate Software at support@svnkit.com tikhomirov@67: */ tikhomirov@67: package org.tmatesoft.hg.test; tikhomirov@67: tikhomirov@67: import static com.tmate.hgkit.ll.HgRepository.TIP; tikhomirov@67: tikhomirov@67: import java.util.LinkedHashMap; tikhomirov@67: import java.util.LinkedList; tikhomirov@67: import java.util.Map; tikhomirov@67: tikhomirov@67: import org.tmatesoft.hg.core.LogCommand.FileRevision; tikhomirov@67: import org.tmatesoft.hg.core.Path; tikhomirov@67: import org.tmatesoft.hg.core.RepositoryTreeWalker; tikhomirov@67: tikhomirov@67: import com.tmate.hgkit.fs.RepositoryLookup; tikhomirov@67: import com.tmate.hgkit.ll.HgRepository; tikhomirov@67: import com.tmate.hgkit.ll.Nodeid; tikhomirov@67: tikhomirov@67: /** tikhomirov@67: * tikhomirov@67: * @author Artem Tikhomirov tikhomirov@67: * @author TMate Software Ltd. tikhomirov@67: */ tikhomirov@67: public class TestManifest { tikhomirov@67: tikhomirov@67: private final HgRepository repo; tikhomirov@67: private ManifestOutputParser manifestParser; tikhomirov@67: private ExecHelper eh; tikhomirov@67: final LinkedList revisions = new LinkedList(); tikhomirov@67: private RepositoryTreeWalker.Handler handler = new RepositoryTreeWalker.Handler() { tikhomirov@67: tikhomirov@67: public void file(FileRevision fileRevision) { tikhomirov@67: revisions.add(fileRevision); tikhomirov@67: } tikhomirov@67: tikhomirov@67: public void end(Nodeid manifestRevision) {} tikhomirov@67: public void dir(Path p) {} tikhomirov@67: public void begin(Nodeid manifestRevision) {} tikhomirov@67: }; tikhomirov@67: tikhomirov@67: public static void main(String[] args) throws Exception { tikhomirov@67: HgRepository repo = new RepositoryLookup().detectFromWorkingDir(); tikhomirov@67: TestManifest tm = new TestManifest(repo); tikhomirov@67: tm.testTip(); tikhomirov@67: tm.testFirstRevision(); tikhomirov@67: tm.testRevisionInTheMiddle(); tikhomirov@67: } tikhomirov@67: tikhomirov@67: public TestManifest(HgRepository hgRepo) { tikhomirov@67: repo = hgRepo; tikhomirov@67: eh = new ExecHelper(manifestParser = new ManifestOutputParser(), null); tikhomirov@67: } tikhomirov@67: tikhomirov@67: public void testTip() throws Exception { tikhomirov@67: testRevision(TIP); tikhomirov@67: } tikhomirov@67: tikhomirov@67: public void testFirstRevision() throws Exception { tikhomirov@67: testRevision(0); tikhomirov@67: } tikhomirov@67: tikhomirov@67: public void testRevisionInTheMiddle() throws Exception { tikhomirov@67: int rev = repo.getManifest().getRevisionCount() / 2; tikhomirov@67: if (rev == 0) { tikhomirov@67: throw new IllegalStateException("Need manifest with few revisions"); tikhomirov@67: } tikhomirov@67: testRevision(rev); tikhomirov@67: } tikhomirov@67: tikhomirov@67: private void testRevision(int rev) throws Exception { tikhomirov@67: manifestParser.reset(); tikhomirov@67: eh.run("hg", "manifest", "--debug", "--rev", String.valueOf(rev)); tikhomirov@67: revisions.clear(); tikhomirov@67: new RepositoryTreeWalker(repo).revision(rev).walk(handler); tikhomirov@67: report("manifest " + (rev == TIP ? "TIP:" : "--rev " + rev)); tikhomirov@67: } tikhomirov@67: tikhomirov@67: private void report(String what) throws Exception { tikhomirov@67: final Map cmdLineResult = new LinkedHashMap(manifestParser.getResult()); tikhomirov@67: boolean error = false; tikhomirov@67: for (FileRevision fr : revisions) { tikhomirov@67: Nodeid nid = cmdLineResult.remove(fr.getPath()); tikhomirov@67: if (nid == null) { tikhomirov@67: System.out.println("Extra " + fr.getPath() + " in Java result"); tikhomirov@67: error = true; tikhomirov@67: } else { tikhomirov@67: if (!nid.equals(fr.getRevision())) { tikhomirov@67: System.out.println("Non-matching nodeid:" + nid); tikhomirov@67: error = true; tikhomirov@67: } tikhomirov@67: } tikhomirov@67: } tikhomirov@67: if (!cmdLineResult.isEmpty()) { tikhomirov@67: System.out.println("Non-matched entries from command line:"); tikhomirov@67: error = true; tikhomirov@67: for (Path p : cmdLineResult.keySet()) { tikhomirov@67: System.out.println(p); tikhomirov@67: } tikhomirov@67: } tikhomirov@67: System.out.println(what + (error ? " ERROR" : " OK")); tikhomirov@67: } tikhomirov@67: }