diff --git a/CHANGELOG.md b/CHANGELOG.md index a37e3cf76c..2faf86bbbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Directory name for git LFS files ([#1504](https://github.com/scm-manager/scm-manager/pull/1504)) +- Temporary data for repositories is kept in the repository directory, not in a global directory ([#1510](https://github.com/scm-manager/scm-manager/pull/1510)) - Migrate integration tests to bdd ([#1497](https://github.com/scm-manager/scm-manager/pull/1497)) - Layout of proxy settings ([#1502](https://github.com/scm-manager/scm-manager/pull/1502)) - Apply test ids to production builds for usage in e2e tests ([#1499](https://github.com/scm-manager/scm-manager/pull/1499)) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/ModifyCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/ModifyCommandBuilder.java index f2b11a00a0..7b81ccfe28 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/ModifyCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/ModifyCommandBuilder.java @@ -81,9 +81,9 @@ public class ModifyCommandBuilder { private final ModifyCommandRequest request = new ModifyCommandRequest(); - ModifyCommandBuilder(ModifyCommand command, WorkdirProvider workdirProvider, @Nullable EMail eMail) { + ModifyCommandBuilder(ModifyCommand command, WorkdirProvider workdirProvider, String repositoryId, @Nullable EMail eMail) { this.command = command; - this.workdir = workdirProvider.createNewWorkdir(); + this.workdir = workdirProvider.createNewWorkdir(repositoryId); this.eMail = eMail; } diff --git a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java index f8a4db1d10..43cddee2a9 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryService.java @@ -444,7 +444,7 @@ public final class RepositoryService implements Closeable { LOG.debug("create modify command for repository {}", repository.getNamespaceAndName()); - return new ModifyCommandBuilder(provider.getModifyCommand(), workdirProvider, eMail); + return new ModifyCommandBuilder(provider.getModifyCommand(), workdirProvider, repository.getId(), eMail); } /** diff --git a/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java index c7bea0fd80..4a8efb7e7e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/NoneCachingWorkingCopyPool.java @@ -46,7 +46,7 @@ public class NoneCachingWorkingCopyPool implements WorkingCopyPool { @Override public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context) { - return context.initialize(workdirProvider.createNewWorkdir()); + return context.initialize(workdirProvider.createNewWorkdir(context.getScmRepository().getId())); } @Override diff --git a/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java index 84ec21dd6e..a66e55aa4e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java @@ -96,7 +96,7 @@ public class SimpleCachingWorkingCopyPool implements WorkingCopyPool { private WorkingCopy createNewWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext workingCopyContext) { Stopwatch stopwatch = Stopwatch.createStarted(); - File newWorkdir = workdirProvider.createNewWorkdir(); + File newWorkdir = workdirProvider.createNewWorkdir(workingCopyContext.getScmRepository().getId()); WorkingCopy parentAndClone = workingCopyContext.initialize(newWorkdir); LOG.debug("initialized new workdir for {} in path {} in {}", workingCopyContext.getScmRepository(), newWorkdir, stopwatch.stop()); return parentAndClone; diff --git a/scm-core/src/main/java/sonia/scm/repository/work/WorkdirCreationException.java b/scm-core/src/main/java/sonia/scm/repository/work/WorkdirCreationException.java index df3bb93ff1..42d87df36b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/WorkdirCreationException.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/WorkdirCreationException.java @@ -31,6 +31,10 @@ public class WorkdirCreationException extends ExceptionWithContext { public static final String CODE = "3tS0mjSoo1"; + public WorkdirCreationException(String path) { + super(ContextEntry.ContextBuilder.entity("Path", path).build(), "Could not create directory " + path); + } + public WorkdirCreationException(String path, Exception cause) { super(ContextEntry.ContextBuilder.entity("Path", path).build(), "Could not create directory " + path, cause); } diff --git a/scm-core/src/main/java/sonia/scm/repository/work/WorkdirProvider.java b/scm-core/src/main/java/sonia/scm/repository/work/WorkdirProvider.java index ae6a5a6d5e..52124f6c9a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/WorkdirProvider.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/WorkdirProvider.java @@ -24,30 +24,55 @@ package sonia.scm.repository.work; +import sonia.scm.repository.RepositoryLocationResolver; + +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; public class WorkdirProvider { private final File rootDirectory; + private final RepositoryLocationResolver repositoryLocationResolver; + private final boolean useRepositorySpecificDir; - public WorkdirProvider() { - this(new File(System.getProperty("scm.workdir" , System.getProperty("java.io.tmpdir")), "scm-work")); + @Inject + public WorkdirProvider(RepositoryLocationResolver repositoryLocationResolver) { + this(new File(System.getProperty("scm.workdir" , System.getProperty("java.io.tmpdir")), "scm-work"), repositoryLocationResolver, System.getProperty("scm.workdir") == null); } - public WorkdirProvider(File rootDirectory) { + public WorkdirProvider(File rootDirectory, RepositoryLocationResolver repositoryLocationResolver, boolean useRepositorySpecificDir) { this.rootDirectory = rootDirectory; + this.repositoryLocationResolver = repositoryLocationResolver; + this.useRepositorySpecificDir = useRepositorySpecificDir; if (!rootDirectory.exists() && !rootDirectory.mkdirs()) { throw new IllegalStateException("could not create pool directory " + rootDirectory); } } public File createNewWorkdir() { + return createWorkDir(this.rootDirectory); + } + + public File createNewWorkdir(String repositoryId) { + if (useRepositorySpecificDir) { + return createWorkDir(repositoryLocationResolver.forClass(Path.class).getLocation(repositoryId).resolve("work").toFile()); + } else { + return createNewWorkdir(); + } + } + + private File createWorkDir(File baseDirectory) { + // recreate base directory when it may be deleted (see https://github.com/scm-manager/scm-manager/issues/1493 for example) + if (!baseDirectory.exists() && !baseDirectory.mkdirs()) { + throw new WorkdirCreationException(baseDirectory.toString()); + } try { - return Files.createTempDirectory(rootDirectory.toPath(),"workdir").toFile(); + return Files.createTempDirectory(baseDirectory.toPath(),"work-").toFile(); } catch (IOException e) { - throw new WorkdirCreationException(rootDirectory.toString(), e); + throw new WorkdirCreationException(baseDirectory.toString(), e); } } } diff --git a/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java b/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java index 281e793cbb..2ff687ae46 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java @@ -83,8 +83,8 @@ class ModifyCommandBuilderTest { @BeforeEach void initWorkdir(@TempDir Path temp) throws IOException { workdir = Files.createDirectory(temp.resolve("workdir")); - lenient().when(workdirProvider.createNewWorkdir()).thenReturn(workdir.toFile()); - commandBuilder = new ModifyCommandBuilder(command, workdirProvider, new EMail(SCM_CONFIGURATION)); + lenient().when(workdirProvider.createNewWorkdir("1")).thenReturn(workdir.toFile()); + commandBuilder = new ModifyCommandBuilder(command, workdirProvider, "1", new EMail(SCM_CONFIGURATION)); } @BeforeEach diff --git a/scm-core/src/test/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPoolTest.java b/scm-core/src/test/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPoolTest.java index cc45936bb7..cda11dc080 100644 --- a/scm-core/src/test/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPoolTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPoolTest.java @@ -38,6 +38,7 @@ import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -68,7 +69,7 @@ class SimpleCachingWorkingCopyPoolTest { @Test void shouldCreateNewWorkdirForTheFirstRequest(@TempDir Path temp) { when(workingCopyContext.getScmRepository()).thenReturn(REPOSITORY); - when(workdirProvider.createNewWorkdir()).thenReturn(temp.toFile()); + when(workdirProvider.createNewWorkdir(anyString())).thenReturn(temp.toFile()); WorkingCopy workdir = simpleCachingWorkingCopyPool.getWorkingCopy(workingCopyContext); @@ -78,7 +79,7 @@ class SimpleCachingWorkingCopyPoolTest { @Test void shouldCreateWorkdirOnlyOnceForTheSameRepository(@TempDir Path temp) throws SimpleWorkingCopyFactory.ReclaimFailedException { when(workingCopyContext.getScmRepository()).thenReturn(REPOSITORY); - when(workdirProvider.createNewWorkdir()).thenReturn(temp.toFile()); + when(workdirProvider.createNewWorkdir(anyString())).thenReturn(temp.toFile()); WorkingCopy firstWorkdir = simpleCachingWorkingCopyPool.getWorkingCopy(workingCopyContext); simpleCachingWorkingCopyPool.contextClosed(workingCopyContext, firstWorkdir.getDirectory()); @@ -96,7 +97,7 @@ class SimpleCachingWorkingCopyPoolTest { firstDirectory.mkdirs(); File secondDirectory = temp.resolve("second").toFile(); secondDirectory.mkdirs(); - when(workdirProvider.createNewWorkdir()).thenReturn( + when(workdirProvider.createNewWorkdir(anyString())).thenReturn( firstDirectory, secondDirectory); diff --git a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java index 1ab22972f9..426eb388cb 100644 --- a/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/work/SimpleWorkingCopyFactoryTest.java @@ -29,16 +29,20 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryLocationResolver; import sonia.scm.repository.RepositoryProvider; import sonia.scm.util.IOUtil; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class SimpleWorkingCopyFactoryTest { @@ -51,6 +55,8 @@ public class SimpleWorkingCopyFactoryTest { public TemporaryFolder temporaryFolder = new TemporaryFolder(); private SimpleWorkingCopyFactory simpleWorkingCopyFactory; + private final RepositoryLocationResolver repositoryLocationResolver = mock(RepositoryLocationResolver.class); + private String initialBranchForLastCloneCall; private boolean workdirIsCached = false; @@ -58,11 +64,11 @@ public class SimpleWorkingCopyFactoryTest { @Before public void initFactory() throws IOException { - WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); + WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false); WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() { @Override public WorkingCopy getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext context) { - workdir = workdirProvider.createNewWorkdir(); + workdir = workdirProvider.createNewWorkdir(context.getScmRepository().getId()); return context.initialize(workdir); } @@ -99,6 +105,10 @@ public class SimpleWorkingCopyFactoryTest { workingCopy.close(); } }; + + RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); + when(repositoryLocationResolver.forClass(Path.class)).thenReturn(instanceMock); + when(instanceMock.getLocation(anyString())).thenAnswer(invocation -> temporaryFolder.newFolder(invocation.getArgument(0, String.class)).toPath()); } @Test diff --git a/scm-core/src/test/java/sonia/scm/repository/work/WorkdirProviderTest.java b/scm-core/src/test/java/sonia/scm/repository/work/WorkdirProviderTest.java new file mode 100644 index 0000000000..08f2802f35 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/repository/work/WorkdirProviderTest.java @@ -0,0 +1,93 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository.work; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.repository.RepositoryLocationResolver; +import sonia.scm.repository.RepositoryLocationResolver.RepositoryLocationResolverInstance; + +import java.io.File; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class WorkdirProviderTest { + + @Mock + private RepositoryLocationResolver repositoryLocationResolver; + @Mock + private RepositoryLocationResolverInstance repositoryLocationResolverInstance; + + @BeforeEach + void initResolver(@TempDir Path temp) { + lenient().when(repositoryLocationResolver.forClass(Path.class)).thenReturn(repositoryLocationResolverInstance); + } + + @Test + void shouldUseGlobalTempDirectory(@TempDir Path temp) { + WorkdirProvider provider = new WorkdirProvider(temp.toFile(), repositoryLocationResolver, true); + + File newWorkdir = provider.createNewWorkdir(); + + assertThat(newWorkdir).exists(); + assertThat(newWorkdir).hasParent(temp.toFile()); + verify(repositoryLocationResolverInstance, never()).getLocation(anyString()); + } + + @Test + void shouldUseRepositorySpecificDirectory(@TempDir Path temp) { + when(repositoryLocationResolverInstance.getLocation("42")).thenReturn(temp.resolve("repo-dir")); + + WorkdirProvider provider = new WorkdirProvider(temp.toFile(), repositoryLocationResolver, true); + + File newWorkdir = provider.createNewWorkdir("42"); + + assertThat(newWorkdir).exists(); + assertThat(newWorkdir.getParentFile()).hasName("work"); + assertThat(newWorkdir.getParentFile().getParentFile()).hasName("repo-dir"); + } + + @Test + void shouldUseGlobalDirectoryIfExplicitlySet(@TempDir Path temp) { + WorkdirProvider provider = new WorkdirProvider(temp.toFile(), repositoryLocationResolver, false); + + File newWorkdir = provider.createNewWorkdir("42"); + + assertThat(newWorkdir).exists(); + assertThat(newWorkdir).hasParent(temp.toFile()); + verify(repositoryLocationResolverInstance, never()).getLocation(anyString()); + } +} diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java index 84c17a299a..c4dd3d46f4 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java @@ -29,16 +29,12 @@ import com.github.sdorra.shiro.SubjectAware; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.Subject; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.errors.CanceledException; import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.GpgSignature; import org.eclipse.jgit.lib.GpgSigner; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.CredentialsProvider; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; @@ -520,7 +516,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { } private GitMergeCommand createCommand(Consumer interceptor) { - return new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider()))) { + return new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)))) { @Override > R inClone(Function workerSupplier, GitWorkingCopyFactory workingCopyFactory, String initialBranch) { Function interceptedWorkerSupplier = git -> { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommand_Conflict_Test.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommand_Conflict_Test.java index 4c1763966e..491845fba3 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommand_Conflict_Test.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommand_Conflict_Test.java @@ -92,7 +92,7 @@ public class GitMergeCommand_Conflict_Test extends AbstractGitCommandTestBase { } private MergeConflictResult computeMergeConflictResult(String branchToMerge, String targetBranch) { - GitMergeCommand gitMergeCommand = new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider()))); + GitMergeCommand gitMergeCommand = new GitMergeCommand(createContext(), new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver)))); MergeCommandRequest mergeCommandRequest = new MergeCommandRequest(); mergeCommandRequest.setBranchToMerge(branchToMerge); mergeCommandRequest.setTargetBranch(targetBranch); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTestBase.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTestBase.java index a890a83255..005d0f8127 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTestBase.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTestBase.java @@ -72,7 +72,7 @@ class GitModifyCommandTestBase extends AbstractGitCommandTestBase { GitModifyCommand createCommand() { return new GitModifyCommand( createContext(), - new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider())), + new SimpleGitWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))), lfsBlobStoreFactory, createGitRepositoryConfigStoreProvider()); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java index 2d814bba2a..93c47a7474 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkingCopyFactoryTest.java @@ -34,7 +34,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import sonia.scm.repository.GitChangesetConverterFactory; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitTestHelper; import sonia.scm.repository.PreProcessorUtil; @@ -69,7 +68,7 @@ public class SimpleGitWorkingCopyFactoryTest extends AbstractGitCommandTestBase GitRepositoryHandler gitRepositoryHandler = mock(GitRepositoryHandler.class); proto = new ScmTransportProtocol(of(GitTestHelper.createConverterFactory()), of(hookEventFacade), of(gitRepositoryHandler)); Transport.register(proto); - workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); + workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false); } @Test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBranchCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBranchCommandTest.java index 241d416d2c..6b77e23a9f 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBranchCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBranchCommandTest.java @@ -25,7 +25,6 @@ package sonia.scm.repository.spi; import com.aragost.javahg.commands.PullCommand; -import com.google.inject.util.Providers; import org.junit.Before; import org.junit.Test; import sonia.scm.repository.Branch; @@ -46,7 +45,7 @@ public class HgBranchCommandTest extends AbstractHgCommandTestBase { @Before public void initWorkingCopyFactory() { - workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider())) { + workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) { @Override public void configure(PullCommand pullCommand) { // we do not want to configure http hooks in this unit test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModifyCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModifyCommandTest.java index e517a5f4a9..0bf63e1fe8 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModifyCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModifyCommandTest.java @@ -51,7 +51,7 @@ public class HgModifyCommandTest extends AbstractHgCommandTestBase { @Before public void initHgModifyCommand() { - SimpleHgWorkingCopyFactory workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider())) { + SimpleHgWorkingCopyFactory workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) { @Override public void configure(com.aragost.javahg.commands.PullCommand pullCommand) { // we do not want to configure http hooks in this unit test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgTagCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgTagCommandTest.java index e15d54dcb6..cffa63fb65 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgTagCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgTagCommandTest.java @@ -25,10 +25,8 @@ package sonia.scm.repository.spi; import com.aragost.javahg.commands.PullCommand; -import com.google.inject.util.Providers; import org.junit.Before; import org.junit.Test; -import sonia.scm.repository.HgTestUtil; import sonia.scm.repository.Tag; import sonia.scm.repository.api.TagCreateRequest; import sonia.scm.repository.api.TagDeleteRequest; @@ -46,7 +44,7 @@ public class HgTagCommandTest extends AbstractHgCommandTestBase { @Before public void initWorkingCopyFactory() { - workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider())) { + workingCopyFactory = new SimpleHgWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(repositoryLocationResolver))) { @Override public void configure(PullCommand pullCommand) { // we do not want to configure http hooks in this unit test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactoryTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactoryTest.java index d429371a04..bfd708faef 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactoryTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/SimpleHgWorkingCopyFactoryTest.java @@ -25,13 +25,10 @@ package sonia.scm.repository.spi; import com.aragost.javahg.Repository; -import com.google.inject.util.Providers; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import sonia.scm.repository.HgEnvironmentBuilder; -import sonia.scm.repository.HgTestUtil; import sonia.scm.repository.work.SimpleCachingWorkingCopyPool; import sonia.scm.repository.work.WorkdirProvider; import sonia.scm.repository.work.WorkingCopy; @@ -55,7 +52,7 @@ public class SimpleHgWorkingCopyFactoryTest extends AbstractHgCommandTestBase { @Before public void bindScmProtocol() throws IOException { - workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); + workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false); workingCopyFactory = new SimpleHgWorkingCopyFactory(new SimpleCachingWorkingCopyPool(workdirProvider)) { @Override public void configure(com.aragost.javahg.commands.PullCommand pullCommand) { diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java index 1d7fcf2b54..1fc0e0b4d4 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SimpleSvnWorkingCopyFactoryTest.java @@ -49,7 +49,7 @@ public class SimpleSvnWorkingCopyFactoryTest extends AbstractSvnCommandTestBase @Before public void initWorkDirProvider() throws IOException { - workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); + workdirProvider = new WorkdirProvider(temporaryFolder.newFolder(), repositoryLocationResolver, false); } @Test diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnModifyCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnModifyCommandTest.java index ef646dfce2..832cb647e5 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnModifyCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnModifyCommandTest.java @@ -57,7 +57,7 @@ public class SvnModifyCommandTest extends AbstractSvnCommandTestBase { @Before public void initSvnModifyCommand() { context = createContext(); - workingCopyFactory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(context.getDirectory()))); + workingCopyFactory = new SimpleSvnWorkingCopyFactory(new NoneCachingWorkingCopyPool(new WorkdirProvider(context.getDirectory(), repositoryLocationResolver, false))); svnModifyCommand = new SvnModifyCommand(context, workingCopyFactory); } diff --git a/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryExporter.java b/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryExporter.java index b0db3d3084..6b148f108f 100644 --- a/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryExporter.java +++ b/scm-webapp/src/main/java/sonia/scm/importexport/FullScmRepositoryExporter.java @@ -107,7 +107,7 @@ public class FullScmRepositoryExporter { } private void writeRepository(RepositoryService service, TarArchiveOutputStream taos) throws IOException { - File newWorkdir = workdirProvider.createNewWorkdir(); + File newWorkdir = workdirProvider.createNewWorkdir(service.getRepository().getId()); try { File repositoryFile = Files.createFile(Paths.get(newWorkdir.getPath(), "repository")).toFile(); try (FileOutputStream repositoryFos = new FileOutputStream(repositoryFile)) { @@ -124,7 +124,7 @@ public class FullScmRepositoryExporter { } private void writeStoreData(Repository repository, TarArchiveOutputStream taos) throws IOException { - File newWorkdir = workdirProvider.createNewWorkdir(); + File newWorkdir = workdirProvider.createNewWorkdir(repository.getId()); try { File metadata = Files.createFile(Paths.get(newWorkdir.getPath(), "metadata")).toFile(); try (FileOutputStream metadataFos = new FileOutputStream(metadata)) { diff --git a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryExporterTest.java b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryExporterTest.java index fd3adabb97..5f4d12bbeb 100644 --- a/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryExporterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/importexport/FullScmRepositoryExporterTest.java @@ -87,7 +87,8 @@ class FullScmRepositoryExporterTest { void shouldExportEverythingAsTarArchive(@TempDir Path temp) throws IOException { BundleCommandBuilder bundleCommandBuilder = mock(BundleCommandBuilder.class); when(repositoryService.getBundleCommand()).thenReturn(bundleCommandBuilder); - when(workdirProvider.createNewWorkdir()).thenAnswer(invocation -> createWorkDir(temp)); + when(repositoryService.getRepository()).thenReturn(REPOSITORY); + when(workdirProvider.createNewWorkdir(anyString())).thenAnswer(invocation -> createWorkDir(temp, invocation.getArgument(0, String.class))); ByteArrayOutputStream baos = new ByteArrayOutputStream(); exporter.export(REPOSITORY, baos); @@ -98,8 +99,8 @@ class FullScmRepositoryExporterTest { workDirsCreated.forEach(wd -> assertThat(wd).doesNotExist()); } - private File createWorkDir(Path temp) throws IOException { - Path newWorkDir = temp.resolve("workDir-" + workDirsCreated.size()); + private File createWorkDir(Path temp, String repositoryId) throws IOException { + Path newWorkDir = temp.resolve("workDir-" + repositoryId); workDirsCreated.add(newWorkDir); Files.createDirectories(newWorkDir); return newWorkDir.toFile();