Use logged in user for author as default

This commit is contained in:
René Pfeuffer
2018-11-08 13:30:05 +01:00
parent 6f7aa24700
commit 720862296e
3 changed files with 54 additions and 5 deletions

View File

@@ -43,8 +43,7 @@ public class MergeCommandRequest implements Validateable, Resetable, Serializabl
public boolean isValid() { public boolean isValid() {
return !Strings.isNullOrEmpty(getBranchToMerge()) return !Strings.isNullOrEmpty(getBranchToMerge())
&& !Strings.isNullOrEmpty(getTargetBranch()) && !Strings.isNullOrEmpty(getTargetBranch());
&& getAuthor() != null;
} }
public void reset() { public void reset() {

View File

@@ -1,5 +1,7 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
@@ -14,6 +16,7 @@ import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Person; import sonia.scm.repository.Person;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
import sonia.scm.repository.api.MergeDryRunCommandResult; import sonia.scm.repository.api.MergeDryRunCommandResult;
import sonia.scm.user.User;
import java.io.IOException; import java.io.IOException;
@@ -103,9 +106,10 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
private void doCommit() { private void doCommit() {
logger.debug("merged branch {} into {}", toMerge, target); logger.debug("merged branch {} into {}", toMerge, target);
Person authorToUse = determineAuthor();
try { try {
clone.commit() clone.commit()
.setAuthor(author.getName(), author.getMail()) .setAuthor(authorToUse.getName(), authorToUse.getMail())
.setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target)) .setMessage(String.format(MERGE_COMMIT_MESSAGE_TEMPLATE, toMerge, target))
.call(); .call();
} catch (GitAPIException e) { } catch (GitAPIException e) {
@@ -113,6 +117,19 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
} }
} }
private Person determineAuthor() {
if (author == null) {
Subject subject = SecurityUtils.getSubject();
User user = subject.getPrincipals().oneByType(User.class);
String name = user.getDisplayName();
String email = user.getMail();
logger.debug("no author set; using logged in user: {} <{}>", name, email);
return new Person(name, email);
} else {
return author;
}
}
private void push() { private void push() {
try { try {
clone.push().call(); clone.push().call();

View File

@@ -1,22 +1,32 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
import org.assertj.core.api.Assertions; import com.github.sdorra.shiro.ShiroRule;
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.Git;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import sonia.scm.repository.Person; import sonia.scm.repository.Person;
import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeCommandResult;
import sonia.scm.user.User;
import java.io.IOException; import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
@SubjectAware(configuration = "classpath:sonia/scm/configuration/shiro.ini")
public class GitMergeCommandTest extends AbstractGitCommandTestBase { public class GitMergeCommandTest extends AbstractGitCommandTestBase {
private static final String REALM = "AdminRealm";
@Rule
public ShiroRule shiro = new ShiroRule();
@Test @Test
public void shouldDetectMergeableBranches() { public void shouldDetectMergeableBranches() {
GitMergeCommand command = createCommand(); GitMergeCommand command = createCommand();
@@ -73,6 +83,29 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
assertThat(mergeCommandResult.getFilesWithConflict()).containsExactly("a.txt"); assertThat(mergeCommandResult.getFilesWithConflict()).containsExactly("a.txt");
} }
@Test
@SubjectAware(username = "admin", password = "secret")
public void shouldTakeAuthorFromSubjectIfNotSet() throws IOException, GitAPIException {
shiro.setSubject(
new Subject.Builder()
.principals(new SimplePrincipalCollection(new User("dirk", "Dirk Gently", "dirk@holistic.det"), REALM))
.buildSubject());
GitMergeCommand command = createCommand();
MergeCommandRequest request = new MergeCommandRequest();
request.setTargetBranch("master");
request.setBranchToMerge("mergeable");
MergeCommandResult mergeCommandResult = command.merge(request);
assertThat(mergeCommandResult.isSuccess()).isTrue();
Repository repository = createContext().open();
Iterable<RevCommit> 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");
}
private GitMergeCommand createCommand() { private GitMergeCommand createCommand() {
return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory()); return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory());
} }