From 8771f68081b7bfdbee0b3c98f26c8f4ccbd0b399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 7 Nov 2018 14:02:02 +0100 Subject: [PATCH] Set author for merge --- .../repository/api/MergeCommandBuilder.java | 6 ++++++ .../repository/spi/MergeCommandRequest.java | 21 ++++++++++++++++--- .../scm/repository/spi/GitMergeCommand.java | 11 ++++++++-- .../repository/spi/GitMergeCommandTest.java | 17 ++++++++++++++- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java index 65eed2f2a1..00acb66874 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/MergeCommandBuilder.java @@ -1,6 +1,7 @@ package sonia.scm.repository.api; import com.google.common.base.Preconditions; +import sonia.scm.repository.Person; import sonia.scm.repository.spi.MergeCommand; import sonia.scm.repository.spi.MergeCommandRequest; @@ -23,6 +24,11 @@ public class MergeCommandBuilder { return this; } + public MergeCommandBuilder setAuthor(Person author) { + request.setAuthor(author); + return this; + } + public MergeCommandBuilder reset() { request.reset(); return this; diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java index e01e580afa..a4e22b5ad1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/MergeCommandRequest.java @@ -4,6 +4,8 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.base.Strings; import sonia.scm.Validateable; +import sonia.scm.repository.Person; +import sonia.scm.util.Util; import java.io.Serializable; @@ -13,6 +15,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl private String branchToMerge; private String targetBranch; + private Person author; public String getBranchToMerge() { return branchToMerge; @@ -30,8 +33,18 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl this.targetBranch = targetBranch; } + public Person getAuthor() { + return author; + } + + public void setAuthor(Person author) { + this.author = author; + } + public boolean isValid() { - return !Strings.isNullOrEmpty(getBranchToMerge()) && !Strings.isNullOrEmpty(getTargetBranch()); + return !Strings.isNullOrEmpty(getBranchToMerge()) + && !Strings.isNullOrEmpty(getTargetBranch()) + && getAuthor() != null; } public void reset() { @@ -52,12 +65,13 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl final MergeCommandRequest other = (MergeCommandRequest) obj; return Objects.equal(branchToMerge, other.branchToMerge) - && Objects.equal(targetBranch, other.targetBranch); + && Objects.equal(targetBranch, other.targetBranch) + && Objects.equal(author, other.author); } @Override public int hashCode() { - return Objects.hashCode(branchToMerge, targetBranch); + return Objects.hashCode(branchToMerge, targetBranch, author); } @Override @@ -65,6 +79,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl return MoreObjects.toStringHelper(this) .add("branchToMerge", branchToMerge) .add("targetBranch", targetBranch) + .add("author", author) .toString(); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java index 800317ef67..8ed3e4961c 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java @@ -71,8 +71,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand MergeResult result; try { result = clone.merge() - .setCommit(true) - .setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target)) + .setCommit(false) // we want to set the author manually .include(toMerge, resolveRevision(toMerge)) .call(); } catch (GitAPIException e) { @@ -80,6 +79,14 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand } if (result.getMergeStatus().isSuccessful()) { logger.debug("merged branch {} into {}", toMerge, target); + try { + clone.commit() + .setAuthor(request.getAuthor().getName(), request.getAuthor().getMail()) + .setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target)) + .call(); + } catch (GitAPIException e) { + throw new InternalRepositoryException("could not commit merge between branch " + toMerge + " and " + target, e); + } try { clone.push().call(); } catch (GitAPIException e) { 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 c6949a3a11..23b41bf54a 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 @@ -1,9 +1,17 @@ package sonia.scm.repository.spi; import org.assertj.core.api.Assertions; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; +import sonia.scm.repository.Person; import sonia.scm.repository.api.MergeCommandResult; +import java.io.IOException; + import static org.assertj.core.api.Assertions.assertThat; @@ -34,15 +42,22 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { } @Test - public void shouldMergeMergeableBranches() { + public void shouldMergeMergeableBranches() throws IOException, GitAPIException { GitMergeCommand command = createCommand(); MergeCommandRequest request = new MergeCommandRequest(); request.setTargetBranch("master"); request.setBranchToMerge("mergeable"); + request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det")); MergeCommandResult mergeCommandResult = command.merge(request); assertThat(mergeCommandResult.isSuccess()).isTrue(); + + Repository repository = createContext().open(); + Iterable mergeCommit = new Git(repository).log().add(repository.resolve("master")).setMaxCount(1).call(); + PersonIdent mergeAuthor = mergeCommit.iterator().next().getAuthorIdent(); + assertThat(mergeAuthor.getName()).isEqualTo("Dirk Gently"); + assertThat(mergeAuthor.getEmailAddress()).isEqualTo("dirk@holistic.det"); } @Test