Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/RevlogStream.java @ 347:8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 22 Nov 2011 05:25:57 +0100 |
| parents | 694ebabb5cb3 |
| children | 5f9073eabf06 |
comparison
equal
deleted
inserted
replaced
| 346:6d2c6b2469fc | 347:8da7ade36c57 |
|---|---|
| 22 import java.io.File; | 22 import java.io.File; |
| 23 import java.io.IOException; | 23 import java.io.IOException; |
| 24 import java.util.zip.Inflater; | 24 import java.util.zip.Inflater; |
| 25 | 25 |
| 26 import org.tmatesoft.hg.core.HgBadStateException; | 26 import org.tmatesoft.hg.core.HgBadStateException; |
| 27 import org.tmatesoft.hg.core.HgInvalidRevisionException; | |
| 27 import org.tmatesoft.hg.core.Nodeid; | 28 import org.tmatesoft.hg.core.Nodeid; |
| 28 import org.tmatesoft.hg.repo.HgInternals; | 29 import org.tmatesoft.hg.repo.HgInternals; |
| 29 import org.tmatesoft.hg.repo.HgRepository; | 30 import org.tmatesoft.hg.repo.HgRepository; |
| 30 | 31 |
| 31 | 32 |
| 103 } | 104 } |
| 104 | 105 |
| 105 /** | 106 /** |
| 106 * @throws HgBadStateException if internal read operation failed | 107 * @throws HgBadStateException if internal read operation failed |
| 107 */ | 108 */ |
| 108 public byte[] nodeid(int revision) { | 109 public byte[] nodeid(int revision) throws HgInvalidRevisionException { |
| 109 final int indexSize = revisionCount(); | 110 final int indexSize = revisionCount(); |
| 110 if (revision == TIP) { | 111 if (revision == TIP) { |
| 111 revision = indexSize - 1; | 112 revision = indexSize - 1; |
| 112 } | 113 } |
| 113 if (revision < 0 || revision >= indexSize) { | 114 if (revision < 0 || revision >= indexSize) { |
| 114 throw new IllegalArgumentException(Integer.toString(revision)); | 115 throw new HgInvalidRevisionException(revision).setRevisionIndex(revision, 0, indexSize); |
| 115 } | 116 } |
| 116 DataAccess daIndex = getIndexStream(); | 117 DataAccess daIndex = getIndexStream(); |
| 117 try { | 118 try { |
| 118 int recordOffset = getIndexOffsetInt(revision); | 119 int recordOffset = getIndexOffsetInt(revision); |
| 119 daIndex.seek(recordOffset + 32); | 120 daIndex.seek(recordOffset + 32); |
| 189 | 190 |
| 190 private final int REVLOGV1_RECORD_SIZE = 64; | 191 private final int REVLOGV1_RECORD_SIZE = 64; |
| 191 | 192 |
| 192 // should be possible to use TIP, ALL, or -1, -2, -n notation of Hg | 193 // should be possible to use TIP, ALL, or -1, -2, -n notation of Hg |
| 193 // ? boolean needsNodeid | 194 // ? boolean needsNodeid |
| 194 public void iterate(int start, int end, boolean needData, Inspector inspector) { | 195 public void iterate(int start, int end, boolean needData, Inspector inspector) throws HgInvalidRevisionException { |
| 195 initOutline(); | 196 initOutline(); |
| 196 final int indexSize = revisionCount(); | 197 final int indexSize = revisionCount(); |
| 197 if (indexSize == 0) { | 198 if (indexSize == 0) { |
| 198 return; | 199 return; |
| 199 } | 200 } |
| 222 * revisions are of interest. | 223 * revisions are of interest. |
| 223 * @param sortedRevisions revisions to walk, in ascending order. | 224 * @param sortedRevisions revisions to walk, in ascending order. |
| 224 * @param needData whether inspector needs access to header only | 225 * @param needData whether inspector needs access to header only |
| 225 * @param inspector callback to process entries | 226 * @param inspector callback to process entries |
| 226 */ | 227 */ |
| 227 public void iterate(int[] sortedRevisions, boolean needData, Inspector inspector) { | 228 public void iterate(int[] sortedRevisions, boolean needData, Inspector inspector) throws HgInvalidRevisionException { |
| 228 final int indexSize = revisionCount(); | 229 final int indexSize = revisionCount(); |
| 229 if (indexSize == 0 || sortedRevisions.length == 0) { | 230 if (indexSize == 0 || sortedRevisions.length == 0) { |
| 230 return; | 231 return; |
| 231 } | 232 } |
| 232 if (sortedRevisions[0] > indexSize || sortedRevisions[sortedRevisions.length - 1] > indexSize) { | 233 if (sortedRevisions[0] > indexSize) { |
| 233 throw new IllegalArgumentException(String.format("Can't iterate [%d, %d] in range [0..%d]", sortedRevisions[0], sortedRevisions[sortedRevisions.length - 1], indexSize)); | 234 throw new HgInvalidRevisionException(String.format("Can't iterate [%d, %d] in range [0..%d]", sortedRevisions[0], sortedRevisions[sortedRevisions.length - 1], indexSize), null, sortedRevisions[0]); |
| 235 } | |
| 236 if (sortedRevisions[sortedRevisions.length - 1] > indexSize) { | |
| 237 throw new HgInvalidRevisionException(String.format("Can't iterate [%d, %d] in range [0..%d]", sortedRevisions[0], sortedRevisions[sortedRevisions.length - 1], indexSize), null, sortedRevisions[sortedRevisions.length - 1]); | |
| 234 } | 238 } |
| 235 | 239 |
| 236 ReaderN1 r = new ReaderN1(needData, inspector); | 240 ReaderN1 r = new ReaderN1(needData, inspector); |
| 237 try { | 241 try { |
| 238 r.start(sortedRevisions.length); | 242 r.start(sortedRevisions.length); |
