Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 312:f9f3e9b67ccc
Facilitate cancellation and progress reporting in changelog and manifest iterations
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 27 Sep 2011 05:29:12 +0200 |
parents | a6d19adc2636 |
children | 09628675bcee |
comparison
equal
deleted
inserted
replaced
311:b9592e21176a | 312:f9f3e9b67ccc |
---|---|
31 import java.util.TimeZone; | 31 import java.util.TimeZone; |
32 | 32 |
33 import org.tmatesoft.hg.core.HgBadStateException; | 33 import org.tmatesoft.hg.core.HgBadStateException; |
34 import org.tmatesoft.hg.core.Nodeid; | 34 import org.tmatesoft.hg.core.Nodeid; |
35 import org.tmatesoft.hg.internal.DataAccess; | 35 import org.tmatesoft.hg.internal.DataAccess; |
36 import org.tmatesoft.hg.internal.IterateControlMediator; | |
37 import org.tmatesoft.hg.internal.Lifecycle; | |
36 import org.tmatesoft.hg.internal.Pool; | 38 import org.tmatesoft.hg.internal.Pool; |
37 import org.tmatesoft.hg.internal.RevlogStream; | 39 import org.tmatesoft.hg.internal.RevlogStream; |
40 import org.tmatesoft.hg.util.CancelSupport; | |
41 import org.tmatesoft.hg.util.ProgressSupport; | |
38 | 42 |
39 /** | 43 /** |
40 * Representation of the Mercurial changelog file (list of ChangeSets) | 44 * Representation of the Mercurial changelog file (list of ChangeSets) |
41 * | 45 * |
42 * @author Artem Tikhomirov | 46 * @author Artem Tikhomirov |
336 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { | 340 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { |
337 result.add(cset.clone()); | 341 result.add(cset.clone()); |
338 } | 342 } |
339 } | 343 } |
340 | 344 |
341 private static class RawCsetParser implements RevlogStream.Inspector { | 345 private static class RawCsetParser implements RevlogStream.Inspector, Lifecycle { |
342 | 346 |
343 private final Inspector inspector; | 347 private final Inspector inspector; |
344 private final Pool<String> usersPool; | 348 private final Pool<String> usersPool; |
345 private final RawChangeset cset = new RawChangeset(); | 349 private final RawChangeset cset = new RawChangeset(); |
350 private final ProgressSupport progressHelper; | |
351 private IterateControlMediator iterateControl; | |
346 | 352 |
347 public RawCsetParser(HgChangelog.Inspector delegate) { | 353 public RawCsetParser(HgChangelog.Inspector delegate) { |
348 assert delegate != null; | 354 assert delegate != null; |
349 inspector = delegate; | 355 inspector = delegate; |
350 usersPool = new Pool<String>(); | 356 usersPool = new Pool<String>(); |
357 progressHelper = ProgressSupport.Factory.get(delegate); | |
351 } | 358 } |
352 | 359 |
353 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { | 360 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { |
354 try { | 361 try { |
355 byte[] data = da.byteArray(); | 362 byte[] data = da.byteArray(); |
356 cset.init(data, 0, data.length, usersPool); | 363 cset.init(data, 0, data.length, usersPool); |
357 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse | 364 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse |
358 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); | 365 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); |
366 progressHelper.worked(1); | |
359 } catch (Exception ex) { | 367 } catch (Exception ex) { |
360 throw new HgBadStateException(ex); // FIXME exception handling | 368 throw new HgBadStateException(ex); // FIXME exception handling |
361 } | 369 } |
370 if (iterateControl != null) { | |
371 iterateControl.checkCancelled(); | |
372 } | |
373 } | |
374 | |
375 public void start(int count, Callback callback, Object token) { | |
376 CancelSupport cs = CancelSupport.Factory.get(inspector, null); | |
377 iterateControl = cs == null ? null : new IterateControlMediator(cs, callback); | |
378 progressHelper.start(count); | |
379 } | |
380 | |
381 public void finish(Object token) { | |
382 progressHelper.done(); | |
362 } | 383 } |
363 } | 384 } |
364 } | 385 } |