Mercurial > hg4j
comparison cmdline/org/tmatesoft/hg/console/Main.java @ 471:7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 11 Jul 2012 20:40:47 +0200 | 
| parents | 909306e412e2 1a3c18d57a8e | 
| children | 2a0b09eec376 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 470:31bd09da0dcf | 471:7bcfbc255f48 | 
|---|---|
| 43 import org.tmatesoft.hg.core.Nodeid; | 43 import org.tmatesoft.hg.core.Nodeid; | 
| 44 import org.tmatesoft.hg.internal.BasicSessionContext; | 44 import org.tmatesoft.hg.internal.BasicSessionContext; | 
| 45 import org.tmatesoft.hg.internal.ByteArrayChannel; | 45 import org.tmatesoft.hg.internal.ByteArrayChannel; | 
| 46 import org.tmatesoft.hg.internal.DigestHelper; | 46 import org.tmatesoft.hg.internal.DigestHelper; | 
| 47 import org.tmatesoft.hg.internal.PathGlobMatcher; | 47 import org.tmatesoft.hg.internal.PathGlobMatcher; | 
| 48 import org.tmatesoft.hg.internal.PhasesHelper; | |
| 48 import org.tmatesoft.hg.internal.RelativePathRewrite; | 49 import org.tmatesoft.hg.internal.RelativePathRewrite; | 
| 50 import org.tmatesoft.hg.internal.RevisionDescendants; | |
| 49 import org.tmatesoft.hg.internal.StreamLogFacility; | 51 import org.tmatesoft.hg.internal.StreamLogFacility; | 
| 50 import org.tmatesoft.hg.repo.HgBranches; | 52 import org.tmatesoft.hg.repo.HgBranches; | 
| 51 import org.tmatesoft.hg.repo.HgChangelog; | 53 import org.tmatesoft.hg.repo.HgChangelog; | 
| 52 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 54 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 
| 53 import org.tmatesoft.hg.repo.HgDataFile; | 55 import org.tmatesoft.hg.repo.HgDataFile; | 
| 57 import org.tmatesoft.hg.repo.HgIgnore; | 59 import org.tmatesoft.hg.repo.HgIgnore; | 
| 58 import org.tmatesoft.hg.repo.HgInternals; | 60 import org.tmatesoft.hg.repo.HgInternals; | 
| 59 import org.tmatesoft.hg.repo.HgManifest; | 61 import org.tmatesoft.hg.repo.HgManifest; | 
| 60 import org.tmatesoft.hg.repo.HgManifest.Flags; | 62 import org.tmatesoft.hg.repo.HgManifest.Flags; | 
| 61 import org.tmatesoft.hg.repo.HgMergeState; | 63 import org.tmatesoft.hg.repo.HgMergeState; | 
| 64 import org.tmatesoft.hg.repo.HgParentChildMap; | |
| 65 import org.tmatesoft.hg.repo.HgPhase; | |
| 62 import org.tmatesoft.hg.repo.HgRepository; | 66 import org.tmatesoft.hg.repo.HgRepository; | 
| 63 import org.tmatesoft.hg.repo.HgRuntimeException; | 67 import org.tmatesoft.hg.repo.HgRuntimeException; | 
| 64 import org.tmatesoft.hg.repo.HgStatusCollector; | 68 import org.tmatesoft.hg.repo.HgStatusCollector; | 
| 65 import org.tmatesoft.hg.repo.HgStatusInspector; | 69 import org.tmatesoft.hg.repo.HgStatusInspector; | 
| 66 import org.tmatesoft.hg.repo.HgSubrepoLocation; | 70 import org.tmatesoft.hg.repo.HgSubrepoLocation; | 
| 67 import org.tmatesoft.hg.repo.HgSubrepoLocation.Kind; | 71 import org.tmatesoft.hg.repo.HgSubrepoLocation.Kind; | 
| 72 import org.tmatesoft.hg.repo.ext.MqManager; | |
| 73 import org.tmatesoft.hg.repo.ext.MqManager.PatchRecord; | |
| 68 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | 74 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | 
| 69 import org.tmatesoft.hg.repo.HgRevisionMap; | 75 import org.tmatesoft.hg.repo.HgRevisionMap; | 
| 70 import org.tmatesoft.hg.util.FileWalker; | 76 import org.tmatesoft.hg.util.FileWalker; | 
| 71 import org.tmatesoft.hg.util.LogFacility; | 77 import org.tmatesoft.hg.util.LogFacility; | 
| 72 import org.tmatesoft.hg.util.Pair; | 78 import org.tmatesoft.hg.util.Pair; | 
| 100 public static void main(String[] args) throws Exception { | 106 public static void main(String[] args) throws Exception { | 
| 101 Main m = new Main(args); | 107 Main m = new Main(args); | 
| 102 // m.checkWalkFileRevisions(); | 108 // m.checkWalkFileRevisions(); | 
| 103 // m.checkSubProgress(); | 109 // m.checkSubProgress(); | 
| 104 // m.checkFileFlags(); | 110 // m.checkFileFlags(); | 
| 111 m.testMqManager(); | |
| 112 // m.testRevisionDescendants(); | |
| 113 // m.dumpPhases(); | |
| 105 // m.buildFileLog(); | 114 // m.buildFileLog(); | 
| 106 // m.testConsoleLog(); | 115 // m.testConsoleLog(); | 
| 107 // m.testTreeTraversal(); | 116 // m.testTreeTraversal(); | 
| 108 // m.testRevisionMap(); | 117 // m.testRevisionMap(); | 
| 109 m.testSubrepos(); | 118 m.testSubrepos(); | 
| 122 // m.dumpCompleteManifestLow(); | 131 // m.dumpCompleteManifestLow(); | 
| 123 // m.dumpCompleteManifestHigh(); | 132 // m.dumpCompleteManifestHigh(); | 
| 124 // m.bunchOfTests(); | 133 // m.bunchOfTests(); | 
| 125 } | 134 } | 
| 126 | 135 | 
| 136 | |
| 137 // TODO as junit tests in 'default' | |
| 138 // -R ${system_property:user.home}/hg/test-mq | |
| 139 private void testMqManager() throws Exception { | |
| 140 MqManager mqManager = new MqManager(hgRepo); | |
| 141 mqManager.refresh(); | |
| 142 int i = 1; | |
| 143 System.out.println("Complete patch queue:"); | |
| 144 for (PatchRecord pr : mqManager.getAllKnownPatches()) { | |
| 145 System.out.printf("#%-3d %s from %s\n", i++, pr.getName(), pr.getPatchLocation()); | |
| 146 } | |
| 147 i = 1; | |
| 148 System.out.println("Patches from the queue already applied to the repo:"); | |
| 149 for (PatchRecord pr : mqManager.getAppliedPatches()) { | |
| 150 System.out.printf("#%-3d %s, known as cset:%s\n", i++, pr.getName(), pr.getRevision().shortNotation()); | |
| 151 } | |
| 152 boolean allAppliedAreKnown = mqManager.getAllKnownPatches().containsAll(mqManager.getAppliedPatches()); | |
| 153 System.out.printf("[sanity] allAppliedAreKnown:%b, not yet applied:%d\n", allAppliedAreKnown, mqManager.getQueueSize()); | |
| 154 Assert.assertTrue(allAppliedAreKnown); | |
| 155 | |
| 156 System.out.printf("Queues: %s, active:%s\n", mqManager.getQueueNames(), mqManager.getActiveQueueName()); | |
| 157 Assert.assertTrue(mqManager.getQueueNames().size() > 1); | |
| 158 Assert.assertTrue(mqManager.getActiveQueueName().length() > 0); | |
| 159 } | |
| 160 | |
| 161 | |
| 162 // -R {junit-test-repos}/branches-1 | |
| 163 private void testRevisionDescendants() throws Exception { | |
| 164 int[] roots = new int[] {0, 1, 2, 3, 4, 5}; | |
| 165 RevisionDescendants[] result = new RevisionDescendants[roots.length]; | |
| 166 for (int i = 0; i < roots.length; i++) { | |
| 167 result[i] = new RevisionDescendants(hgRepo, roots[i]); | |
| 168 result[i].build(); | |
| 169 } | |
| 170 for (int i = 0; i < roots.length; i++) { | |
| 171 System.out.printf("For root %d descendats are:", roots[i]); | |
| 172 for (int j = roots[i], x = hgRepo.getChangelog().getLastRevision(); j <= x; j++) { | |
| 173 if (result[i].isDescendant(j)) { | |
| 174 System.out.printf("%3d ", j); | |
| 175 } | |
| 176 } | |
| 177 System.out.printf(", isEmpty:%b\n", !result[i].hasDescendants()); | |
| 178 } | |
| 179 } | |
| 180 | |
| 181 // -R ${system_property:user.home}/hg/test-phases/ | |
| 182 // TODO as junit test | |
| 183 private void dumpPhases() throws Exception { | |
| 184 HgPhase[] result1 = new HgPhase[hgRepo.getChangelog().getRevisionCount()]; | |
| 185 HgPhase[] result2 = new HgPhase[hgRepo.getChangelog().getRevisionCount()]; | |
| 186 final long start1 = System.nanoTime(); | |
| 187 HgParentChildMap<HgChangelog> pw = new HgParentChildMap<HgChangelog>(hgRepo.getChangelog()); | |
| 188 pw.init(); | |
| 189 final long start1bis = System.nanoTime(); | |
| 190 PhasesHelper ph = new PhasesHelper(hgRepo, pw); | |
| 191 for (int i = 0, l = hgRepo.getChangelog().getLastRevision(); i <= l; i++) { | |
| 192 result1[i] = ph.getPhase(i, null); | |
| 193 } | |
| 194 final long start2 = System.nanoTime(); | |
| 195 ph = new PhasesHelper(hgRepo); | |
| 196 for (int i = 0, l = hgRepo.getChangelog().getLastRevision(); i <= l; i++) { | |
| 197 result2[i] = ph.getPhase(i, null); | |
| 198 } | |
| 199 final long end = System.nanoTime(); | |
| 200 System.out.printf("With ParentWalker(simulates log command for whole repo): %d ms (pw init: %,d ns)\n", (start2 - start1)/1000, start1bis - start1); | |
| 201 printPhases(result1); | |
| 202 System.out.printf("Without ParentWalker (simulates log command for single file): %d ms\n", (end - start2)/1000); | |
| 203 printPhases(result2); | |
| 204 } | |
| 205 | |
| 206 private static void printPhases(HgPhase[] phase) { | |
| 207 for (int i = 0; i < phase.length; i++) { | |
| 208 System.out.printf("rev:%3d, phase:%s\n", i, phase[i]); | |
| 209 } | |
| 210 } | |
| 211 | |
| 127 // hg4j repo | 212 // hg4j repo | 
| 128 public void checkWalkFileRevisions() throws Exception { | 213 public void checkWalkFileRevisions() throws Exception { | 
| 129 // hg --debug manifest --rev 150 | grep cmdline/org/tmatesoft/hg/console/Main.java | 214 // hg --debug manifest --rev 150 | grep cmdline/org/tmatesoft/hg/console/Main.java | 
| 130 hgRepo.getManifest().walkFileRevisions(Path.create("cmdline/org/tmatesoft/hg/console/Main.java"), new ManifestDump(), 100, 150, 200, 210, 300); | 215 hgRepo.getManifest().walkFileRevisions(Path.create("cmdline/org/tmatesoft/hg/console/Main.java"), new ManifestDump(), 100, 150, 200, 210, 300); | 
| 131 } | 216 } | 
| 132 | 217 | 
| 133 // no repo | 218 // no repo | 
| 219 // FIXME as test, perhaps in TestAuxUtilities | |
| 134 private void checkSubProgress() { | 220 private void checkSubProgress() { | 
| 135 ProgressSupport ps = new ProgressSupport() { | 221 ProgressSupport ps = new ProgressSupport() { | 
| 136 private int units; | 222 private int units; | 
| 137 | 223 | 
| 138 public void start(int totalUnits) { | 224 public void start(int totalUnits) { | 
| 174 System.out.println("Link: " + link.getFlags(TIP)); | 260 System.out.println("Link: " + link.getFlags(TIP)); | 
| 175 System.out.println("Exec: " + exec.getFlags(TIP)); | 261 System.out.println("Exec: " + exec.getFlags(TIP)); | 
| 176 System.out.println("File: " + file.getFlags(TIP)); | 262 System.out.println("File: " + file.getFlags(TIP)); | 
| 177 } | 263 } | 
| 178 | 264 | 
| 265 | |
| 179 private void buildFileLog() throws Exception { | 266 private void buildFileLog() throws Exception { | 
| 267 final long start = System.nanoTime(); | |
| 180 HgLogCommand cmd = new HgLogCommand(hgRepo); | 268 HgLogCommand cmd = new HgLogCommand(hgRepo); | 
| 181 cmd.file("file1", false); | 269 cmd.file("file1", false); | 
| 182 cmd.execute(new HgChangesetTreeHandler() { | 270 cmd.execute(new HgChangesetTreeHandler() { | 
| 183 public void treeElement(HgChangesetTreeHandler.TreeElement entry) { | 271 public void treeElement(HgChangesetTreeHandler.TreeElement entry) { | 
| 184 StringBuilder sb = new StringBuilder(); | 272 StringBuilder sb = new StringBuilder(); | 
| 191 } | 279 } | 
| 192 final Pair<Nodeid, Nodeid> parents = entry.parentRevisions(); | 280 final Pair<Nodeid, Nodeid> parents = entry.parentRevisions(); | 
| 193 final boolean isJoin = !parents.first().isNull() && !parents.second().isNull(); | 281 final boolean isJoin = !parents.first().isNull() && !parents.second().isNull(); | 
| 194 final boolean isFork = entry.children().size() > 1; | 282 final boolean isFork = entry.children().size() > 1; | 
| 195 final HgChangeset cset = entry.changeset(); | 283 final HgChangeset cset = entry.changeset(); | 
| 196 System.out.printf("%d:%s - %s\n", cset.getRevisionIndex(), cset.getNodeid().shortNotation(), cset.getComment()); | 284 System.out.printf("%d:%s - %s (%s)\n", cset.getRevisionIndex(), cset.getNodeid().shortNotation(), cset.getComment(), cset.getPhase()); | 
| 197 if (!isJoin && !isFork && !entry.children().isEmpty()) { | 285 if (!isJoin && !isFork && !entry.children().isEmpty()) { | 
| 198 System.out.printf("\t=> %s\n", sb); | 286 System.out.printf("\t=> %s\n", sb); | 
| 199 } | 287 } | 
| 200 if (isJoin) { | 288 if (isJoin) { | 
| 201 HgChangeset p1 = entry.parents().first(); | 289 HgChangeset p1 = entry.parents().first(); | 
| 214 if (isJoin || isFork) { | 302 if (isJoin || isFork) { | 
| 215 System.out.println(); | 303 System.out.println(); | 
| 216 } | 304 } | 
| 217 } | 305 } | 
| 218 }); | 306 }); | 
| 307 final long end = System.nanoTime(); | |
| 308 System.out.printf("buildFileLog: %,d ms\n", (end-start)/1000); | |
| 219 } | 309 } | 
| 220 | 310 | 
| 221 private void buildFileLogOld() throws Exception { | 311 private void buildFileLogOld() throws Exception { | 
| 222 final HgDataFile fn = hgRepo.getFileNode("file1"); | 312 final HgDataFile fn = hgRepo.getFileNode("file1"); | 
| 223 final int[] fileChangesetRevisions = new int[fn.getRevisionCount()]; | 313 final int[] fileChangesetRevisions = new int[fn.getRevisionCount()]; | 
