Skip to content

Commit 51b82f3

Browse files
committed
Merge branch 'find-old-message-ids-for-in-reply-to'
2 parents 3374121 + 967712d commit 51b82f3

File tree

5 files changed

+90
-21
lines changed

5 files changed

+90
-21
lines changed

app/controllers/Application.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import lib.actions.Actions._
1010
import lib.actions.Requests._
1111
import lib.aws.SES._
1212
import lib.aws.SesAsyncHelpers._
13+
import lib.model.PRMessageIdFinder.messageIdsByMostRecentUsageIn
1314
import lib.model.PatchBomb
1415
import org.eclipse.jgit.lib.ObjectId
1516
import org.kohsuke.github._
@@ -25,7 +26,6 @@ import views.html.pullRequestSent
2526
import scala.collection.convert.wrapAll._
2627
import scala.concurrent.ExecutionContext.Implicits.global
2728
import scala.concurrent.Future
28-
import scala.util.Try
2929

3030
object Application extends Controller {
3131

@@ -50,9 +50,8 @@ object Application extends Controller {
5050
val settings = (for {
5151
data <- req.session.get(prId.slug)
5252
s <- Json.parse(data).validate[PRMailSettings].asOpt
53-
} yield s).getOrElse(PRMailSettings("PATCH"))
53+
} yield s).getOrElse(PRMailSettings("PATCH", messageIdsByMostRecentUsageIn(req.pr).headOption))
5454

