Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/Revlog.java @ 367:2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 16 Dec 2011 15:37:27 +0100 |
| parents | 189dc6dc1c3e |
| children | 8107b95f4280 |
comparison
equal
deleted
inserted
replaced
| 366:189dc6dc1c3e | 367:2fadf8695f8a |
|---|---|
| 135 * @param nid revision to look up | 135 * @param nid revision to look up |
| 136 * @return revision local index in this revlog | 136 * @return revision local index in this revlog |
| 137 * @throws HgInvalidRevisionException if supplied nodeid doesn't identify any revision from this revlog | 137 * @throws HgInvalidRevisionException if supplied nodeid doesn't identify any revision from this revlog |
| 138 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 138 * @throws HgInvalidControlFileException if access to revlog index/data entry failed |
| 139 */ | 139 */ |
| 140 public final int getLocalRevision(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException { | 140 public final int getRevisionIndex(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException { |
| 141 int revision = content.findLocalRevisionNumber(nid); | 141 int revision = content.findRevisionIndex(nid); |
| 142 if (revision == BAD_REVISION) { | 142 if (revision == BAD_REVISION) { |
| 143 throw new HgInvalidRevisionException(String.format("Bad revision of %s", this /*XXX HgDataFile.getPath might be more suitable here*/), nid, null); | 143 throw new HgInvalidRevisionException(String.format("Bad revision of %s", this /*XXX HgDataFile.getPath might be more suitable here*/), nid, null); |
| 144 } | 144 } |
| 145 return revision; | 145 return revision; |
| 146 } | 146 } |
| 147 | |
| 148 /** | |
| 149 * @deprecated use {@link #getRevisionIndex(Nodeid)} instead | |
| 150 */ | |
| 151 @Deprecated | |
| 152 public final int getLocalRevision(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException { | |
| 153 return getRevisionIndex(nid); | |
| 154 } | |
| 155 | |
| 147 | 156 |
| 148 /** | 157 /** |
| 149 * Note, {@link Nodeid#NULL} nodeid is not reported as known in any revlog. | 158 * Note, {@link Nodeid#NULL} nodeid is not reported as known in any revlog. |
| 150 * | 159 * |
| 151 * @param nodeid | 160 * @param nodeid |
| 152 * @return | 161 * @return |
| 153 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 162 * @throws HgInvalidControlFileException if access to revlog index/data entry failed |
| 154 */ | 163 */ |
| 155 public final boolean isKnown(Nodeid nodeid) throws HgInvalidControlFileException { | 164 public final boolean isKnown(Nodeid nodeid) throws HgInvalidControlFileException { |
| 156 final int rn = content.findLocalRevisionNumber(nodeid); | 165 final int rn = content.findRevisionIndex(nodeid); |
| 157 if (BAD_REVISION == rn) { | 166 if (BAD_REVISION == rn) { |
| 158 return false; | 167 return false; |
| 159 } | 168 } |
| 160 if (rn < 0 || rn >= content.revisionCount()) { | 169 if (rn < 0 || rn >= content.revisionCount()) { |
| 161 // Sanity check | 170 // Sanity check |
| 167 /** | 176 /** |
| 168 * Access to revision data as is (decompressed, but otherwise unprocessed, i.e. not parsed for e.g. changeset or manifest entries) | 177 * Access to revision data as is (decompressed, but otherwise unprocessed, i.e. not parsed for e.g. changeset or manifest entries) |
| 169 * @param nodeid | 178 * @param nodeid |
| 170 */ | 179 */ |
| 171 protected void rawContent(Nodeid nodeid, ByteChannel sink) throws HgException, IOException, CancelledException, HgInvalidRevisionException { | 180 protected void rawContent(Nodeid nodeid, ByteChannel sink) throws HgException, IOException, CancelledException, HgInvalidRevisionException { |
| 172 rawContent(getLocalRevision(nodeid), sink); | 181 rawContent(getRevisionIndex(nodeid), sink); |
| 173 } | 182 } |
| 174 | 183 |
| 175 /** | 184 /** |
| 176 * @param revision - repo-local index of this file change (not a changelog revision number!) | 185 * @param revision - repo-local index of this file change (not a changelog revision number!) |
| 177 * FIXME is it necessary to have IOException along with HgException here? | 186 * FIXME is it necessary to have IOException along with HgException here? |
| 281 public interface Inspector { | 290 public interface Inspector { |
| 282 } | 291 } |
| 283 | 292 |
| 284 @Experimental | 293 @Experimental |
| 285 public interface RevisionInspector extends Inspector { | 294 public interface RevisionInspector extends Inspector { |
| 286 void next(int localRevision, Nodeid revision, int linkedRevision); | 295 void next(int revisionIndex, Nodeid revision, int linkedRevision); |
| 287 } | 296 } |
| 288 | 297 |
| 289 @Experimental | 298 @Experimental |
| 290 public interface ParentInspector extends Inspector { | 299 public interface ParentInspector extends Inspector { |
| 291 // XXX document whether parentX is -1 or a constant (BAD_REVISION? or dedicated?) | 300 // XXX document whether parentX is -1 or a constant (BAD_REVISION? or dedicated?) |
| 292 void next(int localRevision, Nodeid revision, int parent1, int parent2, Nodeid nidParent1, Nodeid nidParent2); | 301 void next(int revisionIndex, Nodeid revision, int parent1, int parent2, Nodeid nidParent1, Nodeid nidParent2); |
| 293 } | 302 } |
| 294 | 303 |
| 295 /* | 304 /* |
| 296 * XXX think over if it's better to do either: | 305 * XXX think over if it's better to do either: |
| 297 * pw = getChangelog().new ParentWalker(); pw.init() and pass pw instance around as needed | 306 * pw = getChangelog().new ParentWalker(); pw.init() and pass pw instance around as needed |
| 482 } | 491 } |
| 483 } | 492 } |
| 484 | 493 |
| 485 /** | 494 /** |
| 486 * Effective int to Nodeid and vice versa translation. It's advised to use this class instead of | 495 * Effective int to Nodeid and vice versa translation. It's advised to use this class instead of |
| 487 * multiple {@link Revlog#getLocalRevision(Nodeid)} calls. | 496 * multiple {@link Revlog#getRevisionIndex(Nodeid)} calls. |
| 488 * | 497 * |
| 489 * getLocalRevision(Nodeid) with straightforward lookup approach performs O(n/2) | 498 * getRevisionIndex(Nodeid) with straightforward lookup approach performs O(n/2) |
| 490 * #localRevision() is log(n), plus initialization is O(n) | 499 * #localRevision() is log(n), plus initialization is O(n) |
| 491 */ | 500 */ |
| 492 public final class RevisionMap implements RevisionInspector { | 501 public final class RevisionMap implements RevisionInspector { |
| 493 /* | 502 /* |
| 494 * in fact, initialization is much slower as it instantiates Nodeids, while #getLocalRevision | 503 * in fact, initialization is much slower as it instantiates Nodeids, while #getLocalRevision |
| 510 | 519 |
| 511 public HgRepository getRepo() { | 520 public HgRepository getRepo() { |
| 512 return Revlog.this.getRepo(); | 521 return Revlog.this.getRepo(); |
| 513 } | 522 } |
| 514 | 523 |
| 515 public void next(int localRevision, Nodeid revision, int linkedRevision) { | 524 public void next(int revisionIndex, Nodeid revision, int linkedRevision) { |
| 516 sequential[localRevision] = sorted[localRevision] = revision; | 525 sequential[revisionIndex] = sorted[revisionIndex] = revision; |
| 517 } | 526 } |
| 518 | 527 |
| 519 /** | 528 /** |
| 520 * @return <code>this</code> for convenience. | 529 * @return <code>this</code> for convenience. |
| 521 */ | 530 */ |
| 532 // note, values in ArrayHelper#getReversed are 1-based indexes, not 0-based | 541 // note, values in ArrayHelper#getReversed are 1-based indexes, not 0-based |
| 533 sorted2natural = ah.getReverse(); | 542 sorted2natural = ah.getReverse(); |
| 534 return this; | 543 return this; |
| 535 } | 544 } |
| 536 | 545 |
| 537 public Nodeid revision(int localRevision) { | 546 public Nodeid revision(int revisionIndex) { |
| 538 return sequential[localRevision]; | 547 return sequential[revisionIndex]; |
| 539 } | 548 } |
| 540 public int localRevision(Nodeid revision) { | 549 public int revisionIndex(Nodeid revision) { |
| 541 if (revision == null || revision.isNull()) { | 550 if (revision == null || revision.isNull()) { |
| 542 return BAD_REVISION; | 551 return BAD_REVISION; |
| 543 } | 552 } |
| 544 int x = Arrays.binarySearch(sorted, revision); | 553 int x = Arrays.binarySearch(sorted, revision); |
| 545 if (x < 0) { | 554 if (x < 0) { |
| 546 return BAD_REVISION; | 555 return BAD_REVISION; |
| 547 } | 556 } |
| 548 return sorted2natural[x]-1; | 557 return sorted2natural[x]-1; |
| 558 } | |
| 559 /** | |
| 560 * @deprecated use {@link #revisionIndex(Nodeid)} instead | |
| 561 */ | |
| 562 @Deprecated | |
| 563 public int localRevision(Nodeid revision) { | |
| 564 return revisionIndex(revision); | |
| 549 } | 565 } |
| 550 } | 566 } |
| 551 | 567 |
| 552 protected abstract static class ErrorHandlingInspector implements RevlogStream.Inspector, CancelSupport { | 568 protected abstract static class ErrorHandlingInspector implements RevlogStream.Inspector, CancelSupport { |
| 553 private Exception failure; | 569 private Exception failure; |
