Browse Source

Merge branch 'fixMentionsInTickets-985'

tags/r1.9.0
Florian Zschocke 7 years ago
parent
commit
9a51d2bf8e

+ 6
- 0
src/main/java/com/gitblit/Constants.java View File

@@ -62,6 +62,12 @@ public class Constants {
public static final String GIT_PATH = "/git/";
public static final String REGEX_SHA256 = "[a-fA-F0-9]{64}";
/**
* This regular expression is used when searching for "mentions" in tickets
* (when someone writes @thisOtherUser)
*/
public static final String REGEX_TICKET_MENTION = "\\B@(?<user>[^\\s]+)\\b";
public static final String ZIP_PATH = "/zip/";

+ 4
- 2
src/main/java/com/gitblit/models/TicketModel.java View File

@@ -43,6 +43,8 @@ import java.util.regex.Pattern;

import org.eclipse.jgit.util.RelativeDateFormatter;

import com.gitblit.Constants;

/**
* The Gitblit Ticket model, its component classes, and enums.
*
@@ -773,10 +775,10 @@ public class TicketModel implements Serializable, Comparable<TicketModel> {
}
try {
Pattern mentions = Pattern.compile("\\s@([A-Za-z0-9-_]+)");
Pattern mentions = Pattern.compile(Constants.REGEX_TICKET_MENTION);
Matcher m = mentions.matcher(text);
while (m.find()) {
String username = m.group(1);
String username = m.group("user");
plusList(Field.mentions, username);
}
} catch (Exception e) {

+ 2
- 2
src/main/java/com/gitblit/tickets/TicketNotifier.java View File

@@ -573,10 +573,10 @@ public class TicketNotifier {
// cc users mentioned in last comment
Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
if (lastChange.hasComment()) {
Pattern p = Pattern.compile("\\s@([A-Za-z0-9-_]+)");
Pattern p = Pattern.compile(Constants.REGEX_TICKET_MENTION);
Matcher m = p.matcher(lastChange.comment.text);
while (m.find()) {
String username = m.group();
String username = m.group("user");
ccs.add(username);
}
}

+ 3
- 2
src/main/java/com/gitblit/utils/MarkdownUtils.java View File

@@ -30,6 +30,7 @@ import org.pegdown.ParsingTimeoutException;
import org.pegdown.PegDownProcessor;
import org.pegdown.ast.RootNode;
import com.gitblit.Constants;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.wicket.MarkupProcessor.WorkaroundHtmlSerializer;
@@ -137,8 +138,8 @@ public class MarkdownUtils {
String canonicalUrl = settings.getString(Keys.web.canonicalUrl, "https://localhost:8443");
// emphasize and link mentions
String mentionReplacement = String.format(" **[@$1](%1s/user/$1)**", canonicalUrl);
text = text.replaceAll("\\s@([A-Za-z0-9-_]+)", mentionReplacement);
String mentionReplacement = String.format("**[@${user}](%1s/user/${user})**", canonicalUrl);
text = text.replaceAll(Constants.REGEX_TICKET_MENTION, mentionReplacement);
// link ticket refs
String ticketReplacement = MessageFormat.format("$1[#$2]({0}/tickets?r={1}&h=$2)$3", canonicalUrl, repositoryName);

+ 73
- 1
src/test/java/com/gitblit/tests/MarkdownUtilsTest.java View File

@@ -15,8 +15,14 @@
*/
package com.gitblit.tests;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.tests.mock.MemorySettings;
import com.gitblit.utils.MarkdownUtils;
public class MarkdownUtilsTest extends GitblitUnitTest {
@@ -39,4 +45,70 @@ public class MarkdownUtilsTest extends GitblitUnitTest {
assertEquals("<table><tr><td>&lt;test&gt;</td></tr></table>",
MarkdownUtils.transformMarkdown("<table><tr><td>&lt;test&gt;</td></tr></table>"));
}
}
@Test
public void testUserMentions() {
IStoredSettings settings = getSettings();
String repositoryName = "test3";
String mentionHtml = "<strong><a href=\"http://localhost/user/%1$s\">@%1$s</a></strong>";
String input = "@j.doe";
String output = "<p>" + String.format(mentionHtml, "j.doe") + "</p>";
assertEquals(output, MarkdownUtils.transformGFM(settings, input, repositoryName));
input = " @j.doe";
output = "<p>" + String.format(mentionHtml, "j.doe") + "</p>";
assertEquals(output, MarkdownUtils.transformGFM(settings, input, repositoryName));
input = "@j.doe.";
output = "<p>" + String.format(mentionHtml, "j.doe") + ".</p>";
assertEquals(output, MarkdownUtils.transformGFM(settings, input, repositoryName));
input = "To @j.doe: ask @jim.beam!";
output = "<p>To " + String.format(mentionHtml, "j.doe")
+ ": ask " + String.format(mentionHtml, "jim.beam") + "!</p>";
assertEquals(output, MarkdownUtils.transformGFM(settings, input, repositoryName));
input = "@sta.rt\n"
+ "\n"
+ "User mentions in tickets are broken.\n"
+ "So:\n"
+ "@mc_guyver can fix this.\n"
+ "@j.doe, can you test after the fix by @m+guyver?\n"
+ "Please review this, @jim.beam!\n"
+ "Was reported by @jill and @j!doe from jane@doe yesterday.\n"
+ "\n"
+ "@jack.daniels can vote for john@wayne.name hopefully.\n"
+ "@en.de";
output = "<p>" + String.format(mentionHtml, "sta.rt") + "</p>"
+ "<p>" + "User mentions in tickets are broken.<br/>"
+ "So:<br/>"
+ String.format(mentionHtml, "mc_guyver") + " can fix this.<br/>"
+ String.format(mentionHtml, "j.doe") + ", can you test after the fix by " + String.format(mentionHtml, "m+guyver") + "?<br/>"
+ "Please review this, " + String.format(mentionHtml, "jim.beam") + "!<br/>"
+ "Was reported by " + String.format(mentionHtml, "jill")
+ " and " + String.format(mentionHtml, "j!doe")
+ " from <a href=\"mailto:&#106;a&#110;&#x65;&#x40;&#x64;&#x6f;&#101;\">&#106;a&#110;&#x65;&#x40;&#x64;&#x6f;&#101;</a> yesterday."
+ "</p>"
+ "<p>" + String.format(mentionHtml, "jack.daniels") + " can vote for "
+ "<a href=\"mailto:&#x6a;&#x6f;h&#110;&#x40;&#119;a&#121;&#110;&#101;.&#110;a&#x6d;&#101;\">&#x6a;&#x6f;h&#110;&#x40;&#119;a&#121;&#110;&#101;.&#110;a&#x6d;&#101;</a> hopefully.<br/>"
+ String.format(mentionHtml, "en.de")
+ "</p>";
assertEquals(output, MarkdownUtils.transformGFM(settings, input, repositoryName));
}
private MemorySettings getSettings() {
Map<String, Object> backingMap = new HashMap<String, Object>();
backingMap.put(Keys.web.canonicalUrl, "http://localhost");
backingMap.put(Keys.web.shortCommitIdLength, "7");
MemorySettings ms = new MemorySettings(backingMap);
return ms;
}
}

Loading…
Cancel
Save