Mercurial > hg4j
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); |