From a19840ad2133e40ebf6a6f45633467919ecf07a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 9 Jun 2020 07:54:55 +0200 Subject: [PATCH] Fix processing multiple changesets One processor can be used to process multiple chagesets of one repository. Therefore each processing needs a new clean working environment. --- .../ChangesetDescriptionTrailerProvider.java | 25 +++++++++++-------- ...angesetDescriptionTrailerProviderTest.java | 24 +++++++++++++++--- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/repository/ChangesetDescriptionTrailerProvider.java b/scm-webapp/src/main/java/sonia/scm/repository/ChangesetDescriptionTrailerProvider.java index 90ed6c5868..5a5283ccfd 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/ChangesetDescriptionTrailerProvider.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/ChangesetDescriptionTrailerProvider.java @@ -27,9 +27,7 @@ package sonia.scm.repository; import com.google.common.collect.ImmutableSet; import sonia.scm.plugin.Extension; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -46,16 +44,23 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso } private static class TrailerChangesetPreProcessor implements ChangesetPreProcessor { + @Override + public void process(Changeset changeset) { + new Worker(changeset).process(); + } + } + private static class Worker { private final StringBuilder newDescription = new StringBuilder(); - private Changeset changeset; + private final Changeset changeset; boolean foundEmptyLine; - @Override - public void process(Changeset changeset) { + private Worker(Changeset changeset) { this.changeset = changeset; + } + private void process() { try (Scanner scanner = new Scanner(changeset.getDescription())) { while (scanner.hasNextLine()) { handleLine(scanner, scanner.nextLine()); @@ -64,7 +69,7 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso changeset.setDescription(newDescription.toString()); } - public void handleLine(Scanner scanner, String line) { + private void handleLine(Scanner scanner, String line) { if (line.trim().isEmpty()) { handleEmptyLine(scanner, line); return; @@ -76,7 +81,7 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso appendLine(scanner, line); } - public boolean checkForTrailer(String line) { + private boolean checkForTrailer(String line) { Matcher matcher = TRAILER_PATTERN.matcher(line); if (matcher.matches()) { String type = matcher.group(1); @@ -90,12 +95,12 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso return false; } - public void handleEmptyLine(Scanner scanner, String line) { + private void handleEmptyLine(Scanner scanner, String line) { foundEmptyLine = true; appendLine(scanner, line); } - public void appendLine(Scanner scanner, String line) { + private void appendLine(Scanner scanner, String line) { newDescription.append(line); if (scanner.hasNextLine()) { newDescription.append('\n'); @@ -103,7 +108,7 @@ public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcesso } private void createTrailer(String type, String name, String mail) { - changeset.addTrailer(new Trailer(type, new Person(name, mail))); + changeset.addTrailer(new Trailer(type, new Person(name, mail))); } } } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/ChangesetDescriptionTrailerProviderTest.java b/scm-webapp/src/test/java/sonia/scm/repository/ChangesetDescriptionTrailerProviderTest.java index 5c5cd716f3..dd43926565 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/ChangesetDescriptionTrailerProviderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/ChangesetDescriptionTrailerProviderTest.java @@ -47,8 +47,7 @@ class ChangesetDescriptionTrailerProviderTest { changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); Collection trailers = changeset.getTrailers(); - assertThat(trailers).isNotNull(); - assertThat(trailers).isEmpty(); + assertThat(trailers).isNullOrEmpty(); assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox"); } @@ -144,7 +143,7 @@ class ChangesetDescriptionTrailerProviderTest { changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); Collection trailers = changeset.getTrailers(); - assertThat(trailers).isEmpty(); + assertThat(trailers).isNullOrEmpty(); assertThat(changeset.getDescription()).isEqualTo(originalCommitMessage); } @@ -157,7 +156,7 @@ class ChangesetDescriptionTrailerProviderTest { changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); Collection trailers = changeset.getTrailers(); - assertThat(trailers).isEmpty(); + assertThat(trailers).isNullOrEmpty(); assertThat(changeset.getDescription()).isEqualTo(originalCommitMessage); } @@ -173,6 +172,23 @@ class ChangesetDescriptionTrailerProviderTest { assertThat(trailers).isNotEmpty(); } + @Test + void shouldProcessChangesetsSeparately() { + Changeset changeset1 = createChangeset("message one\n\n" + + "Committed-by: Tricia McMillan "); + Changeset changeset2 = createChangeset("message two"); + + ChangesetPreProcessor preProcessor = changesetDescriptionTrailers.createPreProcessor(REPOSITORY); + preProcessor.process(changeset1); + preProcessor.process(changeset2); + + assertThat(changeset1.getDescription()).isEqualTo("message one\n\n"); + assertThat(changeset1.getTrailers()).isNotEmpty(); + + assertThat(changeset2.getDescription()).isEqualTo("message two"); + assertThat(changeset2.getTrailers()).isNullOrEmpty(); + } + private Changeset createChangeset(String commitMessage) { Changeset changeset = new Changeset(); changeset.setDescription(commitMessage);