From 587345bde8d4f261d05c36e55c0d982bdca77284 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 4 Jun 2020 11:12:11 +0200 Subject: [PATCH] Check for trailers only after first empty line --- .../ChangesetDescriptionTrailerProvider.java | 49 +++++++++++++------ ...angesetDescriptionTrailerProviderTest.java | 4 +- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java index 6d9c266c9e..3c05901142 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java @@ -56,32 +56,51 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso private final List trailers = new ArrayList<>(); private final StringBuilder newDescription = new StringBuilder(); + boolean foundEmptyLine; + @Override public void process(Changeset changeset) { try (Scanner scanner = new Scanner(changeset.getDescription())) { while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - - Matcher matcher = TRAILER_PATTERN.matcher(line); - if (matcher.matches()) { - String type = matcher.group(1); - String name = matcher.group(2); - String mail = matcher.group(3); - if (SUPPORTED_TRAILER_TYPES.contains(type)) { - createTrailer(type, name, mail); - } else { - appendLine(scanner, line); - } - } else { - appendLine(scanner, line); - } + handleLine(scanner, scanner.nextLine()); } } changeset.addTrailers(trailers); changeset.setDescription(newDescription.toString()); } + public void handleLine(Scanner scanner, String line) { + if (line.isEmpty()) { + handleEmptyLine(scanner, line); + return; + } + + if (foundEmptyLine && checkForTrailer(line)) { + return; + } + appendLine(scanner, line); + } + + public boolean checkForTrailer(String line) { + Matcher matcher = TRAILER_PATTERN.matcher(line); + if (matcher.matches()) { + String type = matcher.group(1); + String name = matcher.group(2); + String mail = matcher.group(3); + if (SUPPORTED_TRAILER_TYPES.contains(type)) { + createTrailer(type, name, mail); + return true; + } + } + return false; + } + + public void handleEmptyLine(Scanner scanner, String line) { + foundEmptyLine = true; + appendLine(scanner, line); + } + public void appendLine(Scanner scanner, String line) { newDescription.append(line); if (scanner.hasNextLine()) { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java index 10af22c4c3..42dbb8478b 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java @@ -89,7 +89,7 @@ class ChangesetDescriptionTrailerProviderTest { @Test void shouldConvertTrailerWithSigner() { Person person = createPerson("Tricia McMillan", "trillian@hitchhiker.org"); - Changeset changeset = createChangeset("zaphod beeblebrox\n\nSigned-off-by: Tricia McMillan "); + Changeset changeset = createChangeset("zaphod beeblebrox\n\n\nSigned-off-by: Tricia McMillan "); changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); Collection trailers = changeset.getTrailers(); @@ -98,7 +98,7 @@ class ChangesetDescriptionTrailerProviderTest { assertThat(trailer.getTrailerType()).isEqualTo("Signed-off-by"); assertThat(trailer.getPerson()).isEqualTo(person); - assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n\n"); } @Test