21
21
import java .util .TreeMap ;
22
22
import java .util .TreeSet ;
23
23
import java .util .stream .Collectors ;
24
+
24
25
import org .eclipse .jgit .api .Git ;
25
26
import org .eclipse .jgit .api .LogCommand ;
26
27
import org .eclipse .jgit .lib .AnyObjectId ;
33
34
import org .eclipse .jgit .storage .file .FileRepositoryBuilder ;
34
35
import org .slf4j .Logger ;
35
36
import org .slf4j .LoggerFactory ;
37
+
36
38
import se .bjurr .gitchangelog .api .GitChangelogApiConstants ;
37
39
import se .bjurr .gitchangelog .api .exceptions .GitChangelogRepositoryException ;
38
40
import se .bjurr .gitchangelog .internal .git .model .GitCommit ;
@@ -437,44 +439,36 @@ private void populateComitPerTag(
437
439
final RevCommit thisCommit = this .revWalk .lookupCommit (to );
438
440
this .revWalk .parseHeaders (thisCommit );
439
441
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 {
452
445
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 );
462
455
LOG .debug ("Work left: " + moreWork .size ());
463
- }
456
+ } while (! moreWork . isEmpty ());
464
457
}
465
458
466
- private Set < TraversalWork > populateCommitPerTag (
459
+ private void populateCommitPerTag (
467
460
final RevCommit from ,
468
461
final RevCommit to ,
469
462
final Map <String , Set <GitCommit >> commitsPerTagName ,
470
463
final Map <String , Ref > tagPerCommitHash ,
471
464
final Map <String , String > tagPerCommitsHash ,
472
465
final Map <String , Date > datePerTag ,
473
- String currentTagName )
466
+ String currentTagName ,
467
+ final PriorityQueue <TraversalWork > moreWork )
474
468
throws Exception {
475
469
final String thisCommitHash = to .getName ();
476
470
if (this .isMappedToAnotherTag (tagPerCommitsHash , thisCommitHash )) {
477
- return new TreeSet <>() ;
471
+ return ;
478
472
}
479
473
if (this .thisIsANewTag (tagPerCommitHash , thisCommitHash )) {
480
474
currentTagName = this .getTagName (tagPerCommitHash , thisCommitHash );
@@ -486,16 +480,20 @@ private Set<TraversalWork> populateCommitPerTag(
486
480
this .noteThatTheCommitWasMapped (tagPerCommitsHash , currentTagName , thisCommitHash );
487
481
}
488
482
if (this .notFirstIncludedCommit (from , to )) {
489
- final Set <TraversalWork > work = new TreeSet <>();
490
483
for (final RevCommit parent : to .getParents ()) {
491
484
if (this .shouldInclude (parent )) {
492
485
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
494
493
}
495
494
}
496
- return work ;
497
495
}
498
- return new TreeSet <>() ;
496
+ return ;
499
497
}
500
498
501
499
private boolean shouldInclude (final RevCommit candidate ) throws Exception {
0 commit comments