From 0ab8f52e7f6b1bf01c399e3129cf80e7b35b85a6 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Tue, 10 Sep 2019 10:50:56 +0200 Subject: [PATCH] Check whether directory already exists as a file --- .../sonia/scm/repository/spi/GitModifyCommand.java | 12 ++++++++++-- .../scm/repository/spi/GitModifyCommandTest.java | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModifyCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModifyCommand.java index d03af28e3a..9a8cf7e16a 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModifyCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModifyCommand.java @@ -77,7 +77,7 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman @Override public void create(String toBeCreated, File file, boolean overwrite) throws IOException { Path targetFile = new File(workDir, toBeCreated).toPath(); - Files.createDirectories(targetFile.getParent()); + createDirectories(targetFile); if (overwrite) { Files.move(file.toPath(), targetFile, REPLACE_EXISTING); } else { @@ -97,7 +97,7 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman @Override public void modify(String path, File file) throws IOException { Path targetFile = new File(workDir, path).toPath(); - Files.createDirectories(targetFile.getParent()); + createDirectories(targetFile); if (!targetFile.toFile().exists()) { throw notFound(createFileContext(path)); } @@ -124,6 +124,14 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman } } + private void createDirectories(Path targetFile) throws IOException { + try { + Files.createDirectories(targetFile.getParent()); + } catch (FileAlreadyExistsException e) { + throw alreadyExists(createFileContext(targetFile.toString())); + } + } + private ContextEntry.ContextBuilder createFileContext(String path) { ContextEntry.ContextBuilder contextBuilder = entity("file", path); if (!StringUtils.isEmpty(request.getBranch())) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTest.java index 9916272596..0e0447f1fa 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommandTest.java @@ -111,6 +111,20 @@ public class GitModifyCommandTest extends AbstractGitCommandTestBase { command.execute(request); } + @Test(expected = AlreadyExistsException.class) + public void shouldFailIfPathAlreadyExistsAsAFile() throws IOException { + File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile(); + + GitModifyCommand command = createCommand(); + + ModifyCommandRequest request = new ModifyCommandRequest(); + request.setCommitMessage("test commit"); + request.addRequest(new ModifyCommandRequest.CreateFileRequest("a.txt/newFile", newFile, false)); + request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det")); + + command.execute(request); + } + @Test public void shouldOverwriteExistingFileIfOverwriteFlagSet() throws IOException, GitAPIException { File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile();