Let dao create repository base directory before native creation

This commit is contained in:
René Pfeuffer
2018-11-23 15:04:59 +01:00
parent 1e655e9c97
commit 3d671caada
16 changed files with 75 additions and 146 deletions

View File

@@ -34,16 +34,12 @@ package sonia.scm.repository;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Charsets;
import com.google.common.base.Throwables;
import com.google.common.io.Resources;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.AlreadyExistsException;
import sonia.scm.ConfigurationException;
import sonia.scm.ContextEntry;
import sonia.scm.io.CommandResult;
import sonia.scm.io.ExtendedCommand;
import sonia.scm.io.FileSystem;
import sonia.scm.store.ConfigurationStoreFactory;
import java.io.File;
@@ -69,47 +65,25 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
private static final Logger logger =
LoggerFactory.getLogger(AbstractSimpleRepositoryHandler.class);
private final FileSystem fileSystem;
private final RepositoryLocationResolver repositoryLocationResolver;
private final InitialRepositoryLocationResolver initialRepositoryLocationResolver;
public AbstractSimpleRepositoryHandler(ConfigurationStoreFactory storeFactory,
FileSystem fileSystem,
RepositoryLocationResolver repositoryLocationResolver,
InitialRepositoryLocationResolver initialRepositoryLocationResolver) {
RepositoryLocationResolver repositoryLocationResolver) {
super(storeFactory);
this.fileSystem = fileSystem;
this.repositoryLocationResolver = repositoryLocationResolver;
this.initialRepositoryLocationResolver = initialRepositoryLocationResolver;
}
@Override
public Repository create(Repository repository) {
File repositoryRootDirectory = initialRepositoryLocationResolver.getDefaultDirectory(repository);
if (repositoryRootDirectory != null && repositoryRootDirectory.exists()) {
throw new AlreadyExistsException(repository);
}
File repositoryRootDirectory = repositoryLocationResolver.getRepositoryDirectory(repository);
File nativeDirectory = new File(repositoryRootDirectory, RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
try {
fileSystem.create(repositoryRootDirectory);
File nativeDirectory = new File(repositoryRootDirectory, RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
create(repository, nativeDirectory);
postCreate(repository, nativeDirectory);
return repository;
} catch (Exception ex) {
if (repositoryRootDirectory != null && repositoryRootDirectory.exists()) {
logger.warn("delete repository directory {}, because of failed repository creation", repositoryRootDirectory);
try {
fileSystem.destroy(repositoryRootDirectory);
} catch (IOException e) {
logger.error("Could not destroy directory: " + repositoryRootDirectory, e);
}
}
Throwables.propagateIfPossible(ex, AlreadyExistsException.class);
// This point will never be reached
return null;
} catch (IOException e) {
throw new InternalRepositoryException(repository, "could not create native repository directory", e);
}
return repository;
}
@Override
@@ -119,16 +93,6 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
@Override
public void delete(Repository repository) {
File directory = repositoryLocationResolver.getRepositoryDirectory(repository);
try {
if (directory.exists()) {
fileSystem.destroy(directory);
} else {
logger.warn("repository {} not found", repository.getNamespaceAndName());
}
} catch (IOException e) {
throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("directory", directory.toString()).in(repository), "could not delete repository directory", e);
}
}
@Override
@@ -150,7 +114,7 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
public File getDirectory(Repository repository) {
File directory;
if (isConfigured()) {
directory = repositoryLocationResolver.getNativeDirectory(repository);
directory = new File(repositoryLocationResolver.getRepositoryDirectory(repository), RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
} else {
throw new ConfigurationException("RepositoryHandler is not configured");
}

View File

@@ -1,11 +1,9 @@
package sonia.scm.repository;
import sonia.scm.SCMContextProvider;
import sonia.scm.io.FileSystem;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
/**
* A Location Resolver for File based Repository Storage.
@@ -30,7 +28,7 @@ public class InitialRepositoryLocationResolver {
this.context = context;
}
File getDefaultDirectory(Repository repository) {
public File getDefaultDirectory(Repository repository) {
String initialRepoFolder = getRelativeRepositoryPath(repository);
return new File(context.getBaseDirectory(), initialRepoFolder);
}

View File

@@ -38,8 +38,4 @@ public class RepositoryLocationResolver {
}
return initialRepositoryLocationResolver.getDefaultDirectory(repository);
}
File getNativeDirectory(Repository repository) {
return new File (getRepositoryDirectory(repository), REPOSITORIES_NATIVE_DIRECTORY);
}
}