comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 242:ad6a046943be

Improved reading of sparse revisions from a revlog
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 23 Jun 2011 15:19:07 +0200
parents 883300108179
children a6d19adc2636
comparison
equal deleted inserted replaced
241:d3ab16739736 242:ad6a046943be
63 final RawCsetCollector c = new RawCsetCollector(end - start + 1); 63 final RawCsetCollector c = new RawCsetCollector(end - start + 1);
64 range(start, end, c); 64 range(start, end, c);
65 return c.result; 65 return c.result;
66 } 66 }
67 67
68 /**
69 * Access individual revisions. Note, regardless of supplied revision order, inspector gets
70 * changesets strictly in the order they are in the changelog.
71 * @param inspector callback to get changesets
72 * @param revisions revisions to read, unrestricted ordering.
73 */
68 public void range(final HgChangelog.Inspector inspector, final int... revisions) { 74 public void range(final HgChangelog.Inspector inspector, final int... revisions) {
69 if (revisions == null || revisions.length == 0) { 75 Arrays.sort(revisions);
76 rangeInternal(inspector, revisions);
77 }
78
79 /**
80 * Friends-only version of {@link #range(Inspector, int...)}, when callers know array is sorted
81 */
82 /*package-local*/ void rangeInternal(HgChangelog.Inspector inspector, int[] sortedRevisions) {
83 if (sortedRevisions == null || sortedRevisions.length == 0) {
70 return; 84 return;
71 } 85 }
72 RevlogStream.Inspector i = new RevlogStream.Inspector() { 86 if (inspector == null) {
73 private final RawCsetParser delegate = new RawCsetParser(inspector); 87 throw new IllegalArgumentException();
74 88 }
75 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { 89 content.iterate(sortedRevisions, true, new RawCsetParser(inspector));
76 if (Arrays.binarySearch(revisions, revisionNumber) >= 0) {
77 delegate.next(revisionNumber, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeid, da);
78 }
79 }
80 };
81 Arrays.sort(revisions);
82 content.iterate(revisions[0], revisions[revisions.length - 1], true, i);
83 } 90 }
84 91
85 public RawChangeset changeset(Nodeid nid) { 92 public RawChangeset changeset(Nodeid nid) {
86 int x = getLocalRevision(nid); 93 int x = getLocalRevision(nid);
87 return range(x, x).get(0); 94 return range(x, x).get(0);