comparison src/org/tmatesoft/hg/core/HgLogCommand.java @ 370:a2341e761609

Let callback implementations deliver errors (e,g. own exceptions) to client code
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 22 Dec 2011 02:37:10 +0300
parents 8107b95f4280
children 9517df1ef7ec
comparison
equal deleted inserted replaced
369:091666b87f62 370:a2341e761609
201 } 201 }
202 202
203 /** 203 /**
204 * 204 *
205 * @param handler callback to process changesets. 205 * @param handler callback to process changesets.
206 * @throws HgCallbackTargetException FIXME
207 * @throws HgException FIXME
208 * @throws CancelledException FIXME
206 * @throws IllegalArgumentException when inspector argument is null 209 * @throws IllegalArgumentException when inspector argument is null
207 * @throws ConcurrentModificationException if this log command instance is already running 210 * @throws ConcurrentModificationException if this log command instance is already running
208 */ 211 */
209 public void execute(HgChangesetHandler handler) throws HgDataStreamException, HgInvalidControlFileException, HgCallbackTargetException, CancelledException { 212 public void execute(HgChangesetHandler handler) throws HgCallbackTargetException, HgException, CancelledException {
210 if (handler == null) { 213 if (handler == null) {
211 throw new IllegalArgumentException(); 214 throw new IllegalArgumentException();
212 } 215 }
213 if (csetTransform != null) { 216 if (csetTransform != null) {
214 throw new ConcurrentModificationException(); 217 throw new ConcurrentModificationException();
235 if (handler instanceof FileHistoryHandler) { 238 if (handler instanceof FileHistoryHandler) {
236 HgFileRevision src = new HgFileRevision(repo, fileNode.getCopySourceRevision(), fileNode.getCopySourceName()); 239 HgFileRevision src = new HgFileRevision(repo, fileNode.getCopySourceRevision(), fileNode.getCopySourceName());
237 HgFileRevision dst = new HgFileRevision(repo, fileNode.getRevision(0), fileNode.getPath(), src.getPath()); 240 HgFileRevision dst = new HgFileRevision(repo, fileNode.getRevision(0), fileNode.getPath(), src.getPath());
238 try { 241 try {
239 ((FileHistoryHandler) handler).copy(src, dst); 242 ((FileHistoryHandler) handler).copy(src, dst);
240 } catch (RuntimeException ex) { 243 } catch (HgCallbackTargetException.Wrap ex) {
241 throw new HgCallbackTargetException(ex).setRevision(fileNode.getCopySourceRevision()).setFileName(fileNode.getCopySourceName()); 244 throw new HgCallbackTargetException(ex).setRevision(fileNode.getCopySourceRevision()).setFileName(fileNode.getCopySourceName());
242 } 245 }
243 } 246 }
244 if (limit > 0 && count >= limit) { 247 if (limit > 0 && count >= limit) {
245 // if limit reach, follow is useless. 248 // if limit reach, follow is useless.
257 csetTransform = null; 260 csetTransform = null;
258 progressHelper.done(); 261 progressHelper.done();
259 } 262 }
260 } 263 }
261 264
262 public void execute(HgChangesetTreeHandler handler) throws CancelledException, HgException { 265 /**
266 *
267 * @param handler
268 * @throws HgCallbackTargetException
269 * @throws HgException
270 * @throws CancelledException
271 */
272 public void execute(HgChangesetTreeHandler handler) throws HgCallbackTargetException, HgException, CancelledException {
263 if (handler == null) { 273 if (handler == null) {
264 throw new IllegalArgumentException(); 274 throw new IllegalArgumentException();
265 } 275 }
266 if (csetTransform != null) { 276 if (csetTransform != null) {
267 throw new ConcurrentModificationException(); 277 throw new ConcurrentModificationException();
316 progressHelper.worked(1); 326 progressHelper.worked(1);
317 ph2 = new ProgressSupport.Sub(progressHelper, 2); 327 ph2 = new ProgressSupport.Sub(progressHelper, 2);
318 } else { 328 } else {
319 ph2 = new ProgressSupport.Sub(progressHelper, 3); 329 ph2 = new ProgressSupport.Sub(progressHelper, 3);
320 } 330 }
321 ph2.start(completeHistory.length); 331 try {
322 // XXX shall sort completeHistory according to changeset numbers? 332 ph2.start(completeHistory.length);
323 for (int i = 0; i < completeHistory.length; i++ ) { 333 // XXX shall sort completeHistory according to changeset numbers?
324 final HistoryNode n = completeHistory[i]; 334 for (int i = 0; i < completeHistory.length; i++ ) {
325 handler.next(ei.init(n)); 335 final HistoryNode n = completeHistory[i];
326 ph2.worked(1); 336 handler.next(ei.init(n));
327 cancelHelper.checkCancelled(); 337 ph2.worked(1);
338 cancelHelper.checkCancelled();
339 }
340 } catch (HgCallbackTargetException.Wrap ex) {
341 throw new HgCallbackTargetException(ex);
328 } 342 }
329 progressHelper.done(); 343 progressHelper.done();
330 } 344 }
331 345
332 // 346 //
377 * followed by any changesets. 391 * followed by any changesets.
378 * 392 *
379 * @author Artem Tikhomirov 393 * @author Artem Tikhomirov
380 * @author TMate Software Ltd. 394 * @author TMate Software Ltd.
381 */ 395 */
382 public interface FileHistoryHandler extends HgChangesetHandler { 396 public interface FileHistoryHandler extends HgChangesetHandler { // FIXME move to stanalone class file, perhaps?
383 // XXX perhaps, should distinguish copy from rename? And what about merged revisions and following them? 397 // XXX perhaps, should distinguish copy from rename? And what about merged revisions and following them?
384 void copy(HgFileRevision from, HgFileRevision to); 398 /**
399 * @throws HgCallbackTargetException.Wrap wrapper object for any exception user code may produce. Wrapped exception would get re-thrown with {@link HgCallbackTargetException}
400 */
401 void copy(HgFileRevision from, HgFileRevision to) throws HgCallbackTargetException.Wrap;
385 } 402 }
386 403
387 public static class CollectHandler implements HgChangesetHandler { 404 public static class CollectHandler implements HgChangesetHandler {
388 private final List<HgChangeset> result = new LinkedList<HgChangeset>(); 405 private final List<HgChangeset> result = new LinkedList<HgChangeset>();
389 406