Mercurial > jhg
diff 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 |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgDataFile.java Thu Oct 18 19:51:07 2012 +0200 +++ b/src/org/tmatesoft/hg/repo/HgDataFile.java Fri Oct 19 16:03:21 2012 +0200 @@ -47,7 +47,6 @@ import org.tmatesoft.hg.util.ProgressSupport; - /** * Regular user data file stored in the repository. * @@ -440,23 +439,12 @@ } private void checkAndRecordMetadata(int localRev) throws HgInvalidControlFileException { - // content() always initializes metadata. - // TODO [post-1.0] this is expensive way to find out metadata, distinct RevlogStream.Iterator would be better. - // Alternatively, may parameterize MetadataContentPipe to do prepare only. - // For reference, when throwing CancelledException, hg status -A --rev 3:80 takes 70 ms - // however, if we just consume buffer instead (buffer.position(buffer.limit()), same command takes ~320ms - // (compared to command-line counterpart of 190ms) - try { - content(localRev, new ByteChannel() { // No-op channel - public int write(ByteBuffer buffer) throws IOException, CancelledException { - throw new CancelledException(); - } - }); - } catch (CancelledException ex) { - // it's ok, we did that - } catch (HgInvalidControlFileException ex) { - throw ex.isRevisionIndexSet() ? ex : ex.setRevisionIndex(localRev); + if (metadata == null) { + metadata = new Metadata(); } + // use MetadataInspector without delegate to process metadata only + RevlogStream.Inspector insp = new MetadataInspector(metadata, getRepo().getSessionContext().getLog(), null); + super.content.iterate(localRev, localRev, true, insp); } private static final class MetadataEntry { @@ -553,6 +541,11 @@ private final RevlogStream.Inspector delegate; private final LogFacility log; + /** + * @param _metadata never <code>null</code> + * @param logFacility log facility from the session context + * @param chain <code>null</code> if no further data processing other than metadata is desired + */ public MetadataInspector(Metadata _metadata, LogFacility logFacility, RevlogStream.Inspector chain) { metadata = _metadata; log = logFacility;