From 7c215a0cf95f84c80d2b8691c60b5521ddc2b1ee Mon Sep 17 00:00:00 2001 From: Erik Romson Date: Fri, 16 Nov 2018 13:19:12 +0100 Subject: [PATCH] added a regex-message-filter. It will take a (or more) regex and remove everything in the commit message that doesn't match with the regex --- pom.xml | 16 +++-- .../mavenplugins/gitlog/GenerateMojo.java | 15 ++-- .../gitlog/renderers/JsonRenderer.java | 9 +++ .../gitlog/renderers/PlainTextRenderer.java | 15 +++- .../RegexFilterMessageConverter.java | 69 +++++++++++++++++++ .../mavenplugins/gitlog/GeneratorTest.java | 10 +++ .../RegexFilterMessageConverterTest.java | 46 +++++++++++++ 7 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverter.java create mode 100644 src/test/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverterTest.java diff --git a/pom.xml b/pom.xml index 9cf1501..552944d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,15 +1,15 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 com.github.danielflower.mavenplugins gitlog-maven-plugin - 1.13-SNAPSHOT + 1.13-SNAPSHOT maven-plugin Maven Git Log Plugin Generates a changelog based on commits to a git repository in text and HTML format showing the changes - that are included in each version. A possible use of this is to include these changelogs when packaging your - maven project so that you have an accurate list of commits that the current package includes. + that are included in each version. A possible use of this is to include these changelogs when packaging your + maven project so that you have an accurate list of commits that the current package includes. http://github.com/danielflower/maven-gitlog-plugin 2011 @@ -187,6 +187,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/src/main/java/com/github/danielflower/mavenplugins/gitlog/GenerateMojo.java b/src/main/java/com/github/danielflower/mavenplugins/gitlog/GenerateMojo.java index a1a8dff..cd20d3e 100644 --- a/src/main/java/com/github/danielflower/mavenplugins/gitlog/GenerateMojo.java +++ b/src/main/java/com/github/danielflower/mavenplugins/gitlog/GenerateMojo.java @@ -285,7 +285,11 @@ public class GenerateMojo extends AbstractMojo { @Parameter(defaultValue = "Merge") private String asciidocTableViewHeader2ReleaseNotes; - @Override + + @Parameter(defaultValue = "") + private String messageRegexFilter; + + @Override public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Generating gitlog in " + outputDirectory.getAbsolutePath() + " with title " + reportTitle); @@ -354,14 +358,14 @@ public void execute() throws MojoExecutionException, MojoFailureException { private List createRenderers() throws IOException { ArrayList renderers = new ArrayList(); + MessageConverter messageConverter = getCommitMessageConverter(); if (generatePlainTextChangeLog) { - renderers.add(new PlainTextRenderer(getLog(), outputDirectory, plainTextChangeLogFilename, fullGitMessage)); + renderers.add(new PlainTextRenderer(getLog(), outputDirectory, plainTextChangeLogFilename, fullGitMessage, messageConverter)); } if (generateSimpleHTMLChangeLog || generateHTMLTableOnlyChangeLog || generateMarkdownChangeLog || generateAsciidocChangeLog || generatAsciidocChangeLog || generateAsciidocReleaseNotes || generatAsciidocReleaseNotes) { - MessageConverter messageConverter = getCommitMessageConverter(); if (generateSimpleHTMLChangeLog) { renderers.add(new SimpleHtmlRenderer(getLog(), outputDirectory, simpleHTMLChangeLogFilename, fullGitMessage, messageConverter, false)); } @@ -380,7 +384,7 @@ private List createRenderers() throws IOException { } if (generateJSONChangeLog) { - renderers.add(new JsonRenderer(getLog(), outputDirectory, jsonChangeLogFilename, fullGitMessage)); + renderers.add(new JsonRenderer(getLog(), outputDirectory, jsonChangeLogFilename, fullGitMessage, messageConverter)); } if (verbose) { @@ -408,6 +412,9 @@ private MessageConverter getCommitMessageConverter() { } catch (Exception ex) { getLog().warn("Could not load issue management system information; no HTML links will be generated.", ex); } + if (messageRegexFilter!=null && !messageRegexFilter.isEmpty()){ + converter=new RegexFilterMessageConverter(messageRegexFilter,converter); + } if (converter == null) { converter = new NullMessageConverter(); } diff --git a/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/JsonRenderer.java b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/JsonRenderer.java index bedc644..438d6dd 100644 --- a/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/JsonRenderer.java +++ b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/JsonRenderer.java @@ -12,6 +12,7 @@ public class JsonRenderer extends FileRenderer { + private MessageConverter messageConverter; private String template; protected StringBuilder json = new StringBuilder(); private final boolean fullGitMessage; @@ -26,6 +27,11 @@ public JsonRenderer(Log log, File targetFolder, String filename, boolean fullGit this.template = loadResourceToString("/json/JsonItemTemplate.html"); } + public JsonRenderer(Log log, File targetFolder, String filename, boolean fullGitMessage,MessageConverter messageConverter) + throws IOException { + this(log, targetFolder, filename, fullGitMessage); + this.messageConverter = messageConverter; + } @Override public void renderHeader(String reportTitle) throws IOException { json.append("[\n"); @@ -45,6 +51,9 @@ public void renderCommit(RevCommit commit) throws IOException { } else { message = commit.getShortMessage(); } + if (messageConverter!=null){ + message=messageConverter.formatCommitMessage(message); + } StringBuffer tagsJson = new StringBuffer(); boolean firstTag = true; for (RevTag tag : this.tags) { diff --git a/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/PlainTextRenderer.java b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/PlainTextRenderer.java index b114485..8966dad 100644 --- a/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/PlainTextRenderer.java +++ b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/PlainTextRenderer.java @@ -11,7 +11,8 @@ public class PlainTextRenderer extends FileRenderer { - private boolean previousWasTag = false; + private MessageConverter messageConverter; + private boolean previousWasTag = false; private final boolean fullGitMessage; public PlainTextRenderer(Log log, File targetFolder, String filename, boolean fullGitMessage) throws IOException { @@ -19,7 +20,13 @@ public PlainTextRenderer(Log log, File targetFolder, String filename, boolean fu this.fullGitMessage = fullGitMessage; } - public void renderHeader(String reportTitle) throws IOException { + public PlainTextRenderer(Log log, File targetFolder, String filename, boolean fullGitMessage,MessageConverter messageConverter) throws IOException { + this(log, targetFolder, filename, fullGitMessage); + this.messageConverter = messageConverter; + } + + + public void renderHeader(String reportTitle) throws IOException { if (reportTitle != null && reportTitle.length() > 0) { writer.write(reportTitle); writer.write(NEW_LINE); @@ -43,6 +50,10 @@ public void renderCommit(RevCommit commit) throws IOException { } else { message = commit.getShortMessage(); } + if (messageConverter!=null){ + message=messageConverter.formatCommitMessage(message); + } + writer.write(Formatter.formatDateTime(commit.getCommitTime()) + " " + message); writer.write(" " + Formatter.formatCommiter(commit.getCommitterIdent())); writer.write(NEW_LINE); diff --git a/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverter.java b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverter.java new file mode 100644 index 0000000..0b51f1c --- /dev/null +++ b/src/main/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverter.java @@ -0,0 +1,69 @@ +package com.github.danielflower.mavenplugins.gitlog.renderers; + +import java.util.Comparator; +import java.util.List; +import java.util.TreeSet; +import java.util.regex.MatchResult; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + +/** + * message converter that will remove all test except whatever matches the regex + * it can apply multiple regexes (that can overlap) and pull out all matches in order + */ +public class RegexFilterMessageConverter implements MessageConverter { + private final List patterns; + private final MessageConverter converter; + + /** + * + * @param messageRegexFilter a string with regex separated with &&& + * @param converter a converter that will be applied after this + */ + public RegexFilterMessageConverter(String messageRegexFilter, /*nullable*/ MessageConverter converter) { + patterns = Stream.of(messageRegexFilter.split("&&&")) + .filter(re -> re.trim() + .length() > 0) + .map(re -> Pattern.compile(re)) + .collect(Collectors.toList()); + this.converter = converter; + } + + @Override + public String formatCommitMessage(String original) { + + TreeSet> regionsToSave = new TreeSet<>((Comparator>) (o1, o2) -> o1.getLeft() + .compareTo(o2.getLeft())); + + patterns.forEach(pattern -> { + Matcher m = pattern.matcher(original); + while (m.find()) { + if (m.group(1) != null) { + MatchResult matchResult = m.toMatchResult(); + regionsToSave.add(new ImmutablePair<>(matchResult.start(1), matchResult.end(1))); + } + } + }); + + + StringBuffer sb = new StringBuffer(""); + regionsToSave.forEach(pair -> { + sb.append(original, pair.getLeft(), pair.getRight()); + sb.append(" "); + } + ); + + String retStr = sb.toString() + .trim(); + + if (converter!=null){ + retStr=converter.formatCommitMessage(retStr); + } + return retStr; + } +} diff --git a/src/test/java/com/github/danielflower/mavenplugins/gitlog/GeneratorTest.java b/src/test/java/com/github/danielflower/mavenplugins/gitlog/GeneratorTest.java index ae49e07..4bc22d1 100644 --- a/src/test/java/com/github/danielflower/mavenplugins/gitlog/GeneratorTest.java +++ b/src/test/java/com/github/danielflower/mavenplugins/gitlog/GeneratorTest.java @@ -45,6 +45,16 @@ public void writePlainTextLogToFile() throws Exception { generateReport(log, renderer); } + + @Test + public void writePlainTextLogToFileWRegexFilter() throws Exception { + Log log = new SystemStreamLog(); + RegexFilterMessageConverter converter = new RegexFilterMessageConverter("((Merge pull request #)\\d+)&&&((update)\\s+\\w+)",null); + ChangeLogRenderer renderer = new PlainTextRenderer(log, new File(TARGET_DIR), "changelog_w_regexfilter.txt", false,converter); + generateReport(log, renderer); + } + + @Test public void writePlainTextFullLogToFile() throws Exception { Log log = new SystemStreamLog(); diff --git a/src/test/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverterTest.java b/src/test/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverterTest.java new file mode 100644 index 0000000..1d05508 --- /dev/null +++ b/src/test/java/com/github/danielflower/mavenplugins/gitlog/renderers/RegexFilterMessageConverterTest.java @@ -0,0 +1,46 @@ +package com.github.danielflower.mavenplugins.gitlog.renderers; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import org.apache.maven.plugin.logging.SystemStreamLog; +import org.junit.Test; + +public class RegexFilterMessageConverterTest { + + + @Test + public void testEmpty(){ + RegexFilterMessageConverter converter=new RegexFilterMessageConverter("((SOF|SAP)-\\d+)", null); + assertThat(converter.formatCommitMessage("lkjlkj"),equalTo("")); + } + + @Test + public void testReplace1(){ + RegexFilterMessageConverter converter=new RegexFilterMessageConverter("((SOF|SAP)-\\d+)", null); + assertThat(converter.formatCommitMessage("hej hopp SOF-42 ugga bugga "),equalTo("SOF-42")); + } + + @Test + public void testReplace12(){ + RegexFilterMessageConverter converter=new RegexFilterMessageConverter("((SOF|SAP)-\\d+)", null); + assertThat(converter.formatCommitMessage("SAP-42"),equalTo("SAP-42")); + } + + + @Test + public void testReplace2(){ + RegexFilterMessageConverter converter=new RegexFilterMessageConverter("((SOF|SAP)-\\d+)&&&(hejamora)", null); + assertThat(converter.formatCommitMessage("heja SAP-42 mora hejamora"),equalTo("SAP-42 hejamora")); + } + + @Test + public void testReplaceWithConverter(){ + JiraIssueLinkConverter c = new JiraIssueLinkConverter(new SystemStreamLog(), + "https://jira.atlassian.com/browse/CONF/"); + RegexFilterMessageConverter converter=new RegexFilterMessageConverter("((SOF|SAP)-\\d+)&&&(hejamora)", c); + assertThat(converter.formatCommitMessage("heja SAP-42 mora hejamora"),equalTo("SAP-42 hejamora")); + } + + +}