From 04c5d6f84ac5aa69592d971b063c6f3fc25e52eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 7 Nov 2018 11:13:21 +0100 Subject: [PATCH] Fix deletion of temporary clone directory --- .../repository/spi/SimpleGitWorkdirFactory.java | 17 ++++++++++++----- .../spi/SimpleGitWorkdirFactoryTest.java | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java index c69acf5c6e..d62cd90bbc 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/SimpleGitWorkdirFactory.java @@ -11,13 +11,11 @@ import sonia.scm.repository.InternalRepositoryException; import java.io.File; import java.io.IOException; -import java.util.Random; public class SimpleGitWorkdirFactory implements GitWorkdirFactory { private static final Logger logger = LoggerFactory.getLogger(SimpleGitWorkdirFactory.class); - private final Random random = new Random(); private final File poolDirectory; public SimpleGitWorkdirFactory() { @@ -30,13 +28,22 @@ public class SimpleGitWorkdirFactory implements GitWorkdirFactory { public WorkingCopy createWorkingCopy(GitContext gitContext) { try { - Repository clone = cloneRepository(gitContext.getDirectory(), new File(poolDirectory, Long.toString(random.nextLong()))); + Repository clone = cloneRepository(gitContext.getDirectory(), createNewWorkdir()); return new WorkingCopy(clone, this::close); } catch (GitAPIException e) { throw new InternalRepositoryException("could not clone working copy of repository", e); + } catch (IOException e) { + throw new InternalRepositoryException("could not create temporary directory for copy of repository", e); } } + private File createNewWorkdir() throws IOException { + File workdir = File.createTempFile("workdir", "", poolDirectory); + workdir.delete(); + workdir.mkdir(); + return workdir; + } + protected Repository cloneRepository(File bareRepository, File target) throws GitAPIException { return Git.cloneRepository() .setURI(bareRepository.getAbsolutePath()) @@ -48,9 +55,9 @@ public class SimpleGitWorkdirFactory implements GitWorkdirFactory { private void close(Repository repository) { repository.close(); try { - FileUtils.delete(repository.getDirectory(), FileUtils.RECURSIVE); + FileUtils.delete(repository.getWorkTree(), FileUtils.RECURSIVE); } catch (IOException e) { - logger.warn("could not delete temporary git workdir '{}'", repository.getDirectory(), e); + logger.warn("could not delete temporary git workdir '{}'", repository.getWorkTree(), e); } } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkdirFactoryTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkdirFactoryTest.java index d9c41f85b5..0c39a1deb0 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkdirFactoryTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/SimpleGitWorkdirFactoryTest.java @@ -66,7 +66,7 @@ public class SimpleGitWorkdirFactoryTest extends AbstractGitCommandTestBase { File directory; try (WorkingCopy workingCopy = factory.createWorkingCopy(createContext())) { - directory = workingCopy.get().getDirectory(); + directory = workingCopy.get().getWorkTree(); } assertThat(directory).doesNotExist(); }