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 3ff65871c1..80c8c196dc 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 @@ -99,19 +99,23 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman failIfNotChanged(() -> new NoChangesMadeException(repository, ModifyWorker.this.request.getBranch())); Optional revCommit = doCommit(request.getCommitMessage(), request.getAuthor(), request.isSign()); - if (initialCommit && StringUtils.isNotBlank(context.getGlobalConfig().getDefaultBranch())) { - createDefaultBranch(); + if (initialCommit) { + handleBranchForInitialCommit(); } push(); return revCommit.orElseThrow(() -> new NoChangesMadeException(repository, ModifyWorker.this.request.getBranch())).name(); } - private void createDefaultBranch() { - try { - getClone().checkout().setName(context.getGlobalConfig().getDefaultBranch()).setCreateBranch(true).call(); - } catch (GitAPIException e) { - throw new InternalRepositoryException(repository, "could not create default branch for initial commit", e); + private void handleBranchForInitialCommit() { + String branch = StringUtils.isNotBlank(request.getBranch()) ? request.getBranch() : context.getGlobalConfig().getDefaultBranch(); + if (StringUtils.isNotBlank(branch)) { + try { + getClone().checkout().setName(branch).setCreateBranch(true).call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException(repository, "could not create default branch for initial commit", e); + + } } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java index 11019b288c..346a2776b1 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java @@ -67,7 +67,11 @@ class GitWorkingCopyInitializer { Ref head = clone.exactRef(Constants.HEAD); if (head == null || !head.isSymbolic() || (initialBranch != null && !head.getTarget().getName().endsWith(initialBranch))) { - throw notFound(entity("Branch", initialBranch).in(context.getRepository())); + if (clone.getRefDatabase().getRefs().isEmpty()) { + LOG.warn("could not initialize empty clone with given branch {}; this has to be handled later on", initialBranch); + } else { + throw notFound(entity("Branch", initialBranch).in(context.getRepository())); + } } return new ParentAndClone<>(null, clone, target); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommand_InitialCommitTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommand_InitialCommitTest.java index 8b8d4fae6c..f9b1a61a8c 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommand_InitialCommitTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModifyCommand_InitialCommitTest.java @@ -64,7 +64,7 @@ public class GitModifyCommand_InitialCommitTest extends AbstractGitCommandTestBa } @Test - public void shouldCreateCommitOnMasterByDkefault() throws IOException, GitAPIException { + public void shouldCreateCommitOnMasterByDefault() throws IOException, GitAPIException { createContext().getGlobalConfig().setDefaultBranch(""); executeModifyCommand(); @@ -87,17 +87,32 @@ public class GitModifyCommand_InitialCommitTest extends AbstractGitCommandTestBa } } - private void executeModifyCommand() throws IOException { - File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile(); + @Test + public void shouldCreateCommitWithBranchFromRequestIfPresent() throws IOException, GitAPIException { + createContext().getGlobalConfig().setDefaultBranch("main"); - GitModifyCommand command = createCommand(); + ModifyCommandRequest request = createRequest(); + request.setBranch("different"); + createCommand().execute(request); + + try (Git git = new Git(createContext().open())) { + List branches = git.branchList().call(); + assertThat(branches).extracting("name").containsExactly("refs/heads/different"); + } + } + + private void executeModifyCommand() throws IOException { + createCommand().execute(createRequest()); + } + + private ModifyCommandRequest createRequest() throws IOException { + File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile(); ModifyCommandRequest request = new ModifyCommandRequest(); request.setCommitMessage("initial commit"); request.addRequest(new ModifyCommandRequest.CreateFileRequest("new_file", newFile, false)); request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det")); - - command.execute(request); + return request; } private GitModifyCommand createCommand() {