Add keyed properties for issue occurrences in footer lines For for example a footer like: Related-To-Bug: bug#42 Fixes-Bug: bug#4711 would now also add occurrences "footer-Related-To-Bug" for issue 42, and "footer-Fixes-Bug" for issue 4711. Thereby, we allow to formulate rules that fire depending on where an issue has been mentioned in the footer. Change-Id: I37a0b3bcd555d3cc7a34c0143e6229a0d86ad540
diff --git a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractor.java b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractor.java index 57f51da..ea8a788 100644 --- a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractor.java +++ b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractor.java
@@ -152,6 +152,25 @@ } } else { body = StringUtils.join(lines, "\n", 1, footerStart - 1); + + StringBuilder footerBuilder = new StringBuilder(); + for (int lineIdx = footerStart; lineIdx < footerEnd; lineIdx++) { + String line = lines[lineIdx]; + + // Adding occurrences for footer keys + int colonIdx = line.indexOf(':'); + if (colonIdx > 0) { + // tag of length at least 1 + String tag = line.substring(0, colonIdx); + addIssuesOccurrence(line, "footer-" + tag, ret); + } + + // Putting back together the footer to a single String + if (lineIdx > footerStart) { + footerBuilder.append('\n'); + } + footerBuilder.append(line); + } footer = StringUtils.join(lines, "\n", footerStart, footerEnd); } if (body != null) {
diff --git a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java index 53d69db..5d18b0c 100644 --- a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java +++ b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java
@@ -212,6 +212,7 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitMultipleIssues() { @@ -239,6 +240,7 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitMultipleIssuesMultipleTimes() { @@ -266,6 +268,7 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitSingleIssueBody() { @@ -294,6 +297,8 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitSingleIssueFooter() { @@ -315,13 +320,56 @@ "1234567891123456789212345678931234567894"); Map<String,Set<String>> expected = Maps.newHashMap(); - expected.put("42", Sets.newHashSet("somewhere", "footer")); + expected.put("42", Sets.newHashSet("somewhere", "footer", + "footer-Footer")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + } + + public void testIssueIdsCommitMultipleIssuesFooter() { + expect(serverConfig.getString("commentLink", "ItsTestName", "match")) + .andReturn("bug#(\\d+)").atLeastOnce(); + + expect(commitMessageFetcher.fetchGuarded("testProject", + "1234567891123456789212345678931234567894")).andReturn( + "Subject does not reference a bug\n" + + "Body does not reference a bug\n" + + "\n" + + "KeyA: references bug#42\n" + + "KeyB: does not reference bug\n" + + "KeyC: references bug#176\n" + + "Unkeyed reference to bug#4711\n" + + "Change-Id: I1234567891123456789212345678931234567894\n" + + "KeyZ: references bug#256" ); + + replayMocks(); + + IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class); + Map<String,Set<String>> actual = issueExtractor.getIssueIds("testProject", + "1234567891123456789212345678931234567894"); + + Map<String,Set<String>> expected = Maps.newHashMap(); + expected.put("42", Sets.newHashSet("somewhere", "footer", "footer-KeyA")); + expected.put("176", Sets.newHashSet("somewhere", "footer", "footer-KeyC")); + expected.put("256", Sets.newHashSet("somewhere", "footer", "footer-KeyZ")); + expected.put("4711", Sets.newHashSet("somewhere", "footer")); + assertEquals("Extracted issues do not match", expected, actual); + + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitDifferentParts() { @@ -347,13 +395,15 @@ expected.put("16", Sets.newHashSet("somewhere", "body")); expected.put("42", Sets.newHashSet("somewhere", "subject")); expected.put("176", Sets.newHashSet("somewhere", "body")); - expected.put("4711", Sets.newHashSet("somewhere", "footer")); + expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitDifferentPartsEmptySubject() { @@ -378,13 +428,15 @@ Map<String,Set<String>> expected = Maps.newHashMap(); expected.put("16", Sets.newHashSet("somewhere", "body")); expected.put("176", Sets.newHashSet("somewhere", "body")); - expected.put("4711", Sets.newHashSet("somewhere", "footer")); + expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitDifferentPartsLinePastFooter() { @@ -410,13 +462,15 @@ expected.put("16", Sets.newHashSet("somewhere", "body")); expected.put("42", Sets.newHashSet("somewhere", "subject")); expected.put("176", Sets.newHashSet("somewhere", "body")); - expected.put("4711", Sets.newHashSet("somewhere", "footer")); + expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitDifferentPartsLinesPastFooter() { @@ -443,13 +497,15 @@ expected.put("16", Sets.newHashSet("somewhere", "body")); expected.put("42", Sets.newHashSet("somewhere", "subject")); expected.put("176", Sets.newHashSet("somewhere", "body")); - expected.put("4711", Sets.newHashSet("somewhere", "footer")); + expected.put("4711", Sets.newHashSet("somewhere", "footer", "footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitDifferentPartsNoFooter() { @@ -636,17 +692,20 @@ Map<String,Set<String>> expected = Maps.newHashMap(); expected.put("16", Sets.newHashSet("somewhere", "subject", "body")); expected.put("42", Sets.newHashSet("somewhere", "subject")); - expected.put("176", Sets.newHashSet("somewhere", "footer")); + expected.put("176", Sets.newHashSet("somewhere", "footer", "footer-Bug")); expected.put("1984", Sets.newHashSet("somewhere", "subject", "body", - "footer")); + "footer", "footer-Bug")); expected.put("4711", Sets.newHashSet("somewhere", "body")); - expected.put("5150", Sets.newHashSet("somewhere", "body", "footer")); + expected.put("5150", Sets.newHashSet("somewhere", "body", "footer", + "footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedEmptyFirst() { @@ -703,6 +762,7 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedSingleSubjectIssueSecondEmpty() @@ -763,6 +823,8 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedSingleSubjectIssueSecondSame() @@ -822,6 +884,8 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedSingleSubjectIssueSecondBody() @@ -882,6 +946,8 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedSingleSubjectIssueSecondFooter() @@ -931,7 +997,8 @@ "1234567891123456789212345678931234567894", currentPatchSetId); Map<String,Set<String>> expected = Maps.newHashMap(); - expected.put("42", Sets.newHashSet("somewhere", "footer", "added@footer")); + expected.put("42", Sets.newHashSet("somewhere", "footer", "added@footer", + "footer-Bug", "added@footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); @@ -942,6 +1009,9 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedSubjectFooter() @@ -995,7 +1065,8 @@ Map<String,Set<String>> expected = Maps.newHashMap(); expected.put("42", Sets.newHashSet("somewhere", "subject", "added@subject", - "body", "footer", "added@footer")); + "body", "footer", "added@footer", "footer-Bug", + "added@footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); @@ -1006,6 +1077,9 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } public void testIssueIdsCommitWAddedMultiple() @@ -1061,7 +1135,8 @@ Map<String,Set<String>> expected = Maps.newHashMap(); expected.put("16", Sets.newHashSet("somewhere", "body", "added@body")); expected.put("42", Sets.newHashSet("somewhere", "subject", "added@subject", - "body", "footer", "added@footer")); + "body", "footer", "added@footer", "footer-Bug", + "added@footer-Bug")); assertEquals("Extracted issues do not match", expected, actual); assertLogMessageContains("Matching"); @@ -1072,6 +1147,10 @@ assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); + assertLogMessageContains("Matching"); } @Override