Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/Revlog.java @ 694:7efabe0cddcf
Speed up (a) file rename history to minimize file reads; (b) file.isCopy(int) to read metadata for few revisions at once (use pattern assumes earlier revisions are likely to be queried, too); (c) HgIgnore.isIgnored by caching matched initial fragments (to substitute more expensive Matcher.matches with cheaper HashMap.contains)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 05 Aug 2013 17:42:10 +0200 |
parents | 32b0d19e8aba |
children | 053bb4397bf9 |
comparison
equal
deleted
inserted
replaced
693:32b0d19e8aba | 694:7efabe0cddcf |
---|---|
332 | 332 |
333 /** | 333 /** |
334 * EXPERIMENTAL CODE, DO NOT USE | 334 * EXPERIMENTAL CODE, DO NOT USE |
335 * | 335 * |
336 * Alternative revlog iteration | 336 * Alternative revlog iteration |
337 * There's an implicit ordering of inspectors. Less inspector needs, earlier its invocation occurs. | |
338 * E.g. ParentInspector goes after RevisionInspector. LinkRevisionInspector goes before RevisionInspector | |
337 * | 339 * |
338 * @param start | 340 * @param start |
339 * @param end | 341 * @param end |
340 * @param inspector | 342 * @param inspector |
341 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 343 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> |
347 if (end == TIP) { | 349 if (end == TIP) { |
348 end = lastRev; | 350 end = lastRev; |
349 } | 351 } |
350 final RevisionInspector revisionInsp = Adaptable.Factory.getAdapter(inspector, RevisionInspector.class, null); | 352 final RevisionInspector revisionInsp = Adaptable.Factory.getAdapter(inspector, RevisionInspector.class, null); |
351 final ParentInspector parentInsp = Adaptable.Factory.getAdapter(inspector, ParentInspector.class, null); | 353 final ParentInspector parentInsp = Adaptable.Factory.getAdapter(inspector, ParentInspector.class, null); |
354 final LinkRevisionInspector linkRevInspector = Adaptable.Factory.getAdapter(inspector, LinkRevisionInspector.class, null); | |
352 final Nodeid[] allRevisions = parentInsp == null ? null : new Nodeid[end - _start + 1]; | 355 final Nodeid[] allRevisions = parentInsp == null ? null : new Nodeid[end - _start + 1]; |
353 // next are to build set of parent indexes that are not part of the range iteration | 356 // next are to build set of parent indexes that are not part of the range iteration |
354 // i.e. those parents we need to read separately. See Issue 31 for details. | 357 // i.e. those parents we need to read separately. See Issue 31 for details. |
355 final int[] firstParentIndexes = parentInsp == null || _start == 0 ? null : new int[allRevisions.length]; | 358 final int[] firstParentIndexes = parentInsp == null || _start == 0 ? null : new int[allRevisions.length]; |
356 final int[] secondParentIndexes = parentInsp == null || _start == 0 ? null : new int[allRevisions.length]; | 359 final int[] secondParentIndexes = parentInsp == null || _start == 0 ? null : new int[allRevisions.length]; |
358 | 361 |
359 content.iterate(_start, end, false, new RevlogStream.Inspector() { | 362 content.iterate(_start, end, false, new RevlogStream.Inspector() { |
360 private int i = 0; | 363 private int i = 0; |
361 | 364 |
362 public void next(int revisionIndex, int actualLen, int baseRevIndex, int linkRevIndex, int parent1RevIndex, int parent2RevIndex, byte[] nodeid, DataAccess data) throws HgRuntimeException { | 365 public void next(int revisionIndex, int actualLen, int baseRevIndex, int linkRevIndex, int parent1RevIndex, int parent2RevIndex, byte[] nodeid, DataAccess data) throws HgRuntimeException { |
366 // FIXME refactor either as chain of RevlogStream.Inspector or an external AnyOf() runner not to keep everything | |
367 // in a single method | |
368 if (linkRevInspector != null) { | |
369 linkRevInspector.next(revisionIndex, linkRevIndex); | |
370 if (parentInsp == null && revisionInsp == null) { | |
371 return; | |
372 } | |
373 } | |
363 Nodeid nid = Nodeid.fromBinary(nodeid, 0); | 374 Nodeid nid = Nodeid.fromBinary(nodeid, 0); |
364 if (revisionInsp != null) { | 375 if (revisionInsp != null) { |
365 revisionInsp.next(revisionIndex, nid, linkRevIndex); | 376 revisionInsp.next(revisionIndex, nid, linkRevIndex); |
366 } | 377 } |
367 if (parentInsp != null) { | 378 if (parentInsp != null) { |
438 public interface RevisionInspector extends Inspector { | 449 public interface RevisionInspector extends Inspector { |
439 void next(int revisionIndex, Nodeid revision, int linkedRevisionIndex) throws HgRuntimeException; | 450 void next(int revisionIndex, Nodeid revision, int linkedRevisionIndex) throws HgRuntimeException; |
440 } | 451 } |
441 | 452 |
442 @Experimental | 453 @Experimental |
454 public interface LinkRevisionInspector extends Inspector { | |
455 void next(int revisionIndex, int linkedRevisionIndex) throws HgRuntimeException; | |
456 } | |
457 | |
458 @Experimental | |
443 public interface ParentInspector extends Inspector { | 459 public interface ParentInspector extends Inspector { |
444 // XXX document whether parentX is -1 or a constant (BAD_REVISION? or dedicated?) | 460 // XXX document whether parentX is -1 or a constant (BAD_REVISION? or dedicated?) |
445 void next(int revisionIndex, Nodeid revision, int parent1, int parent2, Nodeid nidParent1, Nodeid nidParent2) throws HgRuntimeException; | 461 void next(int revisionIndex, Nodeid revision, int parent1, int parent2, Nodeid nidParent1, Nodeid nidParent2) throws HgRuntimeException; |
446 } | 462 } |
447 | 463 |