diff --git a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java index 96067ba7a2..3055b34931 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java +++ b/scm-dao-xml/src/main/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolver.java @@ -1,6 +1,7 @@ package sonia.scm.repository.xml; import sonia.scm.SCMContextProvider; +import sonia.scm.io.FileSystem; import sonia.scm.repository.BasicRepositoryLocationResolver; import sonia.scm.repository.InitialRepositoryLocationResolver; import sonia.scm.repository.InternalRepositoryException; @@ -8,8 +9,6 @@ import sonia.scm.store.StoreConstants; import javax.inject.Inject; import javax.inject.Singleton; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.time.Clock; import java.util.Map; @@ -36,6 +35,7 @@ public class PathBasedRepositoryLocationResolver extends BasicRepositoryLocation private final SCMContextProvider contextProvider; private final InitialRepositoryLocationResolver initialRepositoryLocationResolver; + private final FileSystem fileSystem; private final PathDatabase pathDatabase; private final Map pathById; @@ -46,14 +46,15 @@ public class PathBasedRepositoryLocationResolver extends BasicRepositoryLocation private Long lastModified; @Inject - public PathBasedRepositoryLocationResolver(SCMContextProvider contextProvider, InitialRepositoryLocationResolver initialRepositoryLocationResolver) { - this(contextProvider, initialRepositoryLocationResolver, Clock.systemUTC()); + public PathBasedRepositoryLocationResolver(SCMContextProvider contextProvider, InitialRepositoryLocationResolver initialRepositoryLocationResolver, FileSystem fileSystem) { + this(contextProvider, initialRepositoryLocationResolver, fileSystem, Clock.systemUTC()); } - public PathBasedRepositoryLocationResolver(SCMContextProvider contextProvider, InitialRepositoryLocationResolver initialRepositoryLocationResolver, Clock clock) { + PathBasedRepositoryLocationResolver(SCMContextProvider contextProvider, InitialRepositoryLocationResolver initialRepositoryLocationResolver, FileSystem fileSystem, Clock clock) { super(Path.class); this.contextProvider = contextProvider; this.initialRepositoryLocationResolver = initialRepositoryLocationResolver; + this.fileSystem = fileSystem; this.pathById = new ConcurrentHashMap<>(); this.clock = clock; @@ -101,8 +102,8 @@ public class PathBasedRepositoryLocationResolver extends BasicRepositoryLocation setLocation(repositoryId, path); Path resolvedPath = contextProvider.resolve(path); try { - Files.createDirectories(resolvedPath); - } catch (IOException e) { + fileSystem.create(resolvedPath.toFile()); + } catch (Exception e) { throw new InternalRepositoryException(entity("Repository", repositoryId), "could not create directory for new repository", e); } return resolvedPath; diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java index 754b8469d5..941775d6ea 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java @@ -11,6 +11,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import sonia.scm.SCMContextProvider; +import sonia.scm.io.DefaultFileSystem; +import sonia.scm.io.FileSystem; import sonia.scm.repository.InitialRepositoryLocationResolver; import java.io.IOException; @@ -41,6 +43,8 @@ class PathBasedRepositoryLocationResolverTest { @Mock private Clock clock; + private final FileSystem fileSystem = new DefaultFileSystem(); + private Path basePath; private PathBasedRepositoryLocationResolver resolver; @@ -159,7 +163,7 @@ class PathBasedRepositoryLocationResolverTest { } private PathBasedRepositoryLocationResolver createResolver() { - return new PathBasedRepositoryLocationResolver(contextProvider, initialRepositoryLocationResolver, clock); + return new PathBasedRepositoryLocationResolver(contextProvider, initialRepositoryLocationResolver, fileSystem, clock); } private String content(Path storePath) {