From 80609aa22d11adfb23dc04b2b02df558af63b52c Mon Sep 17 00:00:00 2001 From: Tomas Bjerre Date: Tue, 9 Feb 2016 20:09:13 +0100 Subject: [PATCH] Added variables: messageTitle, messageBody, messageItems --- CHANGELOG.md | 10 +- README.md | 40 ++++- .../bjurr/gitchangelog/api/model/Commit.java | 22 ++- .../internal/model/Transformer.java | 77 ++++++++- .../bjurr/gitchangelog/api/TemplatesTest.java | 5 + .../internal/model/TransformerTest.java | 156 ++++++++++++++++++ .../assertions/testCommitsVariables.md | 92 +++++++++++ .../templates/testCommitsVariables.mustache | 18 ++ 8 files changed, 403 insertions(+), 17 deletions(-) create mode 100644 src/test/java/se/bjurr/gitchangelog/internal/model/TransformerTest.java create mode 100644 src/test/resources/assertions/testCommitsVariables.md create mode 100644 src/test/resources/templates/testCommitsVariables.mustache diff --git a/CHANGELOG.md b/CHANGELOG.md index 924addbf..7e787009 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,15 @@ Changelog of Git Changelog. ## Next release ### Other changes -[a10bef4d61b05d3](https://github.com/tomasbjerre/git-changelog-lib/commit/a10bef4d61b05d3) Tomas Bjerre *2016-01-31 12:14:45* +[04f9efa398d3834](https://github.com/tomasbjerre/git-changelog-lib/commit/04f9efa398d3834) Tomas Bjerre *2016-02-09 19:09:13* + +Added variables: messageTitle, messageBody, messageItems + +[4e25e7e2cf5d5ec](https://github.com/tomasbjerre/git-changelog-lib/commit/4e25e7e2cf5d5ec) Tomas Bjerre *2016-01-31 21:12:35* + +Maven Central version badge in README.md + +[1e5cb6c76a681aa](https://github.com/tomasbjerre/git-changelog-lib/commit/1e5cb6c76a681aa) Tomas Bjerre *2016-01-31 12:15:00* Better error message when commit not found diff --git a/README.md b/README.md index 636bc03f..04859c9f 100644 --- a/README.md +++ b/README.md @@ -88,23 +88,32 @@ The template is supplied with a datastructure like: * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * tags - name * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * authors - authorName - authrorEmail * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * issues - name - hasIssue @@ -116,24 +125,33 @@ The template is supplied with a datastructure like: * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * authors - authorName - authrorEmail * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * authors - authorName - authrorEmail * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * issues - name - hasIssue @@ -145,16 +163,22 @@ The template is supplied with a datastructure like: * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) * authors - authorName - authrorEmail * commits - authorName - authorEmailAddress - - message - commitTime + - message (The full message) + - messageTitle (Only the first line of the message) + - messageBody (Everything, except the title) + * messageBodyItems (List of strings, the lines after the title) ``` ## MediaWiki diff --git a/src/main/java/se/bjurr/gitchangelog/api/model/Commit.java b/src/main/java/se/bjurr/gitchangelog/api/model/Commit.java index afac236c..f71f4c5e 100644 --- a/src/main/java/se/bjurr/gitchangelog/api/model/Commit.java +++ b/src/main/java/se/bjurr/gitchangelog/api/model/Commit.java @@ -2,28 +2,48 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; + public class Commit { private final String authorName; private final String authorEmailAddress; private final String commitTime; private final Long commitTimeLong; private final String message; + private final String messageTitle; + private final String messageBody; + private final List messageBodyItems; private final String hash; public Commit(String authorName, String authorEmailAddress, String commitTime, Long commitTimeLong, String message, - String hash) { + String hash, String messageTitle, String messageBody, List messageBodyItems) { this.authorName = checkNotNull(authorName, "authorName"); this.authorEmailAddress = checkNotNull(authorEmailAddress, "authorEmailAddress"); this.message = checkNotNull(message, "message").trim(); this.commitTime = checkNotNull(commitTime, "commitTime"); this.commitTimeLong = checkNotNull(commitTimeLong, "commitTimeLong"); this.hash = checkNotNull(hash, "hash"); + this.messageTitle = checkNotNull(messageTitle, "messageTitle"); + this.messageBody = checkNotNull(messageBody, "messageBody"); + this.messageBodyItems = checkNotNull(messageBodyItems, "messageBodyItems"); } public String getHash() { return hash; } + public String getMessageBody() { + return messageBody; + } + + public List getMessageBodyItems() { + return messageBodyItems; + } + + public String getMessageTitle() { + return messageTitle; + } + public String getAuthorEmailAddress() { return authorEmailAddress; } diff --git a/src/main/java/se/bjurr/gitchangelog/internal/model/Transformer.java b/src/main/java/se/bjurr/gitchangelog/internal/model/Transformer.java index 48f40e3f..29891213 100644 --- a/src/main/java/se/bjurr/gitchangelog/internal/model/Transformer.java +++ b/src/main/java/se/bjurr/gitchangelog/internal/model/Transformer.java @@ -1,5 +1,6 @@ package se.bjurr.gitchangelog.internal.model; +import static com.google.common.base.Joiner.on; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; @@ -32,6 +33,7 @@ import se.bjurr.gitchangelog.internal.settings.Settings; import se.bjurr.gitchangelog.internal.settings.SettingsIssue; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Multimap; @@ -175,17 +177,78 @@ private Commit toCommit(GitCommit gitCommit) { gitCommit.getAuthorEmailAddress(), // format(gitCommit.getCommitTime()), // gitCommit.getCommitTime().getTime(), // - toMessage(gitCommit.getMessage()), // - gitCommit.getHash()); + toMessage(settings.removeIssueFromMessage(), new IssuesUtil(settings).getIssues(), gitCommit.getMessage()), // + gitCommit.getHash(),// + toMessageTitle(settings.removeIssueFromMessage(), new IssuesUtil(settings).getIssues(), gitCommit.getMessage()),// + toMessageBody(settings.removeIssueFromMessage(), new IssuesUtil(settings).getIssues(), gitCommit.getMessage()),// + toMessageItems(settings.removeIssueFromMessage(), new IssuesUtil(settings).getIssues(), gitCommit.getMessage())); } - private String toMessage(String message) { - if (settings.removeIssueFromMessage()) { - for (SettingsIssue issue : new IssuesUtil(settings).getIssues()) { - message = message.replaceAll(issue.getPattern(), ""); + @VisibleForTesting + List toMessageItems(Boolean removeIssueFromMessage, List issues, String message) { + List toReturn = newArrayList(); + List stringList = toNoEmptyStringsList(removeIssuesFromString(removeIssueFromMessage, issues, message)); + if (stringList.size() > 1) { + List notFirst = notFirst(stringList); + for (String part : notFirst) { + String candidate = part.trim(); + if (candidate.startsWith("*")) { + candidate = candidate.substring(1).trim(); + } + if (!candidate.isEmpty()) { + toReturn.add(candidate); + } } } - return message; + return toReturn; + } + + @VisibleForTesting + String toMessageBody(Boolean removeIssueFromMessage, List issues, String message) { + List stringList = toNoEmptyStringsList(removeIssuesFromString(removeIssueFromMessage, issues, message)); + if (stringList.size() > 1) { + List notFirst = notFirst(stringList); + return on("\n")// + .join(notFirst); + } + return ""; + } + + @VisibleForTesting + String toMessageTitle(Boolean removeIssueFromMessage, List issues, String message) { + List stringList = toNoEmptyStringsList(removeIssuesFromString(removeIssueFromMessage, issues, message)); + if (stringList.size() > 0) { + return stringList.get(0); + } + return ""; + } + + @VisibleForTesting + String toMessage(boolean removeIssueFromMessage, List issues, String message) { + return removeIssuesFromString(removeIssueFromMessage, issues, message); + } + + private List notFirst(List stringList) { + return stringList.subList(1, stringList.size()); + } + + private List toNoEmptyStringsList(String message) { + List toReturn = newArrayList(); + for (String part : message.split("\n")) { + if (!part.isEmpty()) { + toReturn.add(part); + } + } + return toReturn; + } + + private String removeIssuesFromString(boolean removeIssueFromMessage, List issues, String string) { + if (removeIssueFromMessage) { + for (SettingsIssue issue : issues) { + string = string.replaceAll(issue.getPattern(), ""); + } + } + return string; } private String format(Date commitTime) { diff --git a/src/test/java/se/bjurr/gitchangelog/api/TemplatesTest.java b/src/test/java/se/bjurr/gitchangelog/api/TemplatesTest.java index d709a8c1..100aba36 100644 --- a/src/test/java/se/bjurr/gitchangelog/api/TemplatesTest.java +++ b/src/test/java/se/bjurr/gitchangelog/api/TemplatesTest.java @@ -35,6 +35,11 @@ public void testCommits() throws Exception { test("testCommits"); } + @Test + public void testCommitsVariables() throws Exception { + test("testCommitsVariables"); + } + @Test public void testIssuesCommits() throws Exception { test("testIssuesCommits"); diff --git a/src/test/java/se/bjurr/gitchangelog/internal/model/TransformerTest.java b/src/test/java/se/bjurr/gitchangelog/internal/model/TransformerTest.java new file mode 100644 index 00000000..2dd507f6 --- /dev/null +++ b/src/test/java/se/bjurr/gitchangelog/internal/model/TransformerTest.java @@ -0,0 +1,156 @@ +package se.bjurr.gitchangelog.internal.model; + +import static com.google.common.collect.Lists.newArrayList; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import se.bjurr.gitchangelog.internal.settings.Settings; +import se.bjurr.gitchangelog.internal.settings.SettingsIssue; + +public class TransformerTest { + + private List noIssues; + private List oneIssue; + private Transformer transformer; + private final String message = "INC123 message title\n\n * INC456 The first item\n * The second item"; + private final String messageOnlyOneLineAfterTitle = "INC123 message title\n * The first item\n * INC456 The second item"; + private final String messageOnlyOneLineAfterTitleAndOneEmptyLine = "INC123 message title\n * INC456 The first item\n\n * The second item"; + private final String messageOnlyOneLineAfterTitleAndNoStars = "INC123 message title\nThe first item\nINC456 The second item"; + private final String messageOnlyIncidentInItem = "INC123 message title\n * INC123 \nINC456\n * This is ok"; + + @Before + public void before() { + noIssues = newArrayList(); + SettingsIssue issue1 = new SettingsIssue("Issue Name", "INC[0-9]*", "http://inc/${PATTERN_GROUP}"); + oneIssue = newArrayList(issue1); + transformer = new Transformer(new Settings()); + } + + @Test + public void testThatMessageCanBeTransformedWithIssues() { + assertThat(transformer.toMessage(false, oneIssue, message))// + .isEqualTo(message); + assertThat(transformer.toMessage(false, noIssues, message))// + .isEqualTo(message); + } + + @Test + public void testThatMessageCanBeTransformedWithoutIssues() { + assertThat(transformer.toMessage(true, oneIssue, message))// + .isEqualTo(" message title\n\n * The first item\n * The second item"); + assertThat(transformer.toMessage(true, noIssues, message))// + .isEqualTo(message); + } + + @Test + public void testThatMessageTitleCanBeTransformedWithIssues() { + assertThat(transformer.toMessageTitle(false, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(false, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(false, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("INC123 message title"); + + assertThat(transformer.toMessageTitle(false, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(false, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(false, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("INC123 message title"); + } + + @Test + public void testThatMessageTitleCanBeTransformedWithoutIssues() { + assertThat(transformer.toMessageTitle(true, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo(" message title"); + assertThat(transformer.toMessageTitle(true, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(" message title"); + assertThat(transformer.toMessageTitle(true, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo(" message title"); + + assertThat(transformer.toMessageTitle(true, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(true, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo("INC123 message title"); + assertThat(transformer.toMessageTitle(true, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("INC123 message title"); + } + + @Test + public void testThatMessageBodyCanBeTransformedWithIssues() { + assertThat(transformer.toMessageBody(false, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo(" * The first item\n * INC456 The second item"); + assertThat(transformer.toMessageBody(false, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(" * INC456 The first item\n * The second item"); + assertThat(transformer.toMessageBody(false, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("The first item\nINC456 The second item"); + + assertThat(transformer.toMessageBody(false, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo(" * The first item\n * INC456 The second item"); + assertThat(transformer.toMessageBody(false, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(" * INC456 The first item\n * The second item"); + assertThat(transformer.toMessageBody(false, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("The first item\nINC456 The second item"); + } + + @Test + public void testThatMessageBodyCanBeTransformedWithoutIssues() { + assertThat(transformer.toMessageBody(true, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo(" * The first item\n * The second item"); + assertThat(transformer.toMessageBody(true, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(" * The first item\n * The second item"); + assertThat(transformer.toMessageBody(true, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("The first item\n The second item"); + + assertThat(transformer.toMessageBody(true, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo(" * The first item\n * INC456 The second item"); + assertThat(transformer.toMessageBody(true, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(" * INC456 The first item\n * The second item"); + assertThat(transformer.toMessageBody(true, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo("The first item\nINC456 The second item"); + } + + @Test + public void testThatMessageItemsCanBeTransformedWithIssues() { + assertThat(transformer.toMessageItems(false, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + assertThat(transformer.toMessageItems(false, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(newArrayList("INC456 The first item", "The second item")); + assertThat(transformer.toMessageItems(false, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + + assertThat(transformer.toMessageItems(false, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + assertThat(transformer.toMessageItems(false, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(newArrayList("INC456 The first item", "The second item")); + assertThat(transformer.toMessageItems(false, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + } + + @Test + public void testThatMessageItemsCanBeTransformedWithoutIssues() { + assertThat(transformer.toMessageItems(true, oneIssue, messageOnlyOneLineAfterTitle))// + .isEqualTo(newArrayList("The first item", "The second item")); + assertThat(transformer.toMessageItems(true, oneIssue, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(newArrayList("The first item", "The second item")); + assertThat(transformer.toMessageItems(true, oneIssue, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo(newArrayList("The first item", "The second item")); + + assertThat(transformer.toMessageItems(true, oneIssue, messageOnlyIncidentInItem))// + .isEqualTo(newArrayList("This is ok")); + + assertThat(transformer.toMessageItems(true, noIssues, messageOnlyOneLineAfterTitle))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + assertThat(transformer.toMessageItems(true, noIssues, messageOnlyOneLineAfterTitleAndOneEmptyLine))// + .isEqualTo(newArrayList("INC456 The first item", "The second item")); + assertThat(transformer.toMessageItems(true, noIssues, messageOnlyOneLineAfterTitleAndNoStars))// + .isEqualTo(newArrayList("The first item", "INC456 The second item")); + + assertThat(transformer.toMessageItems(true, noIssues, messageOnlyIncidentInItem))// + .isEqualTo(newArrayList("INC123", "INC456", "This is ok")); + } +} diff --git a/src/test/resources/assertions/testCommitsVariables.md b/src/test/resources/assertions/testCommitsVariables.md new file mode 100644 index 00000000..7343afdb --- /dev/null +++ b/src/test/resources/assertions/testCommitsVariables.md @@ -0,0 +1,92 @@ +# Git Changelog changelog + +Changelog of Git Changelog. + +## Commit eb408ddc4fa484e6befdf5954e56a2198c7a9fab + Message: More stuff tagged with bug + + Message Title: More stuff tagged with bug + + Message Body: + + +## Commit 9db063f3b5e0adfd0d29a03db0a1c207b3740a94 + Message: Adding stuff with a jira + + Message Title: Adding stuff with a jira + + Message Body: + + +## Commit a454ca483b4a66b83826d061be2859dd79ff0d6c + Message: Adding stuff with gh again + + Message Title: Adding stuff + + Message Body: with gh again + + Item: with gh again + + +## Commit 2f086fc767a0dac59a38c67f409b4f74a1eab39f + Message: Adding cq stuff with CQ + + Message Title: Adding cq stuff with CQ + + Message Body: + + +## Commit 8098e7dfb09adba3bf783794ba0db81985a814d7 + Message: This is 1.0 tagged commit + + Message Title: This is 1.0 tagged commit + + Message Body: + + +## Commit ddaf0ed54dfc227ce677b5c2b44e3edee7c7db77 + Message: Adding stuff gh 12 + + Message Title: Adding stuff gh 12 + + Message Body: + + +## Commit d6459ab29c7b9a9fbf0c7c15fa35faa30fbf8cc6 + Message: Adding stuff, no issue + + Message Title: Adding stuff, no issue + + Message Body: + + +## Commit 8e146c3c4e33449f95a49679795f74f7ae19ecc1 + Message: Adding stuff with a jira + + Message Title: Adding stuff with a jira + + Message Body: + + +## Commit 0aaf76f425c6e0f43a36197de768e67d9e035abb + Message: Adding stuff with gh 20 + + Message Title: Adding stuff with gh 20 + + Message Body: + + +## Commit 3c585604e87f855973731fea83e21fab9392d2fc + Message: Adding stuff without issue + + Message Title: Adding stuff without issue + + Message Body: + + +## Commit 0000000000000000000000000000000000000000 + Message: First commit! + + Message Title: First commit! + + Message Body: \ No newline at end of file diff --git a/src/test/resources/templates/testCommitsVariables.mustache b/src/test/resources/templates/testCommitsVariables.mustache new file mode 100644 index 00000000..ce12f704 --- /dev/null +++ b/src/test/resources/templates/testCommitsVariables.mustache @@ -0,0 +1,18 @@ +# Git Changelog changelog + +Changelog of Git Changelog. + +{{#commits}} +## Commit {{hash}} + Message: {{message}} + + Message Title: {{messageTitle}} + + Message Body: {{messageBody}} + +{{#messageBodyItems}} + Item: {{.}} + +{{/messageBodyItems}} + +{{/commits}}