From 92390ce0d23921e83cde6ddf1b118dac7f1db01d Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 12 May 2023 13:12:40 +0200 Subject: [PATCH] Fix default branch in git mirror command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The git mirror command did not set the default branch correctly in all cases. If the source repository contained a 'master' branch, no default branch was set. This led to an error in the refresh process, when globally another branch has been configured as dafault (when not changed, this is 'main'), because the working copy should be created with the main branch checked out. Because no default was specified, the globally configured default (by default 'main') had been taken and that branch does not exist in the mirror. So all subsequent mirror updates failed with a message like this one: could not find branch with id main in repository with id ... With this fix, the default branch is always set in the SCM-Manager configuration for the repository and therefore cannot be missing in subsequent updates. Committed-by: Konstantin Schaper Co-authored-by: René Pfeuffer --- gradle/changelog/mirror_default_branch.yaml | 2 + .../scm/repository/spi/GitMirrorCommand.java | 38 ++++++++++------ .../repository/spi/GitMirrorCommandTest.java | 41 ++++++++++-------- .../spi/scm-git-spi-mirror-test.zip | Bin 0 -> 48593 bytes 4 files changed, 51 insertions(+), 30 deletions(-) create mode 100644 gradle/changelog/mirror_default_branch.yaml create mode 100644 scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-mirror-test.zip diff --git a/gradle/changelog/mirror_default_branch.yaml b/gradle/changelog/mirror_default_branch.yaml new file mode 100644 index 0000000000..5d2a3e9847 --- /dev/null +++ b/gradle/changelog/mirror_default_branch.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Configuration of default branch in the git mirror command diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMirrorCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMirrorCommand.java index 35409eb32d..78015c1962 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMirrorCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMirrorCommand.java @@ -26,6 +26,7 @@ package sonia.scm.repository.spi; import com.google.common.base.Stopwatch; import com.google.common.base.Strings; +import org.apache.commons.lang.StringUtils; import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; @@ -214,7 +215,9 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman return new MirrorCommandResult(result, mirrorLog, stopwatch.stop().elapsed(), lfsUpdateResult); } - defaultBranchSelector.newDefaultBranch().ifPresent(this::setNewDefaultBranch); + String currentDefaultBranchInRepository = getCurrentDefaultBranch(); + defaultBranchSelector.newDefaultBranch(currentDefaultBranchInRepository) + .ifPresent(this::setNewDefaultBranch); String[] pushRefSpecs = generatePushRefSpecs().toArray(new String[0]); forcePush(pushRefSpecs); @@ -223,17 +226,18 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman } private void setNewDefaultBranch(String newDefaultBranch) { - mirrorLog.add("Old default branch deleted. Setting default branch to '" + newDefaultBranch + "'."); - try { - String oldBranch = git.getRepository().getBranch(); - RefUpdate refUpdate = git.getRepository().getRefDatabase().newUpdate(Constants.HEAD, true); - refUpdate.setForceUpdate(true); - RefUpdate.Result result = refUpdate.link(Constants.R_HEADS + newDefaultBranch); - if (result != RefUpdate.Result.FORCED) { - throw new InternalRepositoryException(getRepository(), "Could not set HEAD to new default branch"); + String oldBranch = getCurrentDefaultBranch(); + if (!StringUtils.equals(oldBranch, newDefaultBranch)) { + mirrorLog.add("Old default branch deleted. Setting default branch to '" + newDefaultBranch + "'."); + RefUpdate refUpdate = git.getRepository().getRefDatabase().newUpdate(Constants.HEAD, true); + refUpdate.setForceUpdate(true); + RefUpdate.Result result = refUpdate.link(Constants.R_HEADS + newDefaultBranch); + if (result != RefUpdate.Result.FORCED) { + throw new InternalRepositoryException(getRepository(), "Could not set HEAD to new default branch"); + } + git.branchDelete().setBranchNames(oldBranch).setForce(true).call(); } - git.branchDelete().setBranchNames(oldBranch).setForce(true).call(); } catch (GitAPIException | IOException e) { throw new InternalRepositoryException(getRepository(), "Error while switching branch to change default branch", e); } @@ -242,6 +246,14 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman storeProvider.setDefaultBranch(repository, newDefaultBranch); } + private String getCurrentDefaultBranch() { + try { + return git.getRepository().getBranch(); + } catch (IOException e) { + return null; + } + } + private Collection generatePushRefSpecs() { Collection refSpecs = new ArrayList<>(); refSpecs.add("refs/heads/*:refs/heads/*"); @@ -759,9 +771,9 @@ public class GitMirrorCommand extends AbstractGitCommand implements MirrorComman return changed; } - public Optional newDefaultBranch() { - if (initialDefaultBranch == null && newBranches.contains("master") || remainingBranches.contains(initialDefaultBranch)) { - return empty(); + public Optional newDefaultBranch(String currentDefaultBranchInRepository) { + if (initialDefaultBranch == null && newBranches.contains(currentDefaultBranchInRepository) || remainingBranches.contains(initialDefaultBranch)) { + return of(currentDefaultBranchInRepository); } else if (!newBranches.isEmpty() && initialBranches.isEmpty()) { return of(newBranches.iterator().next()); } else if (initialDefaultBranch == null && newBranches.isEmpty()) { diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMirrorCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMirrorCommandTest.java index 536d608779..e73369b1df 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMirrorCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMirrorCommandTest.java @@ -78,6 +78,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static sonia.scm.repository.api.MirrorCommandResult.ResultType.FAILED; import static sonia.scm.repository.api.MirrorCommandResult.ResultType.OK; @@ -165,7 +166,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { @Test public void shouldAcceptEmptyInitialMirror() throws IOException, GitAPIException { - MirrorCommandResult result = callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> { + MirrorCommandResult result = callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> c.setFilter(new MirrorFilter() { @Override public Filter getFilter(FilterContext context) { @@ -181,8 +182,8 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { } }; } - }); - }); + }) + ); assertThat(result.getResult()).isEqualTo(REJECTED_UPDATES); assertThat(result.getLog()).contains("Branches:") @@ -200,7 +201,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { @Test public void shouldAcceptOnlyTagInInitialMirror() { assertThrows(IllegalStateException.class, () -> - callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> { + callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> c.setFilter(new MirrorFilter() { @Override public Filter getFilter(FilterContext context) { @@ -211,13 +212,13 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { } }; } - }); - })); + }) + )); } @Test public void shouldFilterMasterBranchWhenFilteredOnInitialMirror() throws IOException, GitAPIException { - MirrorCommandResult result = callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> { + MirrorCommandResult result = callMirrorCommand(repositoryDirectory.getAbsolutePath(), c -> c.setFilter(new MirrorFilter() { @Override public Filter getFilter(FilterContext context) { @@ -232,8 +233,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { } }; } - }); - }); + })); assertThat(result.getResult()).isEqualTo(REJECTED_UPDATES); assertThat(result.getLog()) @@ -808,6 +808,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { @Test public void shouldSelectNewHeadIfOldHeadIsDeleted() throws IOException, GitAPIException { callMirrorCommand(); + reset(storeProvider); try (Git updatedSource = Git.open(repositoryDirectory)) { updatedSource.checkout().setName("test-branch").call(); @@ -879,7 +880,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.accepted(BRANCH, "master"); selector.accepted(BRANCH, "something"); - assertThat(selector.newDefaultBranch()).isEmpty(); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("master"); } @Test @@ -890,7 +891,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.accepted(BRANCH, "new"); selector.deleted(BRANCH, "two"); - assertThat(selector.newDefaultBranch()).isEmpty(); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("master"); } @Test @@ -900,7 +901,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.deleted(BRANCH, "master"); - assertThat(selector.newDefaultBranch()).get().isIn("one", "two", "three"); + assertThat(selector.newDefaultBranch("master")).get().isIn("one", "two", "three"); } @Test @@ -912,7 +913,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.deleted(BRANCH, "one"); selector.deleted(BRANCH, "three"); - assertThat(selector.newDefaultBranch()).get().isEqualTo("two"); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("two"); } @Test @@ -924,7 +925,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.deleted(BRANCH, "one"); selector.deleted(BRANCH, "three"); - assertThat(selector.newDefaultBranch()).get().isEqualTo("two"); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("two"); } @Test @@ -938,7 +939,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.accepted(BRANCH, "new"); selector.deleted(BRANCH, "three"); - assertThrows(IllegalStateException.class, selector::newDefaultBranch); + assertThrows(IllegalStateException.class, () -> selector.newDefaultBranch("master")); } @Test @@ -949,7 +950,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.accepted(BRANCH, "main"); selector.deleted(BRANCH, "master"); - assertThat(selector.newDefaultBranch()).get().isEqualTo("main"); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("main"); } @Test @@ -959,7 +960,7 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { selector.accepted(BRANCH, "main"); - assertThat(selector.newDefaultBranch()).get().isEqualTo("main"); + assertThat(selector.newDefaultBranch("master")).get().isEqualTo("main"); } } @@ -1113,4 +1114,10 @@ public class GitMirrorCommandTest extends AbstractGitCommandTestBase { workdirAfterClose = workdir; } } + + @Override + protected String getZippedRepositoryResource() + { + return "sonia/scm/repository/spi/scm-git-spi-mirror-test.zip"; + } } diff --git a/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-mirror-test.zip b/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-mirror-test.zip new file mode 100644 index 0000000000000000000000000000000000000000..ddd9c68a9740266de62f582ff728301bece4da36 GIT binary patch literal 48593 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