@ -174,6 +174,7 @@ public class RevWalk implements Iterable<RevCommit> {
private int delayFreeFlags ;
private int delayFreeFlags ;
private int retainOnReset ;
int carryFlags = UNINTERESTING ;
int carryFlags = UNINTERESTING ;
final ArrayList < RevCommit > roots ;
final ArrayList < RevCommit > roots ;
@ -1092,6 +1093,47 @@ public class RevWalk implements Iterable<RevCommit> {
carry ( flag ) ;
carry ( flag ) ;
}
}
/ * *
* Preserve a RevFlag during all { @code reset } methods .
* < p >
* Calling { @code retainOnReset ( flag ) } avoids needing to pass the flag
* during each { @code resetRetain ( ) } invocation on this instance .
* < p >
* Clearing flags marked retainOnReset requires disposing of the flag with
* { @code # disposeFlag ( RevFlag ) } or disposing of the entire RevWalk by
* { @code # dispose ( ) } .
*
* @param flag
* the flag to retain during all resets .
* @since 3 . 6
* /
public final void retainOnReset ( RevFlag flag ) {
if ( ( freeFlags & flag . mask ) ! = 0 )
throw new IllegalArgumentException ( MessageFormat . format ( JGitText . get ( ) . flagIsDisposed , flag . name ) ) ;
if ( flag . walker ! = this )
throw new IllegalArgumentException ( MessageFormat . format ( JGitText . get ( ) . flagNotFromThis , flag . name ) ) ;
retainOnReset | = flag . mask ;
}
/ * *
* Preserve a set of RevFlags during all { @code reset } methods .
* < p >
* Calling { @code retainOnReset ( set ) } avoids needing to pass the flags
* during each { @code resetRetain ( ) } invocation on this instance .
* < p >
* Clearing flags marked retainOnReset requires disposing of the flag with
* { @code # disposeFlag ( RevFlag ) } or disposing of the entire RevWalk by
* { @code # dispose ( ) } .
*
* @param flags
* the flags to retain during all resets .
* @since 3 . 6
* /
public final void retainOnReset ( Collection < RevFlag > flags ) {
for ( RevFlag f : flags )
retainOnReset ( f ) ;
}
/ * *
/ * *
* Allow a flag to be recycled for a different use .
* Allow a flag to be recycled for a different use .
* < p >
* < p >
@ -1110,6 +1152,7 @@ public class RevWalk implements Iterable<RevCommit> {
}
}
void freeFlag ( final int mask ) {
void freeFlag ( final int mask ) {
retainOnReset & = ~ mask ;
if ( isNotStarted ( ) ) {
if ( isNotStarted ( ) ) {
freeFlags | = mask ;
freeFlags | = mask ;
carryFlags & = ~ mask ;
carryFlags & = ~ mask ;
@ -1158,6 +1201,9 @@ public class RevWalk implements Iterable<RevCommit> {
* Unlike { @link # dispose ( ) } previously acquired RevObject ( and RevCommit )
* Unlike { @link # dispose ( ) } previously acquired RevObject ( and RevCommit )
* instances are not invalidated . RevFlag instances are not invalidated , but
* instances are not invalidated . RevFlag instances are not invalidated , but
* are removed from all RevObjects .
* are removed from all RevObjects .
* < p >
* See { @link # retainOnReset ( RevFlag ) } for an alternative that does not
* require passing the flags during each reset .
*
*
* @param retainFlags
* @param retainFlags
* application flags that should < b > not < / b > be cleared from
* application flags that should < b > not < / b > be cleared from
@ -1183,7 +1229,7 @@ public class RevWalk implements Iterable<RevCommit> {
* /
* /
protected void reset ( int retainFlags ) {
protected void reset ( int retainFlags ) {
finishDelayedFreeFlags ( ) ;
finishDelayedFreeFlags ( ) ;
retainFlags | = PARSED ;
retainFlags | = PARSED | retainOnReset ;
final int clearFlags = ~ retainFlags ;
final int clearFlags = ~ retainFlags ;
final FIFORevQueue q = new FIFORevQueue ( ) ;
final FIFORevQueue q = new FIFORevQueue ( ) ;
@ -1227,6 +1273,7 @@ public class RevWalk implements Iterable<RevCommit> {
reader . release ( ) ;
reader . release ( ) ;
freeFlags = APP_FLAGS ;
freeFlags = APP_FLAGS ;
delayFreeFlags = 0 ;
delayFreeFlags = 0 ;
retainOnReset = 0 ;
carryFlags = UNINTERESTING ;
carryFlags = UNINTERESTING ;
objects . clear ( ) ;
objects . clear ( ) ;
reader . release ( ) ;
reader . release ( ) ;