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 } | 
