From bd3671b4282dcf6276381eebc9df341edb70a70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 28 Jan 2021 12:53:39 +0100 Subject: [PATCH] Use repository specific work dirs (#1510) With this change, work dirs are created in the directory of the repository and no longer in the global scm work dir directory. This is relevant due to two facts: 1. Repositories may contain confidential data and therefore reside in special directories (that may be mounted on special drives). It may be considered a breach when these directories are cloned or otherwise copied to global temporary drives. 2. Big repositories may overload global temp spaces. It may be easier to create special drives with more space for such big repositories. --- CHANGELOG.md | 1 + .../repository/api/ModifyCommandBuilder.java | 4 +- .../scm/repository/api/RepositoryService.java | 2 +- .../work/NoneCachingWorkingCopyPool.java | 2 +- .../work/SimpleCachingWorkingCopyPool.java | 2 +- .../work/WorkdirCreationException.java | 4 + .../scm/repository/work/WorkdirProvider.java | 35 ++++++- .../api/ModifyCommandBuilderTest.java | 4 +- .../SimpleCachingWorkingCopyPoolTest.java | 7 +- .../work/SimpleWorkingCopyFactoryTest.java | 14 ++- .../repository/work/WorkdirProviderTest.java | 93 +++++++++++++++++++ .../repository/spi/GitMergeCommandTest.java | 6 +- .../spi/GitMergeCommand_Conflict_Test.java | 2 +- .../spi/GitModifyCommandTestBase.java | 2 +- .../spi/SimpleGitWorkingCopyFactoryTest.java | 3 +- .../repository/spi/HgBranchCommandTest.java | 3 +- .../repository/spi/HgModifyCommandTest.java | 2 +- .../scm/repository/spi/HgTagCommandTest.java | 4 +- .../spi/SimpleHgWorkingCopyFactoryTest.java | 5 +- .../spi/SimpleSvnWorkingCopyFactoryTest.java | 2 +- .../repository/spi/SvnModifyCommandTest.java | 2 +- .../FullScmRepositoryExporter.java | 4 +- .../FullScmRepositoryExporterTest.java | 7 +- 23 files changed, 167 insertions(+), 43 deletions(-) create mode 100644 scm-core/src/test/java/sonia/scm/repository/work/WorkdirProviderTest.java 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();