55-
req.session.get(prId.slug).map(Json.parse).map(fromJson[PRMailSettings](_).asOpt)
5655
implicit val form = mailSettingsForm.fill(settings)
5756
for (proposedMailByType <- proposedMailByTypeFor(req)) yield {
5857
Ok(views.html.reviewPullRequest(req.pr, myself, proposedMailByType))

app/lib/MarkdownParsing.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package lib
2+
3+
object MarkdownParsing {
4+
5+
val hiddenLinkRegex = """\[\]\((.+?)\)""".r
6+
7+
def parseHiddenLinksOutOf(markdown: String): Seq[String] =
8+
(for (m <- hiddenLinkRegex.findAllMatchIn(markdown)) yield m.group(1)).toSeq
9+
}

app/lib/model/PRMessageIdFinder.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package lib.model
2+
3+
import java.time.Instant
4+
5+
import lib.MarkdownParsing
6+
import org.kohsuke.github.{GHIssueComment, GHPullRequest}
7+
8+
import scala.collection.convert.wrapAll._
9+
10+
object PRMessageIdFinder {
11+
12+
def messageIdsByMostRecentUsageIn(pr: GHPullRequest): Seq[String] = {
13+
val messageIdAndCreationTime = for {
14+
comment: GHIssueComment <- pr.listComments()
15+
messageId <- MarkdownParsing.parseHiddenLinksOutOf(comment.getBody)
16+
} yield messageId -> comment.getCreatedAt.toInstant
17+
18+
val messageIdsWithMostRecentUsageTime: Map[String, Instant] = messageIdAndCreationTime.groupBy(_._1).mapValues(_.map(_._2).max)
19+
20+
messageIdsWithMostRecentUsageTime.toSeq.sortBy(_._2).map(_._1).reverse
21+
}
22+
}

app/views/fragments/sendTabContent.scala.html

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
@import lib.Email.Addresses
22
@import lib.model.MessageSummary
3+
@import lib.model.PRMessageIdFinder.messageIdsByMostRecentUsageIn
4+
@import play.api.libs.json.JsString
35
@(mailType: lib.MailType, proposedMail: lib.ProposedMail, isDefault: Boolean, btnClass: String
46
)(implicit req: GHPRRequest[_], prMailSettings: Form[lib.PRMailSettings], messages: Messages)
57
@import helper._
@@ -50,31 +52,41 @@
5052
@fragments.mailIdent(MessageSummary("{{id}}", "{{subject}}", java.time.ZonedDateTime.now, Addresses("{{addresses.from}}"), "{{groupLink}}"))
5153
</script>
5254
<script>
53-
var inReplyToFieldContainer = jQuery("#@mailType.slug-in-reply-to");
54-
inReplyToFieldContainer.messageIdPicker({
55-
hint: true,
56-
highlight: true,
57-
minLength: 3,
58-
classNames: {menu: 'tt-dropdown-menu'}
59-
}, {
60-
name: 'messageIds',
61-
source: new Bloodhound({
55+
jQuery(function() {
56+
var inReplyToFieldContainer = jQuery("#@mailType.slug-in-reply-to");
57+
var messageSuggestions = new Bloodhound({
6258
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
6359
queryTokenizer: Bloodhound.tokenizers.whitespace,
6460
remote: {
6561
url: '@routes.Api.messageLookup(req.repo.id, "QUERY_STRING")',
6662
wildcard: 'QUERY_STRING'
6763
}
68-
}),
69-
display: 'id',
70-
templates: {
71-
empty: '<div class="empty-message">Unable to find any Messages that match that Id</div>',
72-
suggestion: Handlebars.compile(jQuery("#entry-template").html())
73-
}
74-
});
75-
inReplyToFieldContainer.find(".input-group .typeahead").bind('typeahead:select', function (ev, suggestion) {
76-
jQuery("#@mailType.slug-subject-prefix input").changeVal(suggestion.suggestsPrefix);
64+
});
65+
66+
var messageSuggestionsWithDefaults = function(q, sync, async) {
67+
var fallback = @Html(JsString(messageIdsByMostRecentUsageIn(req.pr).headOption.getOrElse("")).toString) ;
68+
messageSuggestions.search( q === '' ? fallback : q, sync, async);
69+
};
70+
71+
inReplyToFieldContainer.messageIdPicker({
72+
hint: true,
73+
highlight: true,
74+
minLength: 0, // To allow default suggestions
75+
classNames: {menu: 'tt-dropdown-menu'}
76+
}, {
77+
name: 'messageIds',
78+
source: messageSuggestionsWithDefaults,
79+
display: 'id',
80+
templates: {
81+
empty: '<div class="empty-message">Unable to find any Messages that match that Id</div>',
82+
suggestion: Handlebars.compile(jQuery("#entry-template").html())
83+
}
84+
});
85+
inReplyToFieldContainer.find(".input-group .typeahead").bind('typeahead:select', function (ev, suggestion) {
86+
jQuery("#@mailType.slug-subject-prefix input").changeVal(suggestion.suggestsPrefix);
87+
});
7788
});
89+
7890
</script>
7991

8092
@b3.submit('class -> s"btn $btnClass btn-lg", 'disabled -> proposedMail.errors.nonEmpty) {

test/lib/MarkdownParsingSpec.scala

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package lib
2+
3+
import org.scalatestplus.play.PlaySpec
4+
5+
class MarkdownParsingSpec extends PlaySpec {
6+
7+
val prComment =
8+
"""
9+
|@rtyley sent this to the mailing list with [_submitGit_](https://github.com/rtyley/submitgit) - here on [Google Groups](https://groups.google.com/d/msgid/submitgit-test/0000014e6f0b65e9-e3f67cd3-6679-41ed-b2e2-819766dbe2a0-000000@eu-west-1.amazonses.com) [](0000014e6f0b65e9-e3f67cd3-6679-41ed-b2e2-819766dbe2a0-000000@eu-west-1.amazonses.com)
10+
""".stripMargin
11+
12+
"Markdown parsing" should {
13+
"get hidden message ids" in {
14+
val links = MarkdownParsing.parseHiddenLinksOutOf(
15+
"[](0000014e69391015-5de3c8c6-458f-4eb6-b222-14cfc8a6b055-000000@eu-west-1.amazonses.com)"
16+
)
17+
18+
links mustEqual Seq("0000014e69391015-5de3c8c6-458f-4eb6-b222-14cfc8a6b055-000000@eu-west-1.amazonses.com")
19+
}
20+
"get hidden message id in real message" in {
21+
val links = MarkdownParsing.parseHiddenLinksOutOf(prComment)
22+
23+
links mustEqual Seq("0000014e6f0b65e9-e3f67cd3-6679-41ed-b2e2-819766dbe2a0-000000@eu-west-1.amazonses.com")
24+
}
25+
}
26+
}
27+

0 commit comments

Comments
 (0)