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 -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import com.google.common.base.Throwables;
import com.google.common.io.Resources; import com.google.common.io.Resources;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.AlreadyExistsException;
import sonia.scm.ConfigurationException; import sonia.scm.ConfigurationException;
import sonia.scm.ContextEntry;
import sonia.scm.io.CommandResult; import sonia.scm.io.CommandResult;
import sonia.scm.io.ExtendedCommand; import sonia.scm.io.ExtendedCommand;
import sonia.scm.io.FileSystem;
import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.ConfigurationStoreFactory;
import java.io.File; import java.io.File;
@@ -69,47 +65,25 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
private static final Logger logger = private static final Logger logger =
LoggerFactory.getLogger(AbstractSimpleRepositoryHandler.class); LoggerFactory.getLogger(AbstractSimpleRepositoryHandler.class);
private final FileSystem fileSystem;
private final RepositoryLocationResolver repositoryLocationResolver; private final RepositoryLocationResolver repositoryLocationResolver;
private final InitialRepositoryLocationResolver initialRepositoryLocationResolver;
public AbstractSimpleRepositoryHandler(ConfigurationStoreFactory storeFactory, public AbstractSimpleRepositoryHandler(ConfigurationStoreFactory storeFactory,
FileSystem fileSystem, RepositoryLocationResolver repositoryLocationResolver) {
RepositoryLocationResolver repositoryLocationResolver,
InitialRepositoryLocationResolver initialRepositoryLocationResolver) {
super(storeFactory); super(storeFactory);
this.fileSystem = fileSystem;
this.repositoryLocationResolver = repositoryLocationResolver; this.repositoryLocationResolver = repositoryLocationResolver;
this.initialRepositoryLocationResolver = initialRepositoryLocationResolver;
} }
@Override @Override
public Repository create(Repository repository) { public Repository create(Repository repository) {
File repositoryRootDirectory = initialRepositoryLocationResolver.getDefaultDirectory(repository); File repositoryRootDirectory = repositoryLocationResolver.getRepositoryDirectory(repository);
if (repositoryRootDirectory != null && repositoryRootDirectory.exists()) { File nativeDirectory = new File(repositoryRootDirectory, RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
throw new AlreadyExistsException(repository);
}
try { try {
fileSystem.create(repositoryRootDirectory);
File nativeDirectory = new File(repositoryRootDirectory, RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
create(repository, nativeDirectory); create(repository, nativeDirectory);
postCreate(repository, nativeDirectory); postCreate(repository, nativeDirectory);
return repository; } catch (IOException e) {
} catch (Exception ex) { throw new InternalRepositoryException(repository, "could not create native repository directory", e);
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;
} }
return repository;
} }
@Override @Override
@@ -119,16 +93,6 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
@Override @Override
public void delete(Repository repository) { 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 @Override
@@ -150,7 +114,7 @@ public abstract class AbstractSimpleRepositoryHandler<C extends RepositoryConfig
public File getDirectory(Repository repository) { public File getDirectory(Repository repository) {
File directory; File directory;
if (isConfigured()) { if (isConfigured()) {
directory = repositoryLocationResolver.getNativeDirectory(repository); directory = new File(repositoryLocationResolver.getRepositoryDirectory(repository), RepositoryLocationResolver.REPOSITORIES_NATIVE_DIRECTORY);
} else { } else {
throw new ConfigurationException("RepositoryHandler is not configured"); throw new ConfigurationException("RepositoryHandler is not configured");
} }

View File

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

View File

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

View File

@@ -36,6 +36,7 @@ package sonia.scm.repository.xml;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.io.FileSystem;
import sonia.scm.repository.InitialRepositoryLocationResolver; import sonia.scm.repository.InitialRepositoryLocationResolver;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.NamespaceAndName;
@@ -59,21 +60,24 @@ public class XmlRepositoryDAO
implements PathBasedRepositoryDAO { implements PathBasedRepositoryDAO {
public static final String STORE_NAME = "repositories"; public static final String STORE_NAME = "repositories";
private InitialRepositoryLocationResolver initialRepositoryLocationResolver; private InitialRepositoryLocationResolver initialRepositoryLocationResolver;
private final FileSystem fileSystem;
private final SCMContextProvider context; private final SCMContextProvider context;
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
/** /**
* Constructs ... * Constructs ...
* * @param storeFactory
* @param storeFactory * @param fileSystem
* @param context * @param context
*/ */
@Inject @Inject
public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory, InitialRepositoryLocationResolver initialRepositoryLocationResolver, SCMContextProvider context) { public XmlRepositoryDAO(ConfigurationStoreFactory storeFactory, InitialRepositoryLocationResolver initialRepositoryLocationResolver, FileSystem fileSystem, SCMContextProvider context) {
super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)); super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME));
this.initialRepositoryLocationResolver = initialRepositoryLocationResolver; this.initialRepositoryLocationResolver = initialRepositoryLocationResolver;
this.fileSystem = fileSystem;
this.context = context; this.context = context;
} }
@@ -104,6 +108,12 @@ public class XmlRepositoryDAO
@Override @Override
public void add(Repository repository) { public void add(Repository repository) {
File repositoryRootDirectory = initialRepositoryLocationResolver.getDefaultDirectory(repository);
try {
fileSystem.create(repositoryRootDirectory);
} catch (IOException e) {
throw new InternalRepositoryException(repository, "could not create directory for repository data: " + repositoryRootDirectory, e);
}
String relativeRepositoryPath = initialRepositoryLocationResolver.getRelativeRepositoryPath(repository); String relativeRepositoryPath = initialRepositoryLocationResolver.getRelativeRepositoryPath(repository);
RepositoryPath repositoryPath = new RepositoryPath(relativeRepositoryPath, repository.getId(), repository.clone()); RepositoryPath repositoryPath = new RepositoryPath(relativeRepositoryPath, repository.getId(), repository.clone());
repositoryPath.setToBeSynchronized(true); repositoryPath.setToBeSynchronized(true);
@@ -138,6 +148,17 @@ public class XmlRepositoryDAO
return repository.clone(); return repository.clone();
} }
@Override
public void delete(Repository repository) {
Path directory = getPath(repository);
super.delete(repository);
try {
fileSystem.destroy(directory.toFile());
} catch (IOException e) {
throw new InternalRepositoryException(repository, "could not delete repository directory", e);
}
}
/** /**
* Method description * Method description
* *

View File

@@ -8,6 +8,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.io.DefaultFileSystem;
import sonia.scm.io.FileSystem;
import sonia.scm.repository.InitialRepositoryLocationResolver; import sonia.scm.repository.InitialRepositoryLocationResolver;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStore;
@@ -18,7 +20,6 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.codehaus.groovy.runtime.InvokerHelper.asList; import static org.codehaus.groovy.runtime.InvokerHelper.asList;
import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.argThat;
@@ -41,6 +42,8 @@ public class XmlRepositoryDAOTest {
@Rule @Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder(); public TemporaryFolder temporaryFolder = new TemporaryFolder();
private final FileSystem fileSystem = new DefaultFileSystem();
@Before @Before
public void init() throws IOException { public void init() throws IOException {
when(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)).thenReturn(store); when(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)).thenReturn(store);
@@ -51,7 +54,7 @@ public class XmlRepositoryDAOTest {
@Test @Test
public void addShouldCreateNewRepositoryPathWithRelativePath() { public void addShouldCreateNewRepositoryPathWithRelativePath() {
InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(context); InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(context);
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, initialRepositoryLocationResolver, context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, initialRepositoryLocationResolver, fileSystem, context);
dao.add(new Repository("id", null, null, null)); dao.add(new Repository("id", null, null, null));
@@ -69,7 +72,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath("/path", "id", oldRepository); RepositoryPath repositoryPath = new RepositoryPath("/path", "id", oldRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
Repository newRepository = new Repository("id", "new", null, null); Repository newRepository = new Repository("id", "new", null, null);
dao.modify(newRepository); dao.modify(newRepository);
@@ -84,7 +87,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath("path", "id", existingRepository); RepositoryPath repositoryPath = new RepositoryPath("path", "id", existingRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
Path path = dao.getPath(existingRepository); Path path = dao.getPath(existingRepository);
@@ -97,7 +100,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath("/tmp/path", "id", existingRepository); RepositoryPath repositoryPath = new RepositoryPath("/tmp/path", "id", existingRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
Path path = dao.getPath(existingRepository); Path path = dao.getPath(existingRepository);
@@ -111,7 +114,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath("relative/path", "id", existingRepository); RepositoryPath repositoryPath = new RepositoryPath("relative/path", "id", existingRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
String id = dao.getIdForDirectory(new File(context.getBaseDirectory(), "relative/path/data")); String id = dao.getIdForDirectory(new File(context.getBaseDirectory(), "relative/path/data"));
@@ -125,7 +128,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath(folder.getParent(), "id", existingRepository); RepositoryPath repositoryPath = new RepositoryPath(folder.getParent(), "id", existingRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
String id = dao.getIdForDirectory(folder); String id = dao.getIdForDirectory(folder);
@@ -141,7 +144,7 @@ public class XmlRepositoryDAOTest {
RepositoryPath repositoryPath = new RepositoryPath(new File(link, "data").getPath(), "id", existingRepository); RepositoryPath repositoryPath = new RepositoryPath(new File(link, "data").getPath(), "id", existingRepository);
when(db.getPaths()).thenReturn(asList(repositoryPath)); when(db.getPaths()).thenReturn(asList(repositoryPath));
XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), context); XmlRepositoryDAO dao = new XmlRepositoryDAO(storeFactory, new InitialRepositoryLocationResolver(context), fileSystem, context);
String id = dao.getIdForDirectory(folder); String id = dao.getIdForDirectory(folder);

View File

@@ -97,24 +97,13 @@ public class GitRepositoryHandler
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param storeFactory
* @param fileSystem
* @param scheduler
* @param repositoryLocationResolver
*/
@Inject @Inject
public GitRepositoryHandler(ConfigurationStoreFactory storeFactory, public GitRepositoryHandler(ConfigurationStoreFactory storeFactory,
FileSystem fileSystem,
Scheduler scheduler, Scheduler scheduler,
RepositoryLocationResolver repositoryLocationResolver, RepositoryLocationResolver repositoryLocationResolver,
InitialRepositoryLocationResolver initialRepositoryLocationResolver,
GitWorkdirFactory workdirFactory) GitWorkdirFactory workdirFactory)
{ {
super(storeFactory, fileSystem, repositoryLocationResolver, initialRepositoryLocationResolver); super(storeFactory, repositoryLocationResolver);
this.scheduler = scheduler; this.scheduler = scheduler;
this.workdirFactory = workdirFactory; this.workdirFactory = workdirFactory;
} }

View File

@@ -64,7 +64,6 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
private GitWorkdirFactory gitWorkdirFactory; private GitWorkdirFactory gitWorkdirFactory;
RepositoryLocationResolver repositoryLocationResolver; RepositoryLocationResolver repositoryLocationResolver;
private InitialRepositoryLocationResolver initialRepositoryLocationResolver;
@Override @Override
@@ -89,12 +88,9 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
@Override @Override
protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory,
File directory) { File directory) {
DefaultFileSystem fileSystem = new DefaultFileSystem(); repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(contextProvider));
initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider);
repositoryLocationResolver = new RepositoryLocationResolver(repoDao, initialRepositoryLocationResolver);
GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory, GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory,
fileSystem, scheduler, repositoryLocationResolver, initialRepositoryLocationResolver, gitWorkdirFactory); scheduler, repositoryLocationResolver, gitWorkdirFactory);
repositoryHandler.init(contextProvider); repositoryHandler.init(contextProvider);
GitConfig config = new GitConfig(); GitConfig config = new GitConfig();
@@ -108,7 +104,7 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
@Test @Test
public void getDirectory() { public void getDirectory() {
GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory, GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory,
new DefaultFileSystem(), scheduler, repositoryLocationResolver, initialRepositoryLocationResolver, gitWorkdirFactory); scheduler, repositoryLocationResolver, gitWorkdirFactory);
GitConfig config = new GitConfig(); GitConfig config = new GitConfig();
config.setDisabled(false); config.setDisabled(false);
config.setGcExpression("gc exp"); config.setGcExpression("gc exp");

