mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-07 14:05:52 +01:00
Merge pull request #1864 from kounoike/pr-more-action-issuecomments
Save more actions as issue comments.
This commit is contained in:
@@ -7,7 +7,7 @@ To determine if it was any operation, you see the `ACTION` column.
|
|||||||
And in the case of some actions, `CONTENT` column value contains additional information.
|
And in the case of some actions, `CONTENT` column value contains additional information.
|
||||||
|
|
||||||
|ACTION |CONTENT |
|
|ACTION |CONTENT |
|
||||||
|---------------|-----------------|
|
|----------------|----------------------|
|
||||||
|comment |comment |
|
|comment |comment |
|
||||||
|close_comment |comment |
|
|close_comment |comment |
|
||||||
|reopen_comment |comment |
|
|reopen_comment |comment |
|
||||||
@@ -17,6 +17,11 @@ And in the case of some actions, `CONTENT` column value contains additional info
|
|||||||
|merge |comment |
|
|merge |comment |
|
||||||
|delete_branch |branchName |
|
|delete_branch |branchName |
|
||||||
|refer |issueId:title |
|
|refer |issueId:title |
|
||||||
|
|add_label |labelName |
|
||||||
|
|delete_label |labelName |
|
||||||
|
|change_priority |oldPriority:priority |
|
||||||
|
|change_milestone|oldMilestone:milestone|
|
||||||
|
|assign |oldAssigned:assigned |
|
||||||
|
|
||||||
### comment
|
### comment
|
||||||
|
|
||||||
@@ -54,3 +59,23 @@ Therefore, this comment is not displayed, and not counted as a comment.
|
|||||||
|
|
||||||
This value is saved when other issue or issue comment contains reference to the issue like `#issueId`.
|
This value is saved when other issue or issue comment contains reference to the issue like `#issueId`.
|
||||||
At the same time, store id and title of the referrer issue as `id:title`.
|
At the same time, store id and title of the referrer issue as `id:title`.
|
||||||
|
|
||||||
|
### add_label
|
||||||
|
|
||||||
|
This value is saved when users have added the label.
|
||||||
|
|
||||||
|
### delete_label
|
||||||
|
|
||||||
|
This value is saved when users have deleted the label.
|
||||||
|
|
||||||
|
### change_priority
|
||||||
|
|
||||||
|
This value is saved when users have changed the priority.
|
||||||
|
|
||||||
|
### change_milestone
|
||||||
|
|
||||||
|
This value is saved when users have changed the milestone.
|
||||||
|
|
||||||
|
### assign
|
||||||
|
|
||||||
|
This value is saved when users have assign issue/PR to user or remove the assign.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import gitbucket.core.service.IssuesService._
|
|||||||
|
|
||||||
class DashboardController extends DashboardControllerBase
|
class DashboardController extends DashboardControllerBase
|
||||||
with IssuesService with PullRequestService with RepositoryService with AccountService with CommitsService
|
with IssuesService with PullRequestService with RepositoryService with AccountService with CommitsService
|
||||||
with UsersAuthenticator
|
with LabelsService with PrioritiesService with MilestonesService with UsersAuthenticator
|
||||||
|
|
||||||
trait DashboardControllerBase extends ControllerBase {
|
trait DashboardControllerBase extends ControllerBase {
|
||||||
self: IssuesService with PullRequestService with RepositoryService with AccountService
|
self: IssuesService with PullRequestService with RepositoryService with AccountService
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ class IndexController extends IndexControllerBase
|
|||||||
with AccountService
|
with AccountService
|
||||||
with RepositorySearchService
|
with RepositorySearchService
|
||||||
with IssuesService
|
with IssuesService
|
||||||
|
with LabelsService
|
||||||
|
with MilestonesService
|
||||||
|
with PrioritiesService
|
||||||
with UsersAuthenticator
|
with UsersAuthenticator
|
||||||
with ReferrerAuthenticator
|
with ReferrerAuthenticator
|
||||||
with AccountFederationService
|
with AccountFederationService
|
||||||
|
|||||||
@@ -271,25 +271,25 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
ajaxPost("/:owner/:repository/issues/:id/label/new")(writableUsersOnly { repository =>
|
ajaxPost("/:owner/:repository/issues/:id/label/new")(writableUsersOnly { repository =>
|
||||||
defining(params("id").toInt){ issueId =>
|
defining(params("id").toInt){ issueId =>
|
||||||
registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt)
|
registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt, true)
|
||||||
html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
|
html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ajaxPost("/:owner/:repository/issues/:id/label/delete")(writableUsersOnly { repository =>
|
ajaxPost("/:owner/:repository/issues/:id/label/delete")(writableUsersOnly { repository =>
|
||||||
defining(params("id").toInt){ issueId =>
|
defining(params("id").toInt){ issueId =>
|
||||||
deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt)
|
deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt, true)
|
||||||
html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
|
html.labellist(getIssueLabels(repository.owner, repository.name, issueId))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ajaxPost("/:owner/:repository/issues/:id/assign")(writableUsersOnly { repository =>
|
ajaxPost("/:owner/:repository/issues/:id/assign")(writableUsersOnly { repository =>
|
||||||
updateAssignedUserName(repository.owner, repository.name, params("id").toInt, assignedUserName("assignedUserName"))
|
updateAssignedUserName(repository.owner, repository.name, params("id").toInt, assignedUserName("assignedUserName"), true)
|
||||||
Ok("updated")
|
Ok("updated")
|
||||||
})
|
})
|
||||||
|
|
||||||
ajaxPost("/:owner/:repository/issues/:id/milestone")(writableUsersOnly { repository =>
|
ajaxPost("/:owner/:repository/issues/:id/milestone")(writableUsersOnly { repository =>
|
||||||
updateMilestoneId(repository.owner, repository.name, params("id").toInt, milestoneId("milestoneId"))
|
updateMilestoneId(repository.owner, repository.name, params("id").toInt, milestoneId("milestoneId"), true)
|
||||||
milestoneId("milestoneId").map { milestoneId =>
|
milestoneId("milestoneId").map { milestoneId =>
|
||||||
getMilestonesWithIssueCount(repository.owner, repository.name)
|
getMilestonesWithIssueCount(repository.owner, repository.name)
|
||||||
.find(_._1.milestoneId == milestoneId).map { case (_, openCount, closeCount) =>
|
.find(_._1.milestoneId == milestoneId).map { case (_, openCount, closeCount) =>
|
||||||
@@ -299,7 +299,8 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
ajaxPost("/:owner/:repository/issues/:id/priority")(writableUsersOnly { repository =>
|
ajaxPost("/:owner/:repository/issues/:id/priority")(writableUsersOnly { repository =>
|
||||||
updatePriorityId(repository.owner, repository.name, params("id").toInt, priorityId("priorityId"))
|
val priority = priorityId("priorityId")
|
||||||
|
updatePriorityId(repository.owner, repository.name, params("id").toInt, priority, true)
|
||||||
Ok("updated")
|
Ok("updated")
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -325,7 +326,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
params("value").toIntOpt.map{ labelId =>
|
params("value").toIntOpt.map{ labelId =>
|
||||||
executeBatch(repository) { issueId =>
|
executeBatch(repository) { issueId =>
|
||||||
getIssueLabel(repository.owner, repository.name, issueId, labelId) getOrElse {
|
getIssueLabel(repository.owner, repository.name, issueId, labelId) getOrElse {
|
||||||
registerIssueLabel(repository.owner, repository.name, issueId, labelId)
|
registerIssueLabel(repository.owner, repository.name, issueId, labelId, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} getOrElse NotFound()
|
} getOrElse NotFound()
|
||||||
@@ -334,7 +335,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/issues/batchedit/assign")(writableUsersOnly { repository =>
|
post("/:owner/:repository/issues/batchedit/assign")(writableUsersOnly { repository =>
|
||||||
defining(assignedUserName("value")){ value =>
|
defining(assignedUserName("value")){ value =>
|
||||||
executeBatch(repository) {
|
executeBatch(repository) {
|
||||||
updateAssignedUserName(repository.owner, repository.name, _, value)
|
updateAssignedUserName(repository.owner, repository.name, _, value, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -342,7 +343,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/issues/batchedit/milestone")(writableUsersOnly { repository =>
|
post("/:owner/:repository/issues/batchedit/milestone")(writableUsersOnly { repository =>
|
||||||
defining(milestoneId("value")){ value =>
|
defining(milestoneId("value")){ value =>
|
||||||
executeBatch(repository) {
|
executeBatch(repository) {
|
||||||
updateMilestoneId(repository.owner, repository.name, _, value)
|
updateMilestoneId(repository.owner, repository.name, _, value, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -350,7 +351,7 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/issues/batchedit/priority")(writableUsersOnly { repository =>
|
post("/:owner/:repository/issues/batchedit/priority")(writableUsersOnly { repository =>
|
||||||
defining(priorityId("value")){ value =>
|
defining(priorityId("value")){ value =>
|
||||||
executeBatch(repository) {
|
executeBatch(repository) {
|
||||||
updatePriorityId(repository.owner, repository.name, _, value)
|
updatePriorityId(repository.owner, repository.name, _, value, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package gitbucket.core.controller
|
package gitbucket.core.controller
|
||||||
|
|
||||||
import gitbucket.core.issues.labels.html
|
import gitbucket.core.issues.labels.html
|
||||||
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, LabelsService}
|
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, LabelsService, MilestonesService, PrioritiesService}
|
||||||
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
|
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
|
||||||
import gitbucket.core.util.Implicits._
|
import gitbucket.core.util.Implicits._
|
||||||
import gitbucket.core.util.SyntaxSugars._
|
import gitbucket.core.util.SyntaxSugars._
|
||||||
@@ -10,7 +10,8 @@ import org.scalatra.i18n.Messages
|
|||||||
import org.scalatra.Ok
|
import org.scalatra.Ok
|
||||||
|
|
||||||
class LabelsController extends LabelsControllerBase
|
class LabelsController extends LabelsControllerBase
|
||||||
with LabelsService with IssuesService with RepositoryService with AccountService
|
with IssuesService with RepositoryService with AccountService
|
||||||
|
with LabelsService with PrioritiesService with MilestonesService
|
||||||
with ReferrerAuthenticator with WritableUsersAuthenticator
|
with ReferrerAuthenticator with WritableUsersAuthenticator
|
||||||
|
|
||||||
trait LabelsControllerBase extends ControllerBase {
|
trait LabelsControllerBase extends ControllerBase {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package gitbucket.core.controller
|
package gitbucket.core.controller
|
||||||
|
|
||||||
import gitbucket.core.issues.priorities.html
|
import gitbucket.core.issues.priorities.html
|
||||||
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, PrioritiesService}
|
import gitbucket.core.service.{RepositoryService, AccountService, IssuesService, LabelsService, MilestonesService, PrioritiesService}
|
||||||
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
|
import gitbucket.core.util.{ReferrerAuthenticator, WritableUsersAuthenticator}
|
||||||
import gitbucket.core.util.Implicits._
|
import gitbucket.core.util.Implicits._
|
||||||
import gitbucket.core.util.SyntaxSugars._
|
import gitbucket.core.util.SyntaxSugars._
|
||||||
@@ -10,7 +10,8 @@ import org.scalatra.i18n.Messages
|
|||||||
import org.scalatra.Ok
|
import org.scalatra.Ok
|
||||||
|
|
||||||
class PrioritiesController extends PrioritiesControllerBase
|
class PrioritiesController extends PrioritiesControllerBase
|
||||||
with PrioritiesService with IssuesService with RepositoryService with AccountService
|
with IssuesService with RepositoryService with AccountService
|
||||||
|
with LabelsService with PrioritiesService with MilestonesService
|
||||||
with ReferrerAuthenticator with WritableUsersAuthenticator
|
with ReferrerAuthenticator with WritableUsersAuthenticator
|
||||||
|
|
||||||
trait PrioritiesControllerBase extends ControllerBase {
|
trait PrioritiesControllerBase extends ControllerBase {
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import org.scalatra.i18n.Messages
|
|||||||
|
|
||||||
class RepositoryViewerController extends RepositoryViewerControllerBase
|
class RepositoryViewerController extends RepositoryViewerControllerBase
|
||||||
with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService
|
with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService
|
||||||
|
with LabelsService with MilestonesService with PrioritiesService
|
||||||
with ReadableUsersAuthenticator with ReferrerAuthenticator with WritableUsersAuthenticator with PullRequestService with CommitStatusService
|
with ReadableUsersAuthenticator with ReferrerAuthenticator with WritableUsersAuthenticator with PullRequestService with CommitStatusService
|
||||||
with WebHookPullRequestService with WebHookPullRequestReviewCommentService with ProtectedBranchService
|
with WebHookPullRequestService with WebHookPullRequestReviewCommentService with ProtectedBranchService
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import gitbucket.core.util.JGitUtil.CommitInfo
|
|||||||
import gitbucket.core.util.StringUtil._
|
import gitbucket.core.util.StringUtil._
|
||||||
import gitbucket.core.util.Implicits._
|
import gitbucket.core.util.Implicits._
|
||||||
import gitbucket.core.util.SyntaxSugars._
|
import gitbucket.core.util.SyntaxSugars._
|
||||||
|
import gitbucket.core.controller.Context
|
||||||
import gitbucket.core.model.{Issue, PullRequest, IssueComment, IssueLabel, Label, Account, Repository, CommitState, Role}
|
import gitbucket.core.model.{Issue, PullRequest, IssueComment, IssueLabel, Label, Account, Repository, CommitState, Role}
|
||||||
import gitbucket.core.model.Profile._
|
import gitbucket.core.model.Profile._
|
||||||
import gitbucket.core.model.Profile.profile._
|
import gitbucket.core.model.Profile.profile._
|
||||||
@@ -11,7 +12,7 @@ import gitbucket.core.model.Profile.profile.blockingApi._
|
|||||||
import gitbucket.core.model.Profile.dateColumnType
|
import gitbucket.core.model.Profile.dateColumnType
|
||||||
|
|
||||||
trait IssuesService {
|
trait IssuesService {
|
||||||
self: AccountService with RepositoryService =>
|
self: AccountService with RepositoryService with LabelsService with PrioritiesService with MilestonesService =>
|
||||||
import IssuesService._
|
import IssuesService._
|
||||||
|
|
||||||
def getIssue(owner: String, repository: String, issueId: String)(implicit s: Session) =
|
def getIssue(owner: String, repository: String, issueId: String)(implicit s: Session) =
|
||||||
@@ -321,11 +322,35 @@ trait IssuesService {
|
|||||||
} get
|
} get
|
||||||
}
|
}
|
||||||
|
|
||||||
def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session): Int = {
|
def registerIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int, insertComment: Boolean = false)(implicit context: Context, s: Session): Int = {
|
||||||
|
if (insertComment) {
|
||||||
|
IssueComments insert IssueComment(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
issueId = issueId,
|
||||||
|
action = "add_label",
|
||||||
|
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"),
|
||||||
|
content = getLabel(owner, repository, labelId).map(_.labelName).getOrElse("Unknown label"),
|
||||||
|
registeredDate = currentDate,
|
||||||
|
updatedDate = currentDate
|
||||||
|
)
|
||||||
|
}
|
||||||
IssueLabels insert IssueLabel(owner, repository, issueId, labelId)
|
IssueLabels insert IssueLabel(owner, repository, issueId, labelId)
|
||||||
}
|
}
|
||||||
|
|
||||||
def deleteIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int)(implicit s: Session): Int = {
|
def deleteIssueLabel(owner: String, repository: String, issueId: Int, labelId: Int, insertComment: Boolean = false)(implicit context: Context, s: Session): Int = {
|
||||||
|
if (insertComment) {
|
||||||
|
IssueComments insert IssueComment(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
issueId = issueId,
|
||||||
|
action = "delete_label",
|
||||||
|
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"),
|
||||||
|
content = getLabel(owner, repository, labelId).map(_.labelName).getOrElse("Unknown label"),
|
||||||
|
registeredDate = currentDate,
|
||||||
|
updatedDate = currentDate
|
||||||
|
)
|
||||||
|
}
|
||||||
IssueLabels filter(_.byPrimaryKey(owner, repository, issueId, labelId)) delete
|
IssueLabels filter(_.byPrimaryKey(owner, repository, issueId, labelId)) delete
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,15 +375,57 @@ trait IssuesService {
|
|||||||
.update(title, content, currentDate)
|
.update(title, content, currentDate)
|
||||||
}
|
}
|
||||||
|
|
||||||
def updateAssignedUserName(owner: String, repository: String, issueId: Int, assignedUserName: Option[String])(implicit s: Session): Int = {
|
def updateAssignedUserName(owner: String, repository: String, issueId: Int, assignedUserName: Option[String], insertComment: Boolean = false)(implicit context: Context, s: Session): Int = {
|
||||||
|
if (insertComment) {
|
||||||
|
val oldAssigned = getIssue(owner, repository, s"${issueId}").get.assignedUserName.getOrElse("Not assigned")
|
||||||
|
val assigned = assignedUserName.getOrElse("Not assigned")
|
||||||
|
IssueComments insert IssueComment(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
issueId = issueId,
|
||||||
|
action = "assign",
|
||||||
|
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"),
|
||||||
|
content = s"${oldAssigned}:${assigned}",
|
||||||
|
registeredDate = currentDate,
|
||||||
|
updatedDate = currentDate
|
||||||
|
)
|
||||||
|
}
|
||||||
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.assignedUserName?, t.updatedDate)).update(assignedUserName, currentDate)
|
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.assignedUserName?, t.updatedDate)).update(assignedUserName, currentDate)
|
||||||
}
|
}
|
||||||
|
|
||||||
def updateMilestoneId(owner: String, repository: String, issueId: Int, milestoneId: Option[Int])(implicit s: Session): Int = {
|
def updateMilestoneId(owner: String, repository: String, issueId: Int, milestoneId: Option[Int], insertComment: Boolean = false)(implicit context: Context, s: Session): Int = {
|
||||||
|
if (insertComment) {
|
||||||
|
val oldMilestoneName = getIssue(owner, repository, s"${issueId}").get.milestoneId.map(getMilestone(owner, repository, _).map(_.title).getOrElse("Unknown milestone")).getOrElse("No milestone")
|
||||||
|
val milestoneName = milestoneId.map(getMilestone(owner, repository, _).map(_.title).getOrElse("Unknown milestone")).getOrElse("No milestone")
|
||||||
|
IssueComments insert IssueComment(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
issueId = issueId,
|
||||||
|
action = "change_milestone",
|
||||||
|
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"),
|
||||||
|
content = s"${oldMilestoneName}:${milestoneName}",
|
||||||
|
registeredDate = currentDate,
|
||||||
|
updatedDate = currentDate
|
||||||
|
)
|
||||||
|
}
|
||||||
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.milestoneId?, t.updatedDate)).update(milestoneId, currentDate)
|
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.milestoneId?, t.updatedDate)).update(milestoneId, currentDate)
|
||||||
}
|
}
|
||||||
|
|
||||||
def updatePriorityId(owner: String, repository: String, issueId: Int, priorityId: Option[Int])(implicit s: Session): Int = {
|
def updatePriorityId(owner: String, repository: String, issueId: Int, priorityId: Option[Int], insertComment: Boolean = false)(implicit context: Context, s: Session): Int = {
|
||||||
|
if (insertComment) {
|
||||||
|
val oldPriorityName = getIssue(owner, repository, s"${issueId}").get.priorityId.map(getPriority(owner, repository, _).map(_.priorityName).getOrElse("Unknown priority")).getOrElse("No priority")
|
||||||
|
val priorityName = priorityId.map(getPriority(owner, repository, _).map(_.priorityName).getOrElse("Unknown priority")).getOrElse("No priority")
|
||||||
|
IssueComments insert IssueComment(
|
||||||
|
userName = owner,
|
||||||
|
repositoryName = repository,
|
||||||
|
issueId = issueId,
|
||||||
|
action = "change_priority",
|
||||||
|
commentedUserName = context.loginAccount.map(_.userName).getOrElse("Unknown user"),
|
||||||
|
content = s"${oldPriorityName}:${priorityName}",
|
||||||
|
registeredDate = currentDate,
|
||||||
|
updatedDate = currentDate
|
||||||
|
)
|
||||||
|
}
|
||||||
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.priorityId?, t.updatedDate)).update(priorityId, currentDate)
|
Issues.filter(_.byPrimaryKey(owner, repository, issueId)).map(t => (t.priorityId?, t.updatedDate)).update(priorityId, currentDate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ import Implicits.request2Session
|
|||||||
* It may be called many times in one request, so each method stores
|
* It may be called many times in one request, so each method stores
|
||||||
* its result into the cache which available during a request.
|
* its result into the cache which available during a request.
|
||||||
*/
|
*/
|
||||||
trait RequestCache extends SystemSettingsService with AccountService with IssuesService with RepositoryService {
|
trait RequestCache extends SystemSettingsService with AccountService with IssuesService with RepositoryService
|
||||||
|
with LabelsService with MilestonesService with PrioritiesService {
|
||||||
|
|
||||||
private implicit def context2Session(implicit context: Context): Session =
|
private implicit def context2Session(implicit context: Context): Session =
|
||||||
request2Session(context.request)
|
request2Session(context.request)
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ import scala.collection.JavaConverters._
|
|||||||
class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl: String, sshUrl: Option[String])
|
class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl: String, sshUrl: Option[String])
|
||||||
extends PostReceiveHook with PreReceiveHook
|
extends PostReceiveHook with PreReceiveHook
|
||||||
with RepositoryService with AccountService with IssuesService with ActivityService with PullRequestService with WebHookService
|
with RepositoryService with AccountService with IssuesService with ActivityService with PullRequestService with WebHookService
|
||||||
|
with LabelsService with PrioritiesService with MilestonesService
|
||||||
with WebHookPullRequestService with CommitsService {
|
with WebHookPullRequestService with CommitsService {
|
||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
||||||
|
|||||||
@@ -5,37 +5,8 @@
|
|||||||
pullreq: Option[gitbucket.core.model.PullRequest] = None)(implicit context: gitbucket.core.controller.Context)
|
pullreq: Option[gitbucket.core.model.PullRequest] = None)(implicit context: gitbucket.core.controller.Context)
|
||||||
@import gitbucket.core.view.helpers
|
@import gitbucket.core.view.helpers
|
||||||
@import gitbucket.core.model.CommitComment
|
@import gitbucket.core.model.CommitComment
|
||||||
@if(issue.isDefined){
|
|
||||||
<div class="panel panel-default issue-comment-box">
|
|
||||||
<div class="panel-heading">
|
|
||||||
@helpers.avatar(issue.get.openedUserName, 20)
|
|
||||||
@helpers.user(issue.get.openedUserName, styleClass="username strong")
|
|
||||||
<span class="muted">commented @gitbucket.core.helper.html.datetimeago(issue.get.registeredDate)</span>
|
|
||||||
<span class="pull-right">
|
|
||||||
@if(isManageable || context.loginAccount.map(_.userName == issue.get.openedUserName).getOrElse(false)){
|
|
||||||
<a href="#" data-issue-id="@issue.get.issueId"><i class="octicon octicon-pencil" aria-label="Edit"></i></a>
|
|
||||||
}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body issue-content markdown-body" id="issueContent">
|
|
||||||
@helpers.markdown(
|
|
||||||
markdown = issue.get.content getOrElse "No description provided.",
|
|
||||||
repository = repository,
|
|
||||||
enableWikiLink = false,
|
|
||||||
enableRefsLink = true,
|
|
||||||
enableLineBreaks = true,
|
|
||||||
enableTaskList = true,
|
|
||||||
hasWritePermission = isManageable
|
|
||||||
)
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
@issueOrPullRequest()={ @if(issue.exists(_.isPullRequest))( "pull request" )else( "issue" ) }
|
@issueOrPullRequest()={ @if(issue.exists(_.isPullRequest))( "pull request" )else( "issue" ) }
|
||||||
|
@showFormatedComment(comment: gitbucket.core.model.IssueComment)={
|
||||||
@comments.map {
|
|
||||||
case comment: gitbucket.core.model.IssueComment => {
|
|
||||||
@if(comment.action != "close" && comment.action != "reopen" && comment.action != "delete_branch"
|
|
||||||
&& comment.action != "commit" && comment.action != "refer"){
|
|
||||||
<div class="panel panel-default issue-comment-box" id="comment-@comment.commentId">
|
<div class="panel panel-default issue-comment-box" id="comment-@comment.commentId">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
@helpers.avatar(comment.commentedUserName, 20)
|
@helpers.avatar(comment.commentedUserName, 20)
|
||||||
@@ -71,7 +42,35 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(comment.action == "commit"){
|
@if(issue.isDefined){
|
||||||
|
<div class="panel panel-default issue-comment-box">
|
||||||
|
<div class="panel-heading">
|
||||||
|
@helpers.avatar(issue.get.openedUserName, 20)
|
||||||
|
@helpers.user(issue.get.openedUserName, styleClass="username strong")
|
||||||
|
<span class="muted">commented @gitbucket.core.helper.html.datetimeago(issue.get.registeredDate)</span>
|
||||||
|
<span class="pull-right">
|
||||||
|
@if(isManageable || context.loginAccount.map(_.userName == issue.get.openedUserName).getOrElse(false)){
|
||||||
|
<a href="#" data-issue-id="@issue.get.issueId"><i class="octicon octicon-pencil" aria-label="Edit"></i></a>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body issue-content markdown-body" id="issueContent">
|
||||||
|
@helpers.markdown(
|
||||||
|
markdown = issue.get.content getOrElse "No description provided.",
|
||||||
|
repository = repository,
|
||||||
|
enableWikiLink = false,
|
||||||
|
enableRefsLink = true,
|
||||||
|
enableLineBreaks = true,
|
||||||
|
enableTaskList = true,
|
||||||
|
hasWritePermission = isManageable
|
||||||
|
)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@comments.map {
|
||||||
|
case comment: gitbucket.core.model.IssueComment => {
|
||||||
|
@comment.action match {
|
||||||
|
case "commit" => {
|
||||||
@defining({
|
@defining({
|
||||||
val (content, id) = " ([a-f0-9]{40})$".r.findFirstMatchIn(comment.content)
|
val (content, id) = " ([a-f0-9]{40})$".r.findFirstMatchIn(comment.content)
|
||||||
.map(m => (m.before.toString -> Some(m.group(1))))
|
.map(m => (m.before.toString -> Some(m.group(1))))
|
||||||
@@ -101,7 +100,7 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@if(comment.action == "refer"){
|
case "refer" => {
|
||||||
<div class="discussion-item discussion-item-refer">
|
<div class="discussion-item discussion-item-refer">
|
||||||
<div class="discussion-item-header">
|
<div class="discussion-item-header">
|
||||||
<span class="discussion-item-icon"><i class="octicon octicon-bookmark"></i></span>
|
<span class="discussion-item-icon"><i class="octicon octicon-bookmark"></i></span>
|
||||||
@@ -117,7 +116,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(comment.action == "merge"){
|
case "merge" => {
|
||||||
|
@showFormatedComment(comment)
|
||||||
<div class="discussion-item discussion-item-merge">
|
<div class="discussion-item discussion-item-merge">
|
||||||
<div class="discussion-item-header">
|
<div class="discussion-item-header">
|
||||||
<span class="discussion-item-icon"><i class="octicon octicon-git-merge"></i></span>
|
<span class="discussion-item-icon"><i class="octicon octicon-git-merge"></i></span>
|
||||||
@@ -134,7 +134,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(comment.action == "close" || comment.action == "close_comment"){
|
case "close" | "close_comment" => {
|
||||||
|
@if(comment.action == "close_comment"){
|
||||||
|
@showFormatedComment(comment)
|
||||||
|
}
|
||||||
<div class="discussion-item discussion-item-close">
|
<div class="discussion-item discussion-item-close">
|
||||||
<div class="discussion-item-header">
|
<div class="discussion-item-header">
|
||||||
<span class="discussion-item-icon"><i class="octicon octicon-circle-slash"></i></span>
|
<span class="discussion-item-icon"><i class="octicon octicon-circle-slash"></i></span>
|
||||||
@@ -145,7 +148,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(comment.action == "reopen" || comment.action == "reopen_comment"){
|
case "reopen" | "reopen_comment" => {
|
||||||
|
@if(comment.action == "reopen_comment"){
|
||||||
|
@showFormatedComment(comment)
|
||||||
|
}
|
||||||
<div class="discussion-item discussion-item-reopen">
|
<div class="discussion-item discussion-item-reopen">
|
||||||
<div class="discussion-item-header">
|
<div class="discussion-item-header">
|
||||||
<span class="discussion-item-icon"><i class="octicon octicon-primitive-dot"></i></span>
|
<span class="discussion-item-icon"><i class="octicon octicon-primitive-dot"></i></span>
|
||||||
@@ -156,7 +162,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if(comment.action == "delete_branch"){
|
case "delete_branch" => {
|
||||||
<div class="discussion-item discussion-item-delete_branch">
|
<div class="discussion-item discussion-item-delete_branch">
|
||||||
<div class="discussion-item-header">
|
<div class="discussion-item-header">
|
||||||
<span class="discussion-item-icon"><i class="octicon octicon-git-branch"></i></span>
|
<span class="discussion-item-icon"><i class="octicon octicon-git-branch"></i></span>
|
||||||
@@ -167,6 +173,65 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
case "add_label" => {
|
||||||
|
<div class="discussion-item discussion-item-add-label">
|
||||||
|
<div class="discussion-item-header">
|
||||||
|
<span class="discussion-item-icon"><i class="octicon octicon-tag"></i></span>
|
||||||
|
@helpers.avatar(comment.commentedUserName, 16)
|
||||||
|
@helpers.user(comment.commentedUserName, styleClass="username strong")
|
||||||
|
add the <code>@comment.content</code> label
|
||||||
|
@gitbucket.core.helper.html.datetimeago(comment.registeredDate)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
case "delete_label" => {
|
||||||
|
<div class="discussion-item discussion-item-delete-label">
|
||||||
|
<div class="discussion-item-header">
|
||||||
|
<span class="discussion-item-icon"><i class="octicon octicon-tag"></i></span>
|
||||||
|
@helpers.avatar(comment.commentedUserName, 16)
|
||||||
|
@helpers.user(comment.commentedUserName, styleClass="username strong")
|
||||||
|
removed the <code>@comment.content</code> label
|
||||||
|
@gitbucket.core.helper.html.datetimeago(comment.registeredDate)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
case "change_priority" => {
|
||||||
|
<div class="discussion-item discussion-item-change-priority">
|
||||||
|
<div class="discussion-item-header">
|
||||||
|
<span class="discussion-item-icon"><i class="octicon octicon-flame"></i></span>
|
||||||
|
@helpers.avatar(comment.commentedUserName, 16)
|
||||||
|
@helpers.user(comment.commentedUserName, styleClass="username strong")
|
||||||
|
change priority from <code>@comment.content.split(":")(0)</code> to <code>@comment.content.split(":")(1)</code>
|
||||||
|
@gitbucket.core.helper.html.datetimeago(comment.registeredDate)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
case "change_milestone" => {
|
||||||
|
<div class="discussion-item discussion-item-change-milestone">
|
||||||
|
<div class="discussion-item-header">
|
||||||
|
<span class="discussion-item-icon"><i class="octicon octicon-milestone"></i></span>
|
||||||
|
@helpers.avatar(comment.commentedUserName, 16)
|
||||||
|
@helpers.user(comment.commentedUserName, styleClass="username strong")
|
||||||
|
change milestone from <code>@comment.content.split(":")(0)</code> to <code>@comment.content.split(":")(1)</code>
|
||||||
|
@gitbucket.core.helper.html.datetimeago(comment.registeredDate)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
case "assign" => {
|
||||||
|
<div class="discussion-item discussion-item-assign">
|
||||||
|
<div class="discussion-item-header">
|
||||||
|
<span class="discussion-item-icon"><i class="octicon octicon-person"></i></span>
|
||||||
|
@helpers.avatar(comment.commentedUserName, 16)
|
||||||
|
@helpers.user(comment.commentedUserName, styleClass="username strong")
|
||||||
|
change assignee from <code>@comment.content.split(":")(0)</code> to <code>@comment.content.split(":")(1)</code>
|
||||||
|
@gitbucket.core.helper.html.datetimeago(comment.registeredDate)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
case _ => {
|
||||||
|
@showFormatedComment(comment)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case comment: CommitComment => {
|
case comment: CommitComment => {
|
||||||
@gitbucket.core.helper.html.commitcomment(comment, isManageable, repository, pullreq.map(_.commitIdTo))
|
@gitbucket.core.helper.html.commitcomment(comment, isManageable, repository, pullreq.map(_.commitIdTo))
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import gitbucket.core.model._
|
|||||||
import org.scalatest.FunSpec
|
import org.scalatest.FunSpec
|
||||||
|
|
||||||
class PullRequestServiceSpec extends FunSpec with ServiceSpecBase
|
class PullRequestServiceSpec extends FunSpec with ServiceSpecBase
|
||||||
with PullRequestService with IssuesService with AccountService with RepositoryService with CommitsService {
|
with PullRequestService with IssuesService with AccountService with RepositoryService with CommitsService
|
||||||
|
with LabelsService with MilestonesService with PrioritiesService {
|
||||||
|
|
||||||
def swap(r: (Issue, PullRequest)) = (r._2 -> r._1)
|
def swap(r: (Issue, PullRequest)) = (r._2 -> r._1)
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ trait ServiceSpecBase {
|
|||||||
def user(name:String)(implicit s:Session):Account = AccountService.getAccountByUserName(name).get
|
def user(name:String)(implicit s:Session):Account = AccountService.getAccountByUserName(name).get
|
||||||
|
|
||||||
lazy val dummyService = new RepositoryService with AccountService with IssuesService with PullRequestService
|
lazy val dummyService = new RepositoryService with AccountService with IssuesService with PullRequestService
|
||||||
with CommitsService with CommitStatusService with LabelsService (){}
|
with CommitsService with CommitStatusService with LabelsService with MilestonesService with PrioritiesService (){}
|
||||||
|
|
||||||
def generateNewUserWithDBRepository(userName:String, repositoryName:String)(implicit s:Session):Account = {
|
def generateNewUserWithDBRepository(userName:String, repositoryName:String)(implicit s:Session):Account = {
|
||||||
val ac = AccountService.getAccountByUserName(userName).getOrElse(generateNewAccount(userName))
|
val ac = AccountService.getAccountByUserName(userName).getOrElse(generateNewAccount(userName))
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ import gitbucket.core.model.WebHookContentType
|
|||||||
|
|
||||||
|
|
||||||
class WebHookServiceSpec extends FunSuite with ServiceSpecBase {
|
class WebHookServiceSpec extends FunSuite with ServiceSpecBase {
|
||||||
lazy val service = new WebHookPullRequestService with AccountService with RepositoryService with PullRequestService with IssuesService with CommitsService
|
lazy val service = new WebHookPullRequestService with AccountService with RepositoryService with PullRequestService
|
||||||
|
with IssuesService with CommitsService with LabelsService with MilestonesService with PrioritiesService
|
||||||
|
|
||||||
test("WebHookPullRequestService.getPullRequestsByRequestForWebhook") { withTestDB { implicit session =>
|
test("WebHookPullRequestService.getPullRequestsByRequestForWebhook") { withTestDB { implicit session =>
|
||||||
val user1 = generateNewUserWithDBRepository("user1","repo1")
|
val user1 = generateNewUserWithDBRepository("user1","repo1")
|
||||||
|
|||||||
Reference in New Issue
Block a user