2121import java .util .TreeMap ;
2222import java .util .TreeSet ;
2323import java .util .stream .Collectors ;
24+
2425import org .eclipse .jgit .api .Git ;
2526import org .eclipse .jgit .api .LogCommand ;
2627import org .eclipse .jgit .lib .AnyObjectId ;
3334import org .eclipse .jgit .storage .file .FileRepositoryBuilder ;
3435import org .slf4j .Logger ;
3536import org .slf4j .LoggerFactory ;
37+
3638import se .bjurr .gitchangelog .api .GitChangelogApiConstants ;
3739import se .bjurr .gitchangelog .api .exceptions .GitChangelogRepositoryException ;
3840import se .bjurr .gitchangelog .internal .git .model .GitCommit ;
@@ -437,44 +439,36 @@ private void populateComitPerTag(
437439 final RevCommit thisCommit = this .revWalk .lookupCommit (to );
438440 this .revWalk .parseHeaders (thisCommit );
439441
440- final PriorityQueue <TraversalWork > moreWork =
441- new PriorityQueue <>(
442- this .populateCommitPerTag (
443- from ,
444- to ,
445- commitsPerTag ,
446- tagPerCommitHash ,
447- tagPerCommitsHash ,
448- datePerTag ,
449- startingTagName ));
450-
451- while (!moreWork .isEmpty ()) {
442+ final PriorityQueue <TraversalWork > moreWork = new PriorityQueue <>();
443+ moreWork .add (new TraversalWork (to , startingTagName ));
444+ do {
452445 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 ()) );
446+ this . populateCommitPerTag (
447+ from ,
448+ next . getTo () ,
449+ commitsPerTag ,
450+ tagPerCommitHash ,
451+ tagPerCommitsHash ,
452+ datePerTag ,
453+ next . getCurrentTagName () ,
454+ moreWork );
462455 LOG .debug ("Work left: " + moreWork .size ());
463- }
456+ } while (! moreWork . isEmpty ());
464457 }
465458
466- private Set < TraversalWork > populateCommitPerTag (
459+ private void populateCommitPerTag (
467460 final RevCommit from ,
468461 final RevCommit to ,
469462 final Map <String , Set <GitCommit >> commitsPerTagName ,
470463 final Map <String , Ref > tagPerCommitHash ,
471464 final Map <String , String > tagPerCommitsHash ,
472465 final Map <String , Date > datePerTag ,
473- String currentTagName )
466+ String currentTagName ,
467+ final PriorityQueue <TraversalWork > moreWork )
474468 throws Exception {
475469 final String thisCommitHash = to .getName ();
476470 if (this .isMappedToAnotherTag (tagPerCommitsHash , thisCommitHash )) {
477- return new TreeSet <>() ;
471+ return ;
478472 }
479473 if (this .thisIsANewTag (tagPerCommitHash , thisCommitHash )) {
480474 currentTagName = this .getTagName (tagPerCommitHash , thisCommitHash );
@@ -486,16 +480,20 @@ private Set<TraversalWork> populateCommitPerTag(
486480 this .noteThatTheCommitWasMapped (tagPerCommitsHash , currentTagName , thisCommitHash );
487481 }
488482 if (this .notFirstIncludedCommit (from , to )) {
489- final Set <TraversalWork > work = new TreeSet <>();
490483 for (final RevCommit parent : to .getParents ()) {
491484 if (this .shouldInclude (parent )) {
492485 this .revWalk .parseHeaders (parent );
493- work .add (new TraversalWork (parent , currentTagName ));
486+ final TraversalWork work = new TraversalWork (parent , currentTagName );
487+ if (moreWork .contains (work )) {
488+ LOG .info ("Removing " +work .getTo ().getName ());
489+ moreWork .remove (work ); // Remove work added from reference by a newer commit
490+ }
491+ LOG .info ("Adding " +work .getTo ().getName () + " tag: " +work .getCurrentTagName ());
492+ moreWork .add (work ); // Add work from this older reference
494493 }
495494 }
496- return work ;
497495 }
498- return new TreeSet <>() ;
496+ return ;
499497 }
500498
501499 private boolean shouldInclude (final RevCommit candidate ) throws Exception {
0 commit comments