Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/ChangesetTransformer.java @ 215:41a778e3fd31
Issue 5: Facilities for progress and cancellation. More specific exceptions. Exceptions from callbacks as RuntimeException
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 17 May 2011 00:56:54 +0200 |
parents | ffc5f6d59f7e |
children | a674b8590362 |
comparison
equal
deleted
inserted
replaced
214:4252faa556cd | 215:41a778e3fd31 |
---|---|
20 | 20 |
21 import org.tmatesoft.hg.repo.HgChangelog; | 21 import org.tmatesoft.hg.repo.HgChangelog; |
22 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 22 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; |
23 import org.tmatesoft.hg.repo.HgRepository; | 23 import org.tmatesoft.hg.repo.HgRepository; |
24 import org.tmatesoft.hg.repo.HgStatusCollector; | 24 import org.tmatesoft.hg.repo.HgStatusCollector; |
25 import org.tmatesoft.hg.util.CancelSupport; | |
26 import org.tmatesoft.hg.util.CancelledException; | |
25 import org.tmatesoft.hg.util.PathPool; | 27 import org.tmatesoft.hg.util.PathPool; |
26 import org.tmatesoft.hg.util.PathRewrite; | 28 import org.tmatesoft.hg.util.PathRewrite; |
29 import org.tmatesoft.hg.util.ProgressSupport; | |
27 | 30 |
28 /** | 31 /** |
29 * Bridges {@link HgChangelog.RawChangeset} with high-level {@link HgChangeset} API | 32 * Bridges {@link HgChangelog.RawChangeset} with high-level {@link HgChangeset} API |
33 * FIXME move to .internal | |
30 * | 34 * |
31 * @author Artem Tikhomirov | 35 * @author Artem Tikhomirov |
32 * @author TMate Software Ltd. | 36 * @author TMate Software Ltd. |
33 */ | 37 */ |
34 /*package-local*/ class ChangesetTransformer implements HgChangelog.Inspector { | 38 /*package-local*/ class ChangesetTransformer implements HgChangelog.Inspector { |
35 private final HgChangesetHandler handler; | 39 private final HgChangesetHandler handler; |
36 private final HgChangeset changeset; | 40 private final HgChangeset changeset; |
41 private final ProgressSupport progressHelper; | |
42 private final CancelSupport cancelHelper; | |
37 private Set<String> branches; | 43 private Set<String> branches; |
44 private HgCallbackTargetException failure; | |
45 private CancelledException cancellation; | |
38 | 46 |
39 // repo and delegate can't be null, parent walker can | 47 // repo and delegate can't be null, parent walker can |
40 public ChangesetTransformer(HgRepository hgRepo, HgChangesetHandler delegate, HgChangelog.ParentWalker pw) { | 48 // ps and cs can't be null |
49 public ChangesetTransformer(HgRepository hgRepo, HgChangesetHandler delegate, HgChangelog.ParentWalker pw, ProgressSupport ps, CancelSupport cs) { | |
41 if (hgRepo == null || delegate == null) { | 50 if (hgRepo == null || delegate == null) { |
51 throw new IllegalArgumentException(); | |
52 } | |
53 if (ps == null || cs == null) { | |
42 throw new IllegalArgumentException(); | 54 throw new IllegalArgumentException(); |
43 } | 55 } |
44 HgStatusCollector statusCollector = new HgStatusCollector(hgRepo); | 56 HgStatusCollector statusCollector = new HgStatusCollector(hgRepo); |
45 // files listed in a changeset don't need their names to be rewritten (they are normalized already) | 57 // files listed in a changeset don't need their names to be rewritten (they are normalized already) |
46 PathPool pp = new PathPool(new PathRewrite.Empty()); | 58 PathPool pp = new PathPool(new PathRewrite.Empty()); |
47 statusCollector.setPathPool(pp); | 59 statusCollector.setPathPool(pp); |
48 changeset = new HgChangeset(statusCollector, pp); | 60 changeset = new HgChangeset(statusCollector, pp); |
49 changeset.setParentHelper(pw); | 61 changeset.setParentHelper(pw); |
50 handler = delegate; | 62 handler = delegate; |
63 cancelHelper = cs; | |
64 progressHelper = ps; | |
51 } | 65 } |
52 | 66 |
53 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { | 67 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) { |
68 if (failure != null || cancellation != null) { | |
69 return; // FIXME need a better way to stop iterating revlog | |
70 } | |
54 if (branches != null && !branches.contains(cset.branch())) { | 71 if (branches != null && !branches.contains(cset.branch())) { |
55 return; | 72 return; |
56 } | 73 } |
57 | 74 |
58 changeset.init(revisionNumber, nodeid, cset); | 75 changeset.init(revisionNumber, nodeid, cset); |
59 handler.next(changeset); | 76 try { |
77 handler.next(changeset); | |
78 progressHelper.worked(1); | |
79 cancelHelper.checkCancelled(); | |
80 } catch (RuntimeException ex) { | |
81 failure = new HgCallbackTargetException(ex).setRevision(nodeid).setRevisionNumber(revisionNumber); | |
82 } catch (CancelledException ex) { | |
83 cancellation = ex; | |
84 } | |
85 } | |
86 | |
87 public void checkFailure() throws HgCallbackTargetException, CancelledException { | |
88 if (failure != null) { | |
89 HgCallbackTargetException toThrow = failure; | |
90 failure = null; // just in (otherwise unexpected) case this instance would get reused | |
91 throw toThrow; | |
92 } | |
93 if (cancellation != null) { | |
94 CancelledException toThrow = cancellation; | |
95 cancellation = null; | |
96 throw toThrow; | |
97 } | |
60 } | 98 } |
61 | 99 |
62 public void limitBranches(Set<String> branches) { | 100 public void limitBranches(Set<String> branches) { |
63 this.branches = branches; | 101 this.branches = branches; |
64 } | 102 } |