1616import java .util .List ;
1717import java .util .Map ;
1818import java .util .Optional ;
19+ import java .util .PriorityQueue ;
1920import java .util .Set ;
2021import java .util .TreeMap ;
2122import java .util .TreeSet ;
@@ -425,45 +426,46 @@ private boolean notFirstIncludedCommit(final ObjectId from, final ObjectId to) {
425426 /** This can be done recursively but will result in {@link StackOverflowError} for large repos. */
426427 private void populateComitPerTag (
427428 final RevCommit from ,
428- final ObjectId to ,
429+ final RevCommit to ,
429430 final Map <String , Ref > tagPerCommitHash ,
430431 final Map <String , String > tagPerCommitsHash ,
431432 final Map <String , Set <GitCommit >> commitsPerTag ,
432433 final Map <String , Date > datePerTag ,
433434 final String startingTagName )
434435 throws Exception {
435- final Set <TraversalWork > moreWork =
436- this .populateCommitPerTag (
437- from ,
438- to ,
439- commitsPerTag ,
440- tagPerCommitHash ,
441- tagPerCommitsHash ,
442- datePerTag ,
443- startingTagName );
444- do {
445- final Set <TraversalWork > evenMoreWork = new TreeSet <>();
446- for (final TraversalWork tw : new ArrayList <>(moreWork )) {
447- moreWork .remove (tw );
448- final Set <TraversalWork > newWork =
436+
437+ final RevCommit thisCommit = this .revWalk .lookupCommit (to );
438+ this .revWalk .parseHeaders (thisCommit );
439+
440+ final PriorityQueue <TraversalWork > moreWork =
441+ new PriorityQueue <>(
449442 this .populateCommitPerTag (
450443 from ,
451- tw . getTo () ,
444+ to ,
452445 commitsPerTag ,
453446 tagPerCommitHash ,
454447 tagPerCommitsHash ,
455448 datePerTag ,
456- tw .getCurrentTagName ());
457- evenMoreWork .addAll (newWork );
458- }
459- moreWork .addAll (evenMoreWork );
449+ startingTagName ));
450+
451+ while (!moreWork .isEmpty ()) {
452+ final TraversalWork next = moreWork .remove ();
453+ moreWork .addAll (
454+ this .populateCommitPerTag (
455+ from ,
456+ next .getTo (),
457+ commitsPerTag ,
458+ tagPerCommitHash ,
459+ tagPerCommitsHash ,
460+ datePerTag ,
461+ next .getCurrentTagName ()));
460462 LOG .debug ("Work left: " + moreWork .size ());
461- } while (! moreWork . isEmpty ());
463+ }
462464 }
463465
464466 private Set <TraversalWork > populateCommitPerTag (
465467 final RevCommit from ,
466- final ObjectId to ,
468+ final RevCommit to ,
467469 final Map <String , Set <GitCommit >> commitsPerTagName ,
468470 final Map <String , Ref > tagPerCommitHash ,
469471 final Map <String , String > tagPerCommitsHash ,
@@ -474,21 +476,20 @@ private Set<TraversalWork> populateCommitPerTag(
474476 if (this .isMappedToAnotherTag (tagPerCommitsHash , thisCommitHash )) {
475477 return new TreeSet <>();
476478 }
477- final RevCommit thisCommit = this .revWalk .lookupCommit (to );
478- this .revWalk .parseHeaders (thisCommit );
479479 if (this .thisIsANewTag (tagPerCommitHash , thisCommitHash )) {
480480 currentTagName = this .getTagName (tagPerCommitHash , thisCommitHash );
481481 }
482482 if (currentTagName != null ) {
483- if (this .addCommitToCurrentTag (commitsPerTagName , currentTagName , thisCommit )) {
484- datePerTag .put (currentTagName , new Date (thisCommit .getCommitTime () * 1000L ));
483+ if (this .addCommitToCurrentTag (commitsPerTagName , currentTagName , to )) {
484+ datePerTag .put (currentTagName , new Date (to .getCommitTime () * 1000L ));
485485 }
486486 this .noteThatTheCommitWasMapped (tagPerCommitsHash , currentTagName , thisCommitHash );
487487 }
488488 if (this .notFirstIncludedCommit (from , to )) {
489489 final Set <TraversalWork > work = new TreeSet <>();
490- for (final RevCommit parent : thisCommit .getParents ()) {
490+ for (final RevCommit parent : to .getParents ()) {
491491 if (this .shouldInclude (parent )) {
492+ this .revWalk .parseHeaders (parent );
492493 work .add (new TraversalWork (parent , currentTagName ));
493494 }
494495 }
@@ -541,9 +542,7 @@ private GitCommit toGitCommit(final RevCommit revCommit) {
541542 merge );
542543 }
543544
544- /**
545- * @param pathFilter use when filtering commits
546- */
545+ /** @param pathFilter use when filtering commits */
547546 public void setTreeFilter (final String pathFilter ) {
548547 this .pathFilter = pathFilter == null ? "" : pathFilter ;
549548 }
0 commit comments