From e35ec519cbfafce1ee673c9d7e17856764f31f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 28 Sep 2018 10:14:04 +0200 Subject: [PATCH] Add method to retrieve branch name from repository --- .../java/sonia/scm/repository/GitUtil.java | 29 +++++++++++++- .../repository/spi/AbstractGitCommand.java | 8 ++-- .../scm/repository/spi/GitLogCommand.java | 2 +- .../scm/repository/spi/GitLogCommandTest.java | 39 ++++++++++++++++--- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java index 7e145f2dd9..ed698ef00e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java @@ -499,6 +499,33 @@ public final class GitUtil return ref; } + public static String getRepositoryHeadBranchName(org.eclipse.jgit.lib.Repository repo) { + Map refs = repo.getAllRefs(); + Ref lastHeadRef = null; + + for (Map.Entry e : refs.entrySet()) { + String key = e.getKey(); + + if (REF_HEAD.equals(key)) { + if (e.getValue().isSymbolic() && isBranch(e.getValue().getTarget().getName())) { + return getBranch(e.getValue().getTarget()); + } + } else if (key.startsWith(REF_HEAD_PREFIX)) { + if (REF_MASTER.equals(key.substring(REF_HEAD_PREFIX.length()))) { + return REF_MASTER; + } else { + lastHeadRef = e.getValue(); + } + } + } + + if (lastHeadRef == null) { + return null; + } else { + return getBranch(lastHeadRef); + } + } + /** * Method description * @@ -648,7 +675,7 @@ public final class GitUtil return tagName; } - + /** * Method description * diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java index ed2d06e209..db7adce3f8 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitCommand.java @@ -97,9 +97,9 @@ public class AbstractGitCommand return commit; } - protected String getBranchNameOrDefault(String requestedBranch) { + protected String getBranchNameOrDefault(Repository gitRepository, String requestedBranch) { if ( Strings.isNullOrEmpty(requestedBranch) ) { - return getDefaultBranchName(); + return getDefaultBranchName(gitRepository); } else { return requestedBranch; } @@ -115,12 +115,12 @@ public class AbstractGitCommand return head; } - protected String getDefaultBranchName() { + protected String getDefaultBranchName(Repository gitRepository) { String defaultBranchName = repository.getProperty(GitConstants.PROPERTY_DEFAULT_BRANCH); if (!Strings.isNullOrEmpty(defaultBranchName)) { return defaultBranchName; } else { - return null; + return GitUtil.getRepositoryHeadBranchName(gitRepository); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index 9b106e95a2..146962fa80 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -208,7 +208,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand } ObjectId head = getBranchOrDefault(repository, request.getBranch()); - String branch = getBranchNameOrDefault(request.getBranch()); + String branch = getBranchNameOrDefault(repository,request.getBranch()); if (head != null) { if (startId != null) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java index b1420cb885..2709646aba 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java @@ -1,3 +1,4 @@ + /** * Copyright (c) 2010, Sebastian Sdorra * All rights reserved. @@ -33,24 +34,24 @@ package sonia.scm.repository.spi; -//~--- non-JDK imports -------------------------------------------------------- - +import com.google.common.io.Files; import org.junit.Test; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitConstants; import sonia.scm.repository.Modifications; +import java.io.File; +import java.io.IOException; + +import static java.nio.charset.Charset.defaultCharset; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -//~--- JDK imports ------------------------------------------------------------ - /** * Unit tests for {@link GitLogCommand}. * @@ -73,7 +74,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase assertEquals("86a6645eceefe8b9a247db5eb16e3d89a7e6e6d1", result.getChangesets().get(1).getId()); assertEquals("592d797cd36432e591416e8b2b98154f4f163411", result.getChangesets().get(2).getId()); assertEquals("435df2f061add3589cb326cc64be9b9c3897ceca", result.getChangesets().get(3).getId()); - assertNull(result.getBranchName()); + assertEquals("master", result.getBranchName()); assertTrue(result.getChangesets().stream().allMatch(r -> r.getBranches().isEmpty())); // set default branch and fetch again @@ -215,6 +216,32 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase assertEquals("435df2f061add3589cb326cc64be9b9c3897ceca", c2.getId()); } + @Test + public void shouldFindDefaultBranchFromHEAD() throws Exception { + setRepositoryHeadReference("ref: refs/heads/test-branch"); + + ChangesetPagingResult changesets = createCommand().getChangesets(new LogCommandRequest()); + + assertEquals("test-branch", changesets.getBranchName()); + } + + @Test + public void shouldFindMasterBranchWhenHEADisNoRef() throws Exception { + setRepositoryHeadReference("592d797cd36432e591416e8b2b98154f4f163411"); + + ChangesetPagingResult changesets = createCommand().getChangesets(new LogCommandRequest()); + + assertEquals("master", changesets.getBranchName()); + } + + private void setRepositoryHeadReference(String s) throws IOException { + Files.write(s, repositoryHeadReferenceFile(), defaultCharset()); + } + + private File repositoryHeadReferenceFile() { + return new File(repositoryDirectory, "HEAD"); + } + private GitLogCommand createCommand() { return new GitLogCommand(createContext(), repository);