From 33037385e4a5fc33ad43074f7ea303acbfbdf60d Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 27 Feb 2020 09:56:25 +0100 Subject: [PATCH] Handle unexpected merge results It is possible that a git work tree is dirty directly after the clone of a repository, eg. when files are not changed correctly due to bogous .gitattribute files (though this is just a guess). In these cases a merge might fail due to these dirty files and not due to merge conflicts. Without this change such results lead to null pointer exceptions, because result.getConflicts() is null. --- .../scm/repository/spi/GitMergeStrategy.java | 9 +++- .../spi/UnexpectedMergeResultException.java | 27 ++++++++++ .../spi/AbstractGitCommandTestBase.java | 1 - .../repository/spi/GitMergeCommandTest.java | 49 ++++++++++++++++++- .../main/resources/locales/de/plugins.json | 4 ++ .../main/resources/locales/en/plugins.json | 4 ++ 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/UnexpectedMergeResultException.java diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeStrategy.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeStrategy.java index 8e9f79d1b9..4b8280c669 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeStrategy.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeStrategy.java @@ -88,7 +88,14 @@ abstract class GitMergeStrategy extends AbstractGitCommand.GitCloneWorker { + FileWriter fw = null; + try { + fw = new FileWriter(new File(git.getRepository().getWorkTree(), "b.txt"), true); + BufferedWriter bw = new BufferedWriter(fw); + bw.write("change"); + bw.newLine(); + bw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + MergeCommandRequest request = new MergeCommandRequest(); + request.setBranchToMerge("mergeable"); + request.setTargetBranch("master"); + request.setMergeStrategy(MergeStrategy.MERGE_COMMIT); + request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det")); + request.setMessageTemplate("simple"); + + Assertions.assertThrows(UnexpectedMergeResultException.class, () -> command.merge(request)); + } + @Test public void shouldTakeAuthorFromSubjectIfNotSet() throws IOException, GitAPIException { SimplePrincipalCollection principals = new SimplePrincipalCollection(); principals.add("admin", REALM); - principals.add( new User("dirk", "Dirk Gently", "dirk@holistic.det"), REALM); + principals.add(new User("dirk", "Dirk Gently", "dirk@holistic.det"), REALM); shiro.setSubject( new Subject.Builder() .principals(principals) @@ -364,6 +395,20 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { } private GitMergeCommand createCommand() { - return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory(new WorkdirProvider())); + return createCommand(git -> { + }); + } + + private GitMergeCommand createCommand(Consumer interceptor) { + return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory(new WorkdirProvider())) { + @Override + > R inClone(Function workerSupplier, GitWorkdirFactory workdirFactory, String initialBranch) { + Function interceptedWorkerSupplier = git -> { + interceptor.accept(git); + return workerSupplier.apply(git); + }; + return super.inClone(interceptedWorkerSupplier, workdirFactory, initialBranch); + } + }; } } diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index 95179a94e2..809da9d0df 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -199,6 +199,10 @@ "8LRncum0S1": { "displayName": "Interner Fehler im Repository", "description": "Bei der Bearbeitung des internen Repositories ist ein Fehler oder ein unerwarteter Zustand aufgetreten. Bitte prüfen Sie die Logs für weitere Informationen." + }, + "4GRrgkSC01": { + "displayName": "Unerwartetes Merge-Ergebnis", + "description": "Der Merge hatte ein unerwartetes Ergebis, das nicht automatisiert behandelt werden konnte. Nähere Details sind im Log zu finden. Führen Sie den Merge ggf. manuell durch." } }, "namespaceStrategies": { diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index 2353184ada..69e8d057ee 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -199,6 +199,10 @@ "8LRncum0S1": { "displayName": "Internal repository error", "description": "There was an error or an unexpected condition while handling the native repository. Please consult the logs for further information." + }, + "4GRrgkSC01": { + "displayName": "Unexpected merge result", + "description": "The merge led to an unexpected result, that could not be handled automatically. More details could be found in the log. Please merge the branches manually." } }, "namespaceStrategies": {