View File

@@ -45,7 +45,6 @@ import sonia.scm.SCMContextProvider;
import sonia.scm.installer.HgInstaller; import sonia.scm.installer.HgInstaller;
import sonia.scm.installer.HgInstallerFactory; import sonia.scm.installer.HgInstallerFactory;
import sonia.scm.io.ExtendedCommand; import sonia.scm.io.ExtendedCommand;
import sonia.scm.io.FileSystem;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.repository.spi.HgRepositoryServiceProvider; import sonia.scm.repository.spi.HgRepositoryServiceProvider;
import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.ConfigurationStoreFactory;
@@ -102,22 +101,12 @@ public class HgRepositoryHandler
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
* @param storeFactory
* @param fileSystem
* @param hgContextProvider
* @param repositoryLocationResolver
*/
@Inject @Inject
public HgRepositoryHandler(ConfigurationStoreFactory storeFactory, public HgRepositoryHandler(ConfigurationStoreFactory storeFactory,
FileSystem fileSystem,
Provider<HgContext> hgContextProvider, Provider<HgContext> hgContextProvider,
RepositoryLocationResolver repositoryLocationResolver, RepositoryLocationResolver repositoryLocationResolver)
InitialRepositoryLocationResolver initialRepositoryLocationResolver)
{ {
super(storeFactory, fileSystem, repositoryLocationResolver, initialRepositoryLocationResolver); super(storeFactory, repositoryLocationResolver);
this.hgContextProvider = hgContextProvider; this.hgContextProvider = hgContextProvider;
try try

View File

@@ -38,7 +38,6 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.io.DefaultFileSystem;
import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.ConfigurationStoreFactory;
import java.io.File; import java.io.File;
@@ -61,7 +60,6 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
private com.google.inject.Provider<HgContext> provider; private com.google.inject.Provider<HgContext> provider;
private RepositoryLocationResolver repositoryLocationResolver; private RepositoryLocationResolver repositoryLocationResolver;
private InitialRepositoryLocationResolver initialRepositoryLocationResolver;
@Override @Override
protected void checkDirectory(File directory) { protected void checkDirectory(File directory) {
@@ -74,11 +72,9 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
@Override @Override
protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory,
File directory) { File directory) {
initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider); repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(contextProvider));
repositoryLocationResolver = new RepositoryLocationResolver(repoDao, initialRepositoryLocationResolver);
HgRepositoryHandler handler = new HgRepositoryHandler(factory, HgRepositoryHandler handler = new HgRepositoryHandler(factory,
new DefaultFileSystem(), new HgContextProvider(), repositoryLocationResolver);
new HgContextProvider(), repositoryLocationResolver, initialRepositoryLocationResolver);
handler.init(contextProvider); handler.init(contextProvider);
HgTestUtil.checkForSkip(handler); HgTestUtil.checkForSkip(handler);
@@ -89,7 +85,7 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
@Test @Test
public void getDirectory() { public void getDirectory() {
HgRepositoryHandler repositoryHandler = new HgRepositoryHandler(factory, HgRepositoryHandler repositoryHandler = new HgRepositoryHandler(factory,
new DefaultFileSystem(), provider, repositoryLocationResolver, initialRepositoryLocationResolver); provider, repositoryLocationResolver);
HgConfig hgConfig = new HgConfig(); HgConfig hgConfig = new HgConfig();
hgConfig.setHgBinary("hg"); hgConfig.setHgBinary("hg");

View File

@@ -36,19 +36,18 @@ package sonia.scm.repository;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import org.junit.Assume; import org.junit.Assume;
import sonia.scm.SCMContext; import sonia.scm.SCMContext;
import sonia.scm.io.FileSystem;
import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory;
import static org.mockito.Mockito.*; import javax.servlet.http.HttpServletRequest;
//~--- JDK imports ------------------------------------------------------------
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import javax.servlet.http.HttpServletRequest; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
//~--- JDK imports ------------------------------------------------------------
/** /**
* *
@@ -102,14 +101,11 @@ public final class HgTestUtil
context.setBaseDirectory(directory); context.setBaseDirectory(directory);
FileSystem fileSystem = mock(FileSystem.class);
PathBasedRepositoryDAO repoDao = mock(PathBasedRepositoryDAO.class); PathBasedRepositoryDAO repoDao = mock(PathBasedRepositoryDAO.class);
InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(context); RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(context));
RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repoDao, initialRepositoryLocationResolver);
HgRepositoryHandler handler = HgRepositoryHandler handler =
new HgRepositoryHandler(new InMemoryConfigurationStoreFactory(), fileSystem, new HgRepositoryHandler(new InMemoryConfigurationStoreFactory(), new HgContextProvider(), repositoryLocationResolver);
new HgContextProvider(), repositoryLocationResolver, initialRepositoryLocationResolver);
Path repoDir = directory.toPath(); Path repoDir = directory.toPath();
when(repoDao.getPath(any())).thenReturn(repoDir); when(repoDao.getPath(any())).thenReturn(repoDir);
handler.init(context); handler.init(context);

View File

@@ -46,7 +46,6 @@ import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.util.SVNDebugLog; import org.tmatesoft.svn.util.SVNDebugLog;
import sonia.scm.io.FileSystem;
import sonia.scm.logging.SVNKitLogger; import sonia.scm.logging.SVNKitLogger;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
@@ -87,13 +86,11 @@ public class SvnRepositoryHandler
@Inject @Inject
public SvnRepositoryHandler(ConfigurationStoreFactory storeFactory, public SvnRepositoryHandler(ConfigurationStoreFactory storeFactory,
FileSystem fileSystem,
HookEventFacade eventFacade, HookEventFacade eventFacade,
RepositoryLocationResolver repositoryLocationResolver, RepositoryLocationResolver repositoryLocationResolver,
InitialRepositoryLocationResolver initialRepositoryLocationResolver,
RepositoryDAO repositoryDAO) RepositoryDAO repositoryDAO)
{ {
super(storeFactory, fileSystem, repositoryLocationResolver, initialRepositoryLocationResolver); super(storeFactory, repositoryLocationResolver);
// register logger // register logger
SVNDebugLog.setDefaultLog(new SVNKitLogger()); SVNDebugLog.setDefaultLog(new SVNKitLogger());

View File

@@ -36,7 +36,6 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.io.DefaultFileSystem;
import sonia.scm.repository.api.HookContextFactory; import sonia.scm.repository.api.HookContextFactory;
import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.HookEventFacade;
import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStore;
@@ -76,7 +75,6 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
private HookEventFacade facade = new HookEventFacade(repositoryManagerProvider, hookContextFactory); private HookEventFacade facade = new HookEventFacade(repositoryManagerProvider, hookContextFactory);
private RepositoryLocationResolver repositoryLocationResolver; private RepositoryLocationResolver repositoryLocationResolver;
private InitialRepositoryLocationResolver initialRepositoryLocationResolver;
@Override @Override
protected void checkDirectory(File directory) { protected void checkDirectory(File directory) {
@@ -94,9 +92,8 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
@Override @Override
protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory, protected RepositoryHandler createRepositoryHandler(ConfigurationStoreFactory factory,
File directory) { File directory) {
initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider); repositoryLocationResolver = new RepositoryLocationResolver(repoDao, new InitialRepositoryLocationResolver(contextProvider));
repositoryLocationResolver = new RepositoryLocationResolver(repoDao, initialRepositoryLocationResolver); SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, null, repositoryLocationResolver, repositoryDAO);
SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, new DefaultFileSystem(), null, repositoryLocationResolver, initialRepositoryLocationResolver, repositoryDAO);
handler.init(contextProvider); handler.init(contextProvider);
@@ -112,7 +109,7 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase {
public void getDirectory() { public void getDirectory() {
when(factory.getStore(any(), any())).thenReturn(store); when(factory.getStore(any(), any())).thenReturn(store);
SvnRepositoryHandler repositoryHandler = new SvnRepositoryHandler(factory, SvnRepositoryHandler repositoryHandler = new SvnRepositoryHandler(factory,
new DefaultFileSystem(), facade, repositoryLocationResolver, initialRepositoryLocationResolver, repositoryDAO); facade, repositoryLocationResolver, repositoryDAO);
SvnConfig svnConfig = new SvnConfig(); SvnConfig svnConfig = new SvnConfig();
repositoryHandler.setConfig(svnConfig); repositoryHandler.setConfig(svnConfig);

View File

@@ -35,7 +35,6 @@ package sonia.scm.repository;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import sonia.scm.AlreadyExistsException; import sonia.scm.AlreadyExistsException;
import sonia.scm.io.DefaultFileSystem;
import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.ConfigurationStoreFactory;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
@@ -59,8 +58,8 @@ public class DummyRepositoryHandler
private final Set<String> existingRepoNames = new HashSet<>(); private final Set<String> existingRepoNames = new HashSet<>();
public DummyRepositoryHandler(ConfigurationStoreFactory storeFactory, RepositoryLocationResolver repositoryLocationResolver, InitialRepositoryLocationResolver initialRepositoryLocationResolver) { public DummyRepositoryHandler(ConfigurationStoreFactory storeFactory, RepositoryLocationResolver repositoryLocationResolver) {
super(storeFactory, new DefaultFileSystem(), repositoryLocationResolver, initialRepositoryLocationResolver); super(storeFactory, repositoryLocationResolver);
} }
@Override @Override

View File

@@ -43,7 +43,6 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -82,17 +81,6 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase {
assertTrue(path.contains(repository.getId())); assertTrue(path.contains(repository.getId()));
} }
@Test
public void testDelete() {
createRepository();
handler.delete(repository);
File directory = new File(baseDirectory, repository.getId());
assertFalse(directory.exists());
}
@Override @Override
protected void postSetUp() throws IOException, RepositoryPathNotFoundException { protected void postSetUp() throws IOException, RepositoryPathNotFoundException {
InMemoryConfigurationStoreFactory storeFactory = new InMemoryConfigurationStoreFactory(); InMemoryConfigurationStoreFactory storeFactory = new InMemoryConfigurationStoreFactory();

View File

@@ -39,7 +39,6 @@ import com.google.inject.Singleton;
import org.apache.shiro.concurrent.SubjectAwareExecutorService; import org.apache.shiro.concurrent.SubjectAwareExecutorService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.AlreadyExistsException;
import sonia.scm.ConfigurationException; import sonia.scm.ConfigurationException;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.ManagerDaoAdapter; import sonia.scm.ManagerDaoAdapter;
@@ -138,17 +137,18 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager {
return managerDaoAdapter.create( return managerDaoAdapter.create(
repository, repository,
RepositoryPermissions::create, RepositoryPermissions::create,
newRepository -> fireEvent(HandlerEventType.BEFORE_CREATE, newRepository),
newRepository -> { newRepository -> {
fireEvent(HandlerEventType.CREATE, newRepository);
if (initRepository) { if (initRepository) {
try { try {
getHandler(newRepository).create(newRepository); getHandler(newRepository).create(newRepository);
} catch (AlreadyExistsException e) { } catch (InternalRepositoryException e) {
throw new InternalRepositoryException(repository, "directory for repository does already exist", e); delete(repository);
throw e;
} }
} }
fireEvent(HandlerEventType.BEFORE_CREATE, newRepository);
}, },
newRepository -> fireEvent(HandlerEventType.CREATE, newRepository),
newRepository -> repositoryDAO.contains(newRepository.getNamespaceAndName()) newRepository -> repositoryDAO.contains(newRepository.getNamespaceAndName())
); );
} }

View File

@@ -435,16 +435,16 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase<Repository> {
Set<RepositoryHandler> handlerSet = new HashSet<>(); Set<RepositoryHandler> handlerSet = new HashSet<>();
ConfigurationStoreFactory factory = new JAXBConfigurationStoreFactory(contextProvider); ConfigurationStoreFactory factory = new JAXBConfigurationStoreFactory(contextProvider);
InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider); InitialRepositoryLocationResolver initialRepositoryLocationResolver = new InitialRepositoryLocationResolver(contextProvider);
XmlRepositoryDAO repositoryDAO = new XmlRepositoryDAO(factory, initialRepositoryLocationResolver, contextProvider); XmlRepositoryDAO repositoryDAO = new XmlRepositoryDAO(factory, initialRepositoryLocationResolver, fileSystem, contextProvider);
RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repositoryDAO, initialRepositoryLocationResolver); RepositoryLocationResolver repositoryLocationResolver = new RepositoryLocationResolver(repositoryDAO, initialRepositoryLocationResolver);
handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver, initialRepositoryLocationResolver)); handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver));
handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver, initialRepositoryLocationResolver) { handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver) {
@Override @Override
public RepositoryType getType() { public RepositoryType getType() {
return new RepositoryType("hg", "Mercurial", Sets.newHashSet()); return new RepositoryType("hg", "Mercurial", Sets.newHashSet());
} }
}); });
handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver, initialRepositoryLocationResolver) { handlerSet.add(new DummyRepositoryHandler(factory, repositoryLocationResolver) {
@Override @Override
public RepositoryType getType() { public RepositoryType getType() {
return new RepositoryType("git", "Git", Sets.newHashSet()); return new RepositoryType("git", "Git", Sets.newHashSet());