@ -42,6 +42,10 @@
package org.eclipse.jgit.internal.storage.file ;
package org.eclipse.jgit.internal.storage.file ;
import static org.junit.Assert.assertFalse ;
import static org.junit.Assert.assertTrue ;
import java.util.Arrays ;
import java.util.Collection ;
import java.util.Collection ;
import java.util.Collections ;
import java.util.Collections ;
import java.util.concurrent.Callable ;
import java.util.concurrent.Callable ;
@ -49,14 +53,29 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors ;
import java.util.concurrent.Executors ;
import java.util.concurrent.Future ;
import java.util.concurrent.Future ;
import org.eclipse.jgit.internal.storage.file.ObjectDirectory ;
import org.eclipse.jgit.junit.RepositoryTestCase ;
import org.eclipse.jgit.junit.RepositoryTestCase ;
import org.eclipse.jgit.junit.TestRepository ;
import org.eclipse.jgit.lib.ConfigConstants ;
import org.eclipse.jgit.lib.Constants ;
import org.eclipse.jgit.lib.Constants ;
import org.eclipse.jgit.lib.ObjectId ;
import org.eclipse.jgit.lib.ObjectId ;
import org.eclipse.jgit.storage.file.FileBasedConfig ;
import org.junit.Test ;
import org.junit.Test ;
import org.junit.runner.RunWith ;
import org.junit.runners.Parameterized ;
import org.junit.runners.Parameterized.Parameter ;
import org.junit.runners.Parameterized.Parameters ;
@RunWith ( Parameterized . class )
public class ObjectDirectoryTest extends RepositoryTestCase {
public class ObjectDirectoryTest extends RepositoryTestCase {
@Parameter
public Boolean trustFolderStats ;
@Parameters ( name = "core.trustfolderstat={0}" )
public static Iterable < ? extends Object > data ( ) {
return Arrays . asList ( Boolean . TRUE , Boolean . FALSE ) ;
}
@Test
@Test
public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory ( )
public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory ( )
throws Exception {
throws Exception {
@ -69,6 +88,34 @@ public class ObjectDirectoryTest extends RepositoryTestCase {
}
}
}
}
@Test
public void testShouldNotSearchPacksAgainTheSecondTime ( ) throws Exception {
FileRepository bareRepository = newTestRepositoryWithOnePackfile ( ) ;
ObjectDirectory dir = bareRepository . getObjectDatabase ( ) ;
// Make sure that timestamps are modified and read so that a full
// file snapshot check is performed
Thread . sleep ( 3000L ) ;
assertTrue ( dir . searchPacksAgain ( dir . packList . get ( ) ) ) ;
assertFalse ( dir . searchPacksAgain ( dir . packList . get ( ) ) ) ;
}
private FileRepository newTestRepositoryWithOnePackfile ( ) throws Exception {
FileRepository repository = createBareRepository ( ) ;
TestRepository < FileRepository > testRepository = new TestRepository < FileRepository > ( repository ) ;
testRepository . commit ( ) ;
testRepository . packAndPrune ( ) ;
FileBasedConfig repoConfig = repository . getConfig ( ) ;
repoConfig . setBoolean ( ConfigConstants . CONFIG_CORE_SECTION , null ,
ConfigConstants . CONFIG_KEY_TRUSTFOLDERSTAT ,
trustFolderStats . booleanValue ( ) ) ;
repoConfig . save ( ) ;
return repository ;
}
private Collection < Callable < ObjectId > > blobInsertersForTheSameFanOutDir (
private Collection < Callable < ObjectId > > blobInsertersForTheSameFanOutDir (
final ObjectDirectory dir ) {
final ObjectDirectory dir ) {
Callable < ObjectId > callable = new Callable < ObjectId > ( ) {
Callable < ObjectId > callable = new Callable < ObjectId > ( ) {