@@ -459,7 +459,7 @@ private Map<String, Entry<?>> blockingFind(
459
459
readLock ();
460
460
try (ObjectReader reader = jGitRepository .newObjectReader ();
461
461
TreeWalk treeWalk = new TreeWalk (reader );
462
- RevWalk revWalk = new RevWalk (reader )) {
462
+ RevWalk revWalk = newRevWalk (reader )) {
463
463
464
464
// Query on a non-exist revision will return empty result.
465
465
final Revision headRevision = cachedHeadRevision ();
@@ -566,13 +566,12 @@ private List<Commit> blockingHistory(Revision from, Revision to, String pathPatt
566
566
567
567
// At this point, we are sure: from.major >= to.major
568
568
readLock ();
569
- try (RevWalk revWalk = new RevWalk ( jGitRepository )) {
569
+ try (RevWalk revWalk = newRevWalk ( )) {
570
570
final ObjectId fromCommitId = commitIdDatabase .get (descendingRange .from ());
571
571
final ObjectId toCommitId = commitIdDatabase .get (descendingRange .to ());
572
572
573
573
// Walk through the commit tree to get the corresponding commit information by given filters
574
574
revWalk .setTreeFilter (AndTreeFilter .create (TreeFilter .ANY_DIFF , PathPatternFilter .of (pathPattern )));
575
-
576
575
revWalk .markStart (revWalk .parseCommit (fromCommitId ));
577
576
final RevCommit toCommit = revWalk .parseCommit (toCommitId );
578
577
if (toCommit .getParentCount () != 0 ) {
@@ -599,7 +598,7 @@ private List<Commit> blockingHistory(Revision from, Revision to, String pathPatt
599
598
// If the pathPattern does not contain "/**", the caller wants commits only with the specific path,
600
599
// so skip the empty commit.
601
600
if (needsLastCommit && pathPattern .contains (ALL_PATH )) {
602
- try (RevWalk tmpRevWalk = new RevWalk ( jGitRepository )) {
601
+ try (RevWalk tmpRevWalk = newRevWalk ( )) {
603
602
final RevCommit lastRevCommit = tmpRevWalk .parseCommit (toCommitId );
604
603
final Revision lastCommitRevision =
605
604
CommitUtil .extractRevision (lastRevCommit .getFullMessage ());
@@ -665,7 +664,7 @@ public CompletableFuture<Map<String, Change<?>>> diff(Revision from, Revision to
665
664
666
665
final RevisionRange range = normalizeNow (from , to ).toAscending ();
667
666
readLock ();
668
- try (RevWalk rw = new RevWalk ( jGitRepository )) {
667
+ try (RevWalk rw = newRevWalk ( )) {
669
668
final RevTree treeA = rw .parseTree (commitIdDatabase .get (range .from ()));
670
669
final RevTree treeB = rw .parseTree (commitIdDatabase .get (range .to ()));
671
670
@@ -709,7 +708,7 @@ private Map<String, Change<?>> blockingPreviewDiff(Revision baseRevision, Iterab
709
708
710
709
readLock ();
711
710
try (ObjectReader reader = jGitRepository .newObjectReader ();
712
- RevWalk revWalk = new RevWalk (reader );
711
+ RevWalk revWalk = newRevWalk (reader );
713
712
DiffFormatter diffFormatter = new DiffFormatter (null )) {
714
713
715
714
final ObjectId baseTreeId = toTree (revWalk , baseRevision );
@@ -882,7 +881,7 @@ private CommitResult commit0(@Nullable Revision prevRevision, Revision nextRevis
882
881
883
882
try (ObjectInserter inserter = jGitRepository .newObjectInserter ();
884
883
ObjectReader reader = jGitRepository .newObjectReader ();
885
- RevWalk revWalk = new RevWalk (reader )) {
884
+ RevWalk revWalk = newRevWalk (reader )) {
886
885
887
886
final ObjectId prevTreeId = prevRevision != null ? toTree (revWalk , prevRevision ) : null ;
888
887
@@ -1025,8 +1024,8 @@ private int applyChanges(@Nullable Revision baseRevision, @Nullable ObjectId bas
1025
1024
}
1026
1025
break ;
1027
1026
case RENAME : {
1028
- final String newPath = (( String ) change . content ()). substring (
1029
- 1 ); // Strip the leading '/'.
1027
+ final String newPath =
1028
+ (( String ) change . content ()). substring ( 1 ); // Strip the leading '/'.
1030
1029
1031
1030
if (dirCache .getEntry (newPath ) != null ) {
1032
1031
throw new ChangeConflictException ("a file exists at the target path: " + change );
@@ -1299,7 +1298,7 @@ private Revision blockingFindLatestRevision(Revision lastKnownRevision, String p
1299
1298
// Convert the revisions to Git trees.
1300
1299
final List <DiffEntry > diffEntries ;
1301
1300
readLock ();
1302
- try (RevWalk revWalk = new RevWalk ( jGitRepository )) {
1301
+ try (RevWalk revWalk = newRevWalk ( )) {
1303
1302
final RevTree treeA = toTree (revWalk , range .from ());
1304
1303
final RevTree treeB = toTree (revWalk , range .to ());
1305
1304
diffEntries = blockingCompareTrees (treeA , treeB );
@@ -1442,7 +1441,7 @@ private Revision cachedHeadRevision() {
1442
1441
* Returns the current revision.
1443
1442
*/
1444
1443
private Revision uncachedHeadRevision () {
1445
- try (RevWalk revWalk = new RevWalk ( jGitRepository )) {
1444
+ try (RevWalk revWalk = newRevWalk ( )) {
1446
1445
final ObjectId headRevisionId = jGitRepository .resolve (R_HEADS_MASTER );
1447
1446
if (headRevisionId != null ) {
1448
1447
final RevCommit revCommit = revWalk .parseCommit (headRevisionId );
@@ -1466,6 +1465,23 @@ private RevTree toTree(RevWalk revWalk, Revision revision) {
1466
1465
}
1467
1466
}
1468
1467
1468
+ private RevWalk newRevWalk () {
1469
+ final RevWalk revWalk = new RevWalk (jGitRepository );
1470
+ configureRevWalk (revWalk );
1471
+ return revWalk ;
1472
+ }
1473
+
1474
+ private static RevWalk newRevWalk (ObjectReader reader ) {
1475
+ final RevWalk revWalk = new RevWalk (reader );
1476
+ configureRevWalk (revWalk );
1477
+ return revWalk ;
1478
+ }
1479
+
1480
+ private static void configureRevWalk (RevWalk revWalk ) {
1481
+ // Disable rewriteParents because otherwise `RevWalk` will load every commit into memory.
1482
+ revWalk .setRewriteParents (false );
1483
+ }
1484
+
1469
1485
private void readLock () {
1470
1486
rwLock .readLock ().lock ();
1471
1487
if (closePending .get () != null ) {
0 commit comments