Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgDataFile.java @ 495:abfbe81154b5
Do not use exception when only metadata processing is needed. For hg4j repo, status 0:-1 changed from 500 to 60 ms
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Fri, 19 Oct 2012 16:03:21 +0200 | 
| parents | b3c16d1aede0 | 
| children | e4ee4bf4c7d0 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 494:2743641f2f12 | 495:abfbe81154b5 | 
|---|---|
| 43 import org.tmatesoft.hg.util.CancelledException; | 43 import org.tmatesoft.hg.util.CancelledException; | 
| 44 import org.tmatesoft.hg.util.LogFacility; | 44 import org.tmatesoft.hg.util.LogFacility; | 
| 45 import org.tmatesoft.hg.util.Pair; | 45 import org.tmatesoft.hg.util.Pair; | 
| 46 import org.tmatesoft.hg.util.Path; | 46 import org.tmatesoft.hg.util.Path; | 
| 47 import org.tmatesoft.hg.util.ProgressSupport; | 47 import org.tmatesoft.hg.util.ProgressSupport; | 
| 48 | |
| 49 | 48 | 
| 50 | 49 | 
| 51 /** | 50 /** | 
| 52 * Regular user data file stored in the repository. | 51 * Regular user data file stored in the repository. | 
| 53 * | 52 * | 
| 438 sb.append(')'); | 437 sb.append(')'); | 
| 439 return sb.toString(); | 438 return sb.toString(); | 
| 440 } | 439 } | 
| 441 | 440 | 
| 442 private void checkAndRecordMetadata(int localRev) throws HgInvalidControlFileException { | 441 private void checkAndRecordMetadata(int localRev) throws HgInvalidControlFileException { | 
| 443 // content() always initializes metadata. | 442 if (metadata == null) { | 
| 444 // TODO [post-1.0] this is expensive way to find out metadata, distinct RevlogStream.Iterator would be better. | 443 metadata = new Metadata(); | 
| 445 // Alternatively, may parameterize MetadataContentPipe to do prepare only. | 444 } | 
| 446 // For reference, when throwing CancelledException, hg status -A --rev 3:80 takes 70 ms | 445 // use MetadataInspector without delegate to process metadata only | 
| 447 // however, if we just consume buffer instead (buffer.position(buffer.limit()), same command takes ~320ms | 446 RevlogStream.Inspector insp = new MetadataInspector(metadata, getRepo().getSessionContext().getLog(), null); | 
| 448 // (compared to command-line counterpart of 190ms) | 447 super.content.iterate(localRev, localRev, true, insp); | 
| 449 try { | |
| 450 content(localRev, new ByteChannel() { // No-op channel | |
| 451 public int write(ByteBuffer buffer) throws IOException, CancelledException { | |
| 452 throw new CancelledException(); | |
| 453 } | |
| 454 }); | |
| 455 } catch (CancelledException ex) { | |
| 456 // it's ok, we did that | |
| 457 } catch (HgInvalidControlFileException ex) { | |
| 458 throw ex.isRevisionIndexSet() ? ex : ex.setRevisionIndex(localRev); | |
| 459 } | |
| 460 } | 448 } | 
| 461 | 449 | 
| 462 private static final class MetadataEntry { | 450 private static final class MetadataEntry { | 
| 463 private final String entry; | 451 private final String entry; | 
| 464 private final int valueStart; | 452 private final int valueStart; | 
| 551 private static class MetadataInspector extends ErrorHandlingInspector implements RevlogStream.Inspector { | 539 private static class MetadataInspector extends ErrorHandlingInspector implements RevlogStream.Inspector { | 
| 552 private final Metadata metadata; | 540 private final Metadata metadata; | 
| 553 private final RevlogStream.Inspector delegate; | 541 private final RevlogStream.Inspector delegate; | 
| 554 private final LogFacility log; | 542 private final LogFacility log; | 
| 555 | 543 | 
| 544 /** | |
| 545 * @param _metadata never <code>null</code> | |
| 546 * @param logFacility log facility from the session context | |
| 547 * @param chain <code>null</code> if no further data processing other than metadata is desired | |
| 548 */ | |
| 556 public MetadataInspector(Metadata _metadata, LogFacility logFacility, RevlogStream.Inspector chain) { | 549 public MetadataInspector(Metadata _metadata, LogFacility logFacility, RevlogStream.Inspector chain) { | 
| 557 metadata = _metadata; | 550 metadata = _metadata; | 
| 558 log = logFacility; | 551 log = logFacility; | 
| 559 delegate = chain; | 552 delegate = chain; | 
| 560 setCancelSupport(CancelSupport.Factory.get(chain)); | 553 setCancelSupport(CancelSupport.Factory.get(chain)); | 
