Merge pull request #2018 from kounoike/pr-notification-hooks

Add notification hooks
This commit is contained in:
Naoki Takezoe
2018-06-11 08:46:29 +09:00
committed by GitHub
5 changed files with 70 additions and 14 deletions

View File

@@ -353,7 +353,16 @@ trait PullRequestsControllerBase extends ControllerBase {
// close issue by commit message // close issue by commit message
if (pullreq.requestBranch == repository.repository.defaultBranch) { if (pullreq.requestBranch == repository.repository.defaultBranch) {
commits.map { commit => commits.map { commit =>
closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name) closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name).foreach {
issueId =>
getIssue(repository.owner, repository.name, issueId.toString).map { issue =>
callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount)
PluginRegistry().getIssueHooks
.foreach(
_.closedByCommitComment(issue, repository, commit.fullMessage, loginAccount)
)
}
}
} }
} }
@@ -458,15 +467,35 @@ trait PullRequestsControllerBase extends ControllerBase {
val defaultBranch = getRepository(owner, name).get.repository.defaultBranch val defaultBranch = getRepository(owner, name).get.repository.defaultBranch
if (pullreq.branch == defaultBranch) { if (pullreq.branch == defaultBranch) {
commits.flatten.foreach { commit => commits.flatten.foreach { commit =>
closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name) closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name).foreach {
issueId =>
getIssue(owner, name, issueId.toString).map { issue =>
callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount)
PluginRegistry().getIssueHooks
.foreach(_.closedByCommitComment(issue, repository, commit.fullMessage, loginAccount))
}
}
} }
val issueContent = issue.title + " " + issue.content.getOrElse("")
closeIssuesFromMessage( closeIssuesFromMessage(
issue.title + " " + issue.content.getOrElse(""), issueContent,
loginAccount.userName, loginAccount.userName,
owner, owner,
name name
) ).foreach { issueId =>
closeIssuesFromMessage(form.message, loginAccount.userName, owner, name) getIssue(owner, name, issueId.toString).map { issue =>
callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount)
PluginRegistry().getIssueHooks
.foreach(_.closedByCommitComment(issue, repository, issueContent, loginAccount))
}
}
closeIssuesFromMessage(form.message, loginAccount.userName, owner, name).foreach { issueId =>
getIssue(owner, name, issueId.toString).map { issue =>
callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount)
PluginRegistry().getIssueHooks
.foreach(_.closedByCommitComment(issue, repository, issueContent, loginAccount))
}
}
} }
updatePullRequests(owner, name, pullreq.branch) updatePullRequests(owner, name, pullreq.branch)

View File

@@ -1063,7 +1063,14 @@ trait RepositoryViewerControllerBase extends ControllerBase {
// close issue by commit message // close issue by commit message
if (branch == repository.repository.defaultBranch) { if (branch == repository.repository.defaultBranch) {
closeIssuesFromMessage(message, loginAccount.userName, repository.owner, repository.name) closeIssuesFromMessage(message, loginAccount.userName, repository.owner, repository.name).foreach {
issueId =>
getIssue(repository.owner, repository.name, issueId.toString).map { issue =>
callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount)
PluginRegistry().getIssueHooks
.foreach(_.closedByCommitComment(issue, repository, message, loginAccount))
}
}
} }
// call post commit hook // call post commit hook

View File

@@ -1,7 +1,7 @@
package gitbucket.core.plugin package gitbucket.core.plugin
import gitbucket.core.controller.Context import gitbucket.core.controller.Context
import gitbucket.core.model.Issue import gitbucket.core.model.{Account, Issue}
import gitbucket.core.service.RepositoryService.RepositoryInfo import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile._
import profile.api._ import profile.api._
@@ -15,6 +15,19 @@ trait IssueHook {
): Unit = () ): Unit = ()
def closed(issue: Issue, repository: RepositoryInfo)(implicit session: Session, context: Context): Unit = () def closed(issue: Issue, repository: RepositoryInfo)(implicit session: Session, context: Context): Unit = ()
def reopened(issue: Issue, repository: RepositoryInfo)(implicit session: Session, context: Context): Unit = () def reopened(issue: Issue, repository: RepositoryInfo)(implicit session: Session, context: Context): Unit = ()
def assigned(
issue: Issue,
repository: RepositoryInfo,
assigner: Option[String],
assigned: Option[String],
oldAssigned: Option[String]
)(
implicit session: Session,
context: Context
): Unit = ()
def closedByCommitComment(issue: Issue, repository: RepositoryInfo, message: String, pusher: Account)(
implicit session: Session
): Unit = ()
} }

