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.
This commit is contained in:
René Pfeuffer
2020-06-09 07:54:55 +02:00
parent 69361fb5ed
commit a19840ad21
2 changed files with 35 additions and 14 deletions

View File

@@ -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)));
}
}
}

View File

@@ -47,8 +47,7 @@ class ChangesetDescriptionTrailerProviderTest {
changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset);
Collection<Trailer> 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<Trailer> 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<Trailer> 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 <trillian@hitchhiker.org>");
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);