Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 423:9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 23 Mar 2012 22:51:18 +0100 |
| parents | 7f136a3fa671 |
| children | 6437d261048a |
comparison
equal
deleted
inserted
replaced
| 422:5d1cc7366d04 | 423:9c9c442b5f2e |
|---|---|
| 30 import java.util.Locale; | 30 import java.util.Locale; |
| 31 import java.util.Map; | 31 import java.util.Map; |
| 32 import java.util.TimeZone; | 32 import java.util.TimeZone; |
| 33 | 33 |
| 34 import org.tmatesoft.hg.core.HgBadArgumentException; | 34 import org.tmatesoft.hg.core.HgBadArgumentException; |
| 35 import org.tmatesoft.hg.core.HgException; | |
| 36 import org.tmatesoft.hg.core.HgInvalidControlFileException; | |
| 37 import org.tmatesoft.hg.core.HgInvalidRevisionException; | |
| 38 import org.tmatesoft.hg.core.Nodeid; | 35 import org.tmatesoft.hg.core.Nodeid; |
| 36 import org.tmatesoft.hg.internal.Callback; | |
| 39 import org.tmatesoft.hg.internal.DataAccess; | 37 import org.tmatesoft.hg.internal.DataAccess; |
| 40 import org.tmatesoft.hg.internal.IterateControlMediator; | 38 import org.tmatesoft.hg.internal.IterateControlMediator; |
| 41 import org.tmatesoft.hg.internal.Lifecycle; | 39 import org.tmatesoft.hg.internal.Lifecycle; |
| 42 import org.tmatesoft.hg.internal.Pool; | 40 import org.tmatesoft.hg.internal.Pool; |
| 43 import org.tmatesoft.hg.internal.RevlogStream; | 41 import org.tmatesoft.hg.internal.RevlogStream; |
| 105 public RawChangeset changeset(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException { | 103 public RawChangeset changeset(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException { |
| 106 int x = getRevisionIndex(nid); | 104 int x = getRevisionIndex(nid); |
| 107 return range(x, x).get(0); | 105 return range(x, x).get(0); |
| 108 } | 106 } |
| 109 | 107 |
| 108 @Callback | |
| 110 public interface Inspector { | 109 public interface Inspector { |
| 111 // TODO describe whether cset is new instance each time | 110 /** |
| 112 // describe what revisionNumber is when Inspector is used with HgBundle (BAD_REVISION or bundle's local order?) | 111 * Access next changeset |
| 113 void next(int revisionNumber, Nodeid nodeid, RawChangeset cset); | 112 * TODO describe what revisionNumber is when Inspector is used with HgBundle (BAD_REVISION or bundle's local order?) |
| 113 * | |
| 114 * @param revisionIndex index of revision being inspected, local to the inspected object | |
| 115 * @param nodeid revision being inspected | |
| 116 * @param cset changeset raw data | |
| 117 */ | |
| 118 void next(int revisionIndex, Nodeid nodeid, RawChangeset cset); | |
| 114 } | 119 } |
| 115 | 120 |
| 116 /** | 121 /** |
| 117 * Unlike regular {@link Inspector}, this one supplies changeset revision along with its parents and children according | 122 * Unlike regular {@link Inspector}, this one supplies changeset revision along with its parents and children according |
| 118 * to parent information of the revlog this inspector visits. | 123 * to parent information of the revlog this inspector visits. |
| 384 inspector = delegate; | 389 inspector = delegate; |
| 385 usersPool = new Pool<String>(); | 390 usersPool = new Pool<String>(); |
| 386 progressHelper = ProgressSupport.Factory.get(delegate); | 391 progressHelper = ProgressSupport.Factory.get(delegate); |
| 387 } | 392 } |
| 388 | 393 |
| 389 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) throws HgException { | 394 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { |
| 390 try { | 395 try { |
| 391 byte[] data = da.byteArray(); | 396 byte[] data = da.byteArray(); |
| 392 cset.init(data, 0, data.length, usersPool); | 397 cset.init(data, 0, data.length, usersPool); |
| 393 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse | 398 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse |
| 394 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); | 399 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); |
| 395 progressHelper.worked(1); | 400 progressHelper.worked(1); |
| 401 } catch (HgBadArgumentException ex) { | |
| 402 // see below about better exception | |
| 403 throw new HgInvalidControlFileException("Failed reading changelog", ex, null).setRevisionIndex(revisionNumber); | |
| 396 } catch (IOException ex) { | 404 } catch (IOException ex) { |
| 397 throw new HgException(ex); // XXX need better exception, perhaps smth like HgChangelogException (extends HgInvalidControlFileException) | 405 // XXX need better exception, perhaps smth like HgChangelogException (extends HgInvalidControlFileException) |
| 406 throw new HgInvalidControlFileException("Failed reading changelog", ex, null).setRevisionIndex(revisionNumber); | |
| 398 } | 407 } |
| 399 if (iterateControl != null) { | 408 if (iterateControl != null) { |
| 400 iterateControl.checkCancelled(); | 409 iterateControl.checkCancelled(); |
| 401 } | 410 } |
| 402 } | 411 } |
