Mercurial > jhg
changeset 438:0d128e09d70f
Yet another alternative to collect tags for a file
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 19 Apr 2012 19:16:45 +0200 |
parents | 32184ddcf46d |
children | 2bf6f917a7e5 |
files | test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java |
diffstat | 1 files changed, 34 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java Tue Apr 17 22:29:50 2012 +0200 +++ b/test/org/tmatesoft/hg/test/MapTagsToFileRevisions.java Thu Apr 19 19:16:45 2012 +0200 @@ -5,6 +5,7 @@ import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -55,7 +56,7 @@ // revision == 2406 - 5 ms per run (baseRevision == 2406) // revision == 2405 - 69 ms per run (baseRevision == 1403) - private void measurePatchAffectsArbitraryRevisionRead() throws Exception { + public void measurePatchAffectsArbitraryRevisionRead() throws Exception { final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); final DoNothingManifestInspector insp = new DoNothingManifestInspector(); final int revision = 2405; @@ -181,7 +182,7 @@ * each 2000'th revision, total 36 revision: 620 vs 270 * each 3000'th revision, total 24 revision: 410 vs 275 */ - private void revisionMap() throws Exception { + public void revisionMap() throws Exception { final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); final HgChangelog clog = repository.getChangelog(); ArrayList<Nodeid> revisions = new ArrayList<Nodeid>(); @@ -210,7 +211,7 @@ System.out.printf("RevisionMap time: %d ms, of that init() %,d ns\n", (System.nanoTime() - s2) / 1000000, s3 - s2); } - private void changelogWalk() throws Exception { + public void changelogWalk() throws Exception { final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); final long start = System.currentTimeMillis(); repository.getChangelog().all(new HgChangelog.Inspector() { @@ -230,7 +231,7 @@ System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory()); } - private void manifestWalk() throws Exception { + public void manifestWalk() throws Exception { System.out.println(System.getProperty("java.version")); final long start = System.currentTimeMillis(); final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); @@ -272,9 +273,9 @@ return tagLocalRevs; } - private void collectTagsPerFile() throws HgException, CancelledException { + public void collectTagsPerFile() throws HgException, CancelledException { final long start = System.currentTimeMillis(); - final HgRepository repository = new HgLookup().detect(new File("/temp/hg/cpython")); + final HgRepository repository = new HgLookup().detect(new File("/home/artem/hg/cpython")); final HgTags tags = repository.getTags(); // // build cache @@ -295,12 +296,12 @@ System.out.printf("Total time: %d ms\n", System.currentTimeMillis() - start); System.out.println("\nApproach 2"); - collectTagsPerFile_Approach_2(repository, tagLocalRevs, tagLocalRev2TagInfo, allTags, targetPath); + collectTagsPerFile_Approach_2(repository, tagLocalRevs, tagLocalRev2TagInfo, targetPath); } // Approach 1. Build map with all files, their revisions and corresponding tags // - private void collectTagsPerFile_Approach_1(final HgRevisionMap clogrmap, final int[] tagLocalRevs, final TagInfo[] allTags, Path targetPath) throws HgException { + private void collectTagsPerFile_Approach_1(final HgRevisionMap<HgChangelog> clogrmap, final int[] tagLocalRevs, final TagInfo[] allTags, Path targetPath) throws HgException { HgRepository repository = clogrmap.getRepo(); final long start = System.currentTimeMillis(); // file2rev2tag value is array of revisions, always of allTags.length. Revision index in the array @@ -372,20 +373,29 @@ } } - private void collectTagsPerFile_Approach_2(HgRepository repository, final int[] tagLocalRevs, final IntMap<List<TagInfo>> tagLocalRev2TagInfo, TagInfo[] allTags, Path targetPath) throws HgException { + private void collectTagsPerFile_Approach_2(HgRepository repository, final int[] tagLocalRevs, final IntMap<List<TagInfo>> tagRevIndex2TagInfo, Path targetPath) throws HgException { // // Approach 2. No all-file map. Collect file revisions recorded at the time of tagging, // then for each file revision check if it is among those above, and if yes, take corresponding tags HgDataFile fileNode = repository.getFileNode(targetPath); final long start2 = System.nanoTime(); - final int lastRev = fileNode.getLastRevision(); final Map<Integer, Nodeid> fileRevisionAtTagRevision = new HashMap<Integer, Nodeid>(); + final Map<Nodeid, List<String>> fileRev2TagNames = new HashMap<Nodeid, List<String>>(); HgManifest.Inspector collectFileRevAtCset = new HgManifest.Inspector() { private int csetRevIndex; public boolean next(Nodeid nid, Path fname, Flags flags) { fileRevisionAtTagRevision.put(csetRevIndex, nid); + if (tagRevIndex2TagInfo.containsKey(csetRevIndex)) { + List<String> tags = fileRev2TagNames.get(nid); + if (tags == null) { + fileRev2TagNames.put(nid, tags = new ArrayList<String>(3)); + } + for (TagInfo ti : tagRevIndex2TagInfo.get(csetRevIndex)) { + tags.add(ti.name()); + } + } return true; } @@ -399,20 +409,21 @@ } }; repository.getManifest().walkFileRevisions(targetPath, collectFileRevAtCset,tagLocalRevs); - + final long start2a = System.nanoTime(); - fileNode.indexWalk(0, lastRev, new HgDataFile.RevisionInspector() { + fileNode.indexWalk(0, TIP, new HgDataFile.RevisionInspector() { public void next(int fileRevisionIndex, Nodeid fileRevision, int changesetRevisionIndex) { List<String> associatedTags = new LinkedList<String>(); - for (int taggetRevision : tagLocalRevs) { + + for (int taggedRevision : tagLocalRevs) { // current file revision can't appear in tags that point to earlier changelog revisions (they got own file revision) - if (taggetRevision >= changesetRevisionIndex) { + if (taggedRevision >= changesetRevisionIndex) { // z points to some changeset with tag - Nodeid wasKnownAs = fileRevisionAtTagRevision.get(taggetRevision); + Nodeid wasKnownAs = fileRevisionAtTagRevision.get(taggedRevision); if (wasKnownAs.equals(fileRevision)) { // has tag associated with changeset at index z - List<TagInfo> tagsAtRev = tagLocalRev2TagInfo.get(taggetRevision); + List<TagInfo> tagsAtRev = tagRevIndex2TagInfo.get(taggedRevision); assert tagsAtRev != null; for (TagInfo ti : tagsAtRev) { associatedTags.add(ti.name()); @@ -420,9 +431,16 @@ } } } + // System.out.printf("%3d%7d%s\n", fileRevisionIndex, changesetRevisionIndex, associatedTags); } }); + for (int i = 0, lastRev = fileNode.getLastRevision(); i <= lastRev; i++) { + Nodeid fileRevision = fileNode.getRevision(i); + List<String> associatedTags2 = fileRev2TagNames.get(fileRevision); + int changesetRevIndex = fileNode.getChangesetRevisionIndex(i); + System.out.printf("%3d%7d%s\n", i, changesetRevIndex, associatedTags2 == null ? Collections.emptyList() : associatedTags2); + } System.out.printf("Alternative total time: %d ms, of that init: %d ms\n", (System.nanoTime() - start2)/1000000, (start2a-start2)/1000000); System.out.printf("Free mem: %,d\n", Runtime.getRuntime().freeMemory()); }