Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/HgStatusCommand.java @ 582:90df078d6418
Delegate cancel to original support, do not implement CancelSupport ourselves
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 22 Apr 2013 19:17:29 +0200 |
parents | 2f9ed6bcefa2 |
children | 98ff1fb49abe |
comparison
equal
deleted
inserted
replaced
581:0890628ed51e | 582:90df078d6418 |
---|---|
21 import static org.tmatesoft.hg.repo.HgRepository.*; | 21 import static org.tmatesoft.hg.repo.HgRepository.*; |
22 | 22 |
23 import java.io.IOException; | 23 import java.io.IOException; |
24 import java.util.ConcurrentModificationException; | 24 import java.util.ConcurrentModificationException; |
25 | 25 |
26 import org.tmatesoft.hg.internal.AdapterPlug; | |
26 import org.tmatesoft.hg.internal.ChangelogHelper; | 27 import org.tmatesoft.hg.internal.ChangelogHelper; |
27 import org.tmatesoft.hg.internal.Internals; | 28 import org.tmatesoft.hg.internal.Internals; |
28 import org.tmatesoft.hg.repo.HgRepository; | 29 import org.tmatesoft.hg.repo.HgRepository; |
29 import org.tmatesoft.hg.repo.HgRuntimeException; | 30 import org.tmatesoft.hg.repo.HgRuntimeException; |
30 import org.tmatesoft.hg.repo.HgStatusCollector; | 31 import org.tmatesoft.hg.repo.HgStatusCollector; |
31 import org.tmatesoft.hg.repo.HgStatusInspector; | 32 import org.tmatesoft.hg.repo.HgStatusInspector; |
32 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | 33 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; |
34 import org.tmatesoft.hg.util.Adaptable; | |
33 import org.tmatesoft.hg.util.CancelSupport; | 35 import org.tmatesoft.hg.util.CancelSupport; |
34 import org.tmatesoft.hg.util.CancelledException; | 36 import org.tmatesoft.hg.util.CancelledException; |
35 import org.tmatesoft.hg.util.Path; | 37 import org.tmatesoft.hg.util.Path; |
36 import org.tmatesoft.hg.util.Outcome; | 38 import org.tmatesoft.hg.util.Outcome; |
37 | 39 |
194 sc.change(endRevision, mediator); | 196 sc.change(endRevision, mediator); |
195 } else { | 197 } else { |
196 sc.walk(startRevision, endRevision, mediator); | 198 sc.walk(startRevision, endRevision, mediator); |
197 } | 199 } |
198 } | 200 } |
199 } catch (CancelledException ex) { | |
200 // this is our exception, thrown from Mediator. | |
201 // next check shall throw original cause of the stop - either HgCallbackTargetException or original CancelledException | |
202 mediator.checkFailure(); | 201 mediator.checkFailure(); |
203 } catch (HgRuntimeException ex) { | 202 } catch (HgRuntimeException ex) { |
204 throw new HgLibraryFailureException(ex); | 203 throw new HgLibraryFailureException(ex); |
205 } finally { | 204 } finally { |
206 mediator.done(); | 205 mediator.done(); |
207 } | 206 } |
208 } | 207 } |
209 | 208 |
210 private class Mediator implements HgStatusInspector, CancelSupport { | 209 private class Mediator extends AdapterPlug implements HgStatusInspector, Adaptable { |
211 boolean needModified; | 210 boolean needModified; |
212 boolean needAdded; | 211 boolean needAdded; |
213 boolean needRemoved; | 212 boolean needRemoved; |
214 boolean needUnknown; | 213 boolean needUnknown; |
215 boolean needMissing; | 214 boolean needMissing; |
216 boolean needClean; | 215 boolean needClean; |
217 boolean needIgnored; | 216 boolean needIgnored; |
218 boolean needCopies; | 217 boolean needCopies; |
219 HgStatusHandler handler; | 218 HgStatusHandler handler; |
220 private ChangelogHelper logHelper; | 219 private ChangelogHelper logHelper; |
221 private CancelSupport handlerCancelSupport; | |
222 private HgCallbackTargetException failure; | 220 private HgCallbackTargetException failure; |
223 private CancelledException cancellation; | |
224 | 221 |
225 Mediator() { | 222 Mediator() { |
226 } | 223 } |
227 | 224 |
228 public void start(HgStatusHandler h, CancelSupport hcs, ChangelogHelper changelogHelper) { | 225 public void start(HgStatusHandler h, CancelSupport hcs, ChangelogHelper changelogHelper) { |
229 handler = h; | 226 handler = h; |
230 handlerCancelSupport = hcs; | 227 super.attachAdapter(CancelSupport.class, hcs); |
231 logHelper = changelogHelper; | 228 logHelper = changelogHelper; |
232 } | 229 } |
233 | 230 |
234 public void done() { | 231 public void done() { |
235 handler = null; | 232 handler = null; |
236 handlerCancelSupport = null; | 233 super.detachAdapter(CancelSupport.class); |
237 logHelper = null; | 234 logHelper = null; |
238 failure = null; | 235 failure = null; |
239 cancellation = null; | |
240 } | 236 } |
241 | 237 |
242 public boolean busy() { | 238 public boolean busy() { |
243 return handler != null; | 239 return handler != null; |
244 } | 240 } |
245 | 241 |
246 // XXX copy from ChangesetTransformer. Perhaps, can share the code? | 242 // XXX similar code in ChangesetTransformer |
247 public void checkFailure() throws HgCallbackTargetException, CancelledException { | 243 public void checkFailure() throws HgCallbackTargetException { |
248 // do not forget to clear exceptions for reuse of this instance | 244 // do not forget to clear exceptions for reuse of this instance |
249 if (failure != null) { | 245 if (failure != null) { |
250 HgCallbackTargetException toThrow = failure; | 246 HgCallbackTargetException toThrow = failure; |
251 failure = null; | 247 failure = null; |
252 throw toThrow; | 248 throw toThrow; |
253 } | 249 } |
254 if (cancellation != null) { | |
255 CancelledException toThrow = cancellation; | |
256 cancellation = null; | |
257 throw toThrow; | |
258 } | |
259 } | |
260 | |
261 // XXX copy from ChangesetTransformer. code sharing note above applies | |
262 public void checkCancelled() throws CancelledException { | |
263 if (failure != null || cancellation != null) { | |
264 // stop status iteration. Our exception is for the purposes of cancellation only, | |
265 // the one we have stored (this.cancellation) is for user | |
266 throw new CancelledException(); | |
267 } | |
268 } | 250 } |
269 | 251 |
270 private void dispatch(HgStatus s) { | 252 private void dispatch(HgStatus s) { |
271 try { | 253 try { |
272 handler.status(s); | 254 handler.status(s); |
273 handlerCancelSupport.checkCancelled(); | |
274 } catch (HgCallbackTargetException ex) { | 255 } catch (HgCallbackTargetException ex) { |
275 failure = ex; | 256 failure = ex; |
276 } catch (CancelledException ex) { | |
277 cancellation = ex; | |
278 } | 257 } |
279 } | 258 } |
280 | 259 |
281 public void modified(Path fname) { | 260 public void modified(Path fname) { |
282 if (needModified) { | 261 if (needModified) { |
321 } | 300 } |
322 | 301 |
323 public void invalid(Path fname, Exception err) { | 302 public void invalid(Path fname, Exception err) { |
324 try { | 303 try { |
325 handler.error(fname, new Outcome(Outcome.Kind.Failure, "Failed to get file status", err)); | 304 handler.error(fname, new Outcome(Outcome.Kind.Failure, "Failed to get file status", err)); |
326 handlerCancelSupport.checkCancelled(); | |
327 } catch (HgCallbackTargetException ex) { | 305 } catch (HgCallbackTargetException ex) { |
328 failure = ex; | 306 failure = ex; |
329 } catch (CancelledException ex) { | |
330 cancellation = ex; | |
331 } | 307 } |
332 } | 308 } |
333 } | 309 } |
334 } | 310 } |