Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 366:189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 16 Dec 2011 04:43:18 +0100 |
parents | 150500515714 |
children | 2fadf8695f8a |
comparison
equal
deleted
inserted
replaced
365:3572fcb06473 | 366:189dc6dc1c3e |
---|---|
73 | 73 |
74 public HgRepository getRepo() { | 74 public HgRepository getRepo() { |
75 return repo; | 75 return repo; |
76 } | 76 } |
77 | 77 |
78 private ManifestRevision get(int rev) { | 78 private ManifestRevision get(int rev) throws HgInvalidControlFileException { |
79 ManifestRevision i = cache.get(rev); | 79 ManifestRevision i = cache.get(rev); |
80 if (i == null) { | 80 if (i == null) { |
81 if (rev == -1) { | 81 if (rev == -1) { |
82 return emptyFakeState; | 82 return emptyFakeState; |
83 } | 83 } |
98 // assume usually we go from oldest to newest, hence remove oldest as most likely to be no longer necessary | 98 // assume usually we go from oldest to newest, hence remove oldest as most likely to be no longer necessary |
99 cache.removeFromStart(cache.size() - cacheMaxSize + 1 /* room for new element */); | 99 cache.removeFromStart(cache.size() - cacheMaxSize + 1 /* room for new element */); |
100 } | 100 } |
101 } | 101 } |
102 | 102 |
103 private void initCacheRange(int minRev, int maxRev) { | 103 private void initCacheRange(int minRev, int maxRev) throws HgInvalidControlFileException { |
104 ensureCacheSize(); | 104 ensureCacheSize(); |
105 // In fact, walk(minRev, maxRev) doesn't imply | 105 // In fact, walk(minRev, maxRev) doesn't imply |
106 // there would be maxRev-minRev+1 revisions visited. For example, | 106 // there would be maxRev-minRev+1 revisions visited. For example, |
107 // check cpython repo with 'hg log -r 22418:22420 --debug' and admire | 107 // check cpython repo with 'hg log -r 22418:22420 --debug' and admire |
108 // manifest revisions 66650, 21683, 21684. Thus, innocent walk(22418,22420) results in 40k+ revisions and OOME | 108 // manifest revisions 66650, 21683, 21684. Thus, innocent walk(22418,22420) results in 40k+ revisions and OOME |
157 fakeEmptyRev.begin(-1, null, -1); | 157 fakeEmptyRev.begin(-1, null, -1); |
158 fakeEmptyRev.end(-1); | 158 fakeEmptyRev.end(-1); |
159 return fakeEmptyRev; | 159 return fakeEmptyRev; |
160 } | 160 } |
161 | 161 |
162 /*package-local*/ ManifestRevision raw(int rev) { | 162 /*package-local*/ ManifestRevision raw(int rev) throws HgInvalidControlFileException { |
163 return get(rev); | 163 return get(rev); |
164 } | 164 } |
165 /*package-local*/ PathPool getPathPool() { | 165 /*package-local*/ PathPool getPathPool() { |
166 if (pathPool == null) { | 166 if (pathPool == null) { |
167 pathPool = new PathPool(new PathRewrite.Empty()); | 167 pathPool = new PathPool(new PathRewrite.Empty()); |
184 // do not assign null, ever | 184 // do not assign null, ever |
185 scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher; | 185 scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher; |
186 } | 186 } |
187 | 187 |
188 // hg status --change <rev> | 188 // hg status --change <rev> |
189 public void change(int rev, HgStatusInspector inspector) { | 189 public void change(int rev, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { |
190 int[] parents = new int[2]; | 190 int[] parents = new int[2]; |
191 repo.getChangelog().parents(rev, parents, null, null); | 191 repo.getChangelog().parents(rev, parents, null, null); |
192 walk(parents[0], rev, inspector); | 192 walk(parents[0], rev, inspector); |
193 } | 193 } |
194 | 194 |
195 // rev1 and rev2 are changelog revision numbers, argument order matters. | 195 // rev1 and rev2 are changelog revision numbers, argument order matters. |
196 // Either rev1 or rev2 may be -1 to indicate comparison to empty repository (XXX this is due to use of | 196 // Either rev1 or rev2 may be -1 to indicate comparison to empty repository (XXX this is due to use of |
197 // parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets | 197 // parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets |
198 // exposed to e.g. Record | 198 // exposed to e.g. Record |
199 public void walk(int rev1, int rev2, HgStatusInspector inspector) { | 199 public void walk(int rev1, int rev2, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { |
200 if (rev1 == rev2) { | 200 if (rev1 == rev2) { |
201 throw new IllegalArgumentException(); | 201 throw new IllegalArgumentException(); |
202 } | 202 } |
203 if (inspector == null) { | 203 if (inspector == null) { |
204 throw new IllegalArgumentException(); | 204 throw new IllegalArgumentException(); |
282 inspector.removed(r1fname); | 282 inspector.removed(r1fname); |
283 } | 283 } |
284 } | 284 } |
285 } | 285 } |
286 | 286 |
287 public Record status(int rev1, int rev2) { | 287 public Record status(int rev1, int rev2) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { |
288 Record rv = new Record(); | 288 Record rv = new Record(); |
289 walk(rev1, rev2, rv); | 289 walk(rev1, rev2, rv); |
290 return rv; | 290 return rv; |
291 } | 291 } |
292 | 292 |
345 startRev = startRevision; | 345 startRev = startRevision; |
346 endRev = endRevision; | 346 endRev = endRevision; |
347 statusHelper = self; | 347 statusHelper = self; |
348 } | 348 } |
349 | 349 |
350 public Nodeid nodeidBeforeChange(Path fname) { | 350 public Nodeid nodeidBeforeChange(Path fname) throws HgInvalidControlFileException { |
351 if (statusHelper == null || startRev == BAD_REVISION) { | 351 if (statusHelper == null || startRev == BAD_REVISION) { |
352 return null; | 352 return null; |
353 } | 353 } |
354 if ((modified == null || !modified.contains(fname)) && (removed == null || !removed.contains(fname))) { | 354 if ((modified == null || !modified.contains(fname)) && (removed == null || !removed.contains(fname))) { |
355 return null; | 355 return null; |
356 } | 356 } |
357 return statusHelper.raw(startRev).nodeid(fname); | 357 return statusHelper.raw(startRev).nodeid(fname); |
358 } | 358 } |
359 public Nodeid nodeidAfterChange(Path fname) { | 359 public Nodeid nodeidAfterChange(Path fname) throws HgInvalidControlFileException { |
360 if (statusHelper == null || endRev == BAD_REVISION) { | 360 if (statusHelper == null || endRev == BAD_REVISION) { |
361 return null; | 361 return null; |
362 } | 362 } |
363 if ((modified == null || !modified.contains(fname)) && (added == null || !added.contains(fname))) { | 363 if ((modified == null || !modified.contains(fname)) && (added == null || !added.contains(fname))) { |
364 return null; | 364 return null; |