View File

@@ -6,20 +6,21 @@ import gitbucket.core.util.Implicits._
import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.SyntaxSugars._
import gitbucket.core.controller.Context import gitbucket.core.controller.Context
import gitbucket.core.model.{ import gitbucket.core.model.{
Account,
CommitState,
Issue, Issue,
PullRequest,
IssueComment, IssueComment,
IssueLabel, IssueLabel,
Label, Label,
Account, PullRequest,
Repository, Repository,
CommitState,
Role Role
} }
import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile._
import gitbucket.core.model.Profile.profile._ import gitbucket.core.model.Profile.profile._
import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.Profile.dateColumnType import gitbucket.core.model.Profile.dateColumnType
import gitbucket.core.plugin.PluginRegistry
trait IssuesService { trait IssuesService {
self: AccountService with RepositoryService with LabelsService with PrioritiesService with MilestonesService => self: AccountService with RepositoryService with LabelsService with PrioritiesService with MilestonesService =>
@@ -511,20 +512,24 @@ trait IssuesService {
assignedUserName: Option[String], assignedUserName: Option[String],
insertComment: Boolean = false insertComment: Boolean = false
)(implicit context: Context, s: Session): Int = { )(implicit context: Context, s: Session): Int = {
val oldAssigned = getIssue(owner, repository, s"${issueId}").get.assignedUserName
val assigned = assignedUserName
val assigner = context.loginAccount.map(_.userName)
if (insertComment) { if (insertComment) {
val oldAssigned = getIssue(owner, repository, s"${issueId}").get.assignedUserName.getOrElse("Not assigned")
val assigned = assignedUserName.getOrElse("Not assigned")
IssueComments insert IssueComment( IssueComments insert IssueComment(
userName = owner, userName = owner,
repositoryName = repository, repositoryName = repository,
issueId = issueId, issueId = issueId,
action = "assign", action = "assign",
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"), commentedUserName = assigner.getOrElse("Unknown user"),
content = s"${oldAssigned}:${assigned}", content = s"""${oldAssigned.getOrElse("Not assigned")}:${assigned.getOrElse("Not assigned")}""",
registeredDate = currentDate, registeredDate = currentDate,
updatedDate = currentDate updatedDate = currentDate
) )
} }
for (issue <- getIssue(owner, repository, issueId.toString); repo <- getRepository(owner, repository)) {
PluginRegistry().getIssueHooks.foreach(_.assigned(issue, repo, assigner, assigned, oldAssigned))
}
Issues Issues
.filter(_.byPrimaryKey(owner, repository, issueId)) .filter(_.byPrimaryKey(owner, repository, issueId))
.map(t => (t.assignedUserName ?, t.updatedDate)) .map(t => (t.assignedUserName ?, t.updatedDate))

View File

@@ -300,6 +300,8 @@ class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl:
closeIssuesFromMessage(commit.fullMessage, pusher, owner, repository).foreach { issueId => closeIssuesFromMessage(commit.fullMessage, pusher, owner, repository).foreach { issueId =>
getIssue(owner, repository, issueId.toString).map { issue => getIssue(owner, repository, issueId.toString).map { issue =>
callIssuesWebHook("closed", repositoryInfo, issue, baseUrl, pusherAccount) callIssuesWebHook("closed", repositoryInfo, issue, baseUrl, pusherAccount)
PluginRegistry().getIssueHooks
.foreach(_.closedByCommitComment(issue, repositoryInfo, commit.fullMessage, pusherAccount))
} }
} }
} }