mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-11 07:55:55 +01:00
adding support for wiki page deletion recording (#2537)
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
package gitbucket.core.controller
|
package gitbucket.core.controller
|
||||||
|
|
||||||
import gitbucket.core.model.WebHook
|
import gitbucket.core.model.WebHook
|
||||||
import gitbucket.core.model.activity.{CreateWikiPageInfo, EditWikiPageInfo}
|
import gitbucket.core.model.activity.{CreateWikiPageInfo, DeleteWikiInfo, EditWikiPageInfo}
|
||||||
import gitbucket.core.service.RepositoryService.RepositoryInfo
|
import gitbucket.core.service.RepositoryService.RepositoryInfo
|
||||||
import gitbucket.core.service.WebHookService.WebHookGollumPayload
|
import gitbucket.core.service.WebHookService.WebHookGollumPayload
|
||||||
import gitbucket.core.wiki.html
|
import gitbucket.core.wiki.html
|
||||||
@@ -251,14 +251,13 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
val pageName = StringUtil.urlDecode(params("page"))
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
|
|
||||||
defining(context.loginAccount.get) { loginAccount =>
|
defining(context.loginAccount.get) { loginAccount =>
|
||||||
deleteWikiPage(
|
val deleteWikiInfo = DeleteWikiInfo(
|
||||||
repository.owner,
|
repository.owner,
|
||||||
repository.name,
|
repository.name,
|
||||||
pageName,
|
loginAccount.userName,
|
||||||
loginAccount.fullName,
|
pageName
|
||||||
loginAccount.mailAddress,
|
|
||||||
s"Destroyed ${pageName}"
|
|
||||||
)
|
)
|
||||||
|
recordActivity(deleteWikiInfo)
|
||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
|
|
||||||
redirect(s"/${repository.owner}/${repository.name}/wiki")
|
redirect(s"/${repository.owner}/${repository.name}/wiki")
|
||||||
|
|||||||
@@ -45,3 +45,23 @@ final case class EditWikiPageInfo(
|
|||||||
UUID.randomUUID().toString
|
UUID.randomUUID().toString
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final case class DeleteWikiInfo(
|
||||||
|
userName: String,
|
||||||
|
repositoryName: String,
|
||||||
|
activityUserName: String,
|
||||||
|
pageName: String,
|
||||||
|
) extends BaseActivityInfo {
|
||||||
|
|
||||||
|
override def toActivity: Activity =
|
||||||
|
Activity(
|
||||||
|
userName,
|
||||||
|
repositoryName,
|
||||||
|
activityUserName,
|
||||||
|
"delete_wiki",
|
||||||
|
s"[user:$activityUserName] deleted the page [$pageName] in the [repo:$userName/$repositoryName] wiki",
|
||||||
|
additionalInfo = None,
|
||||||
|
currentDate,
|
||||||
|
UUID.randomUUID().toString
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,15 +16,18 @@ import gitbucket.core.util.Implicits._
|
|||||||
import gitbucket.core.util._
|
import gitbucket.core.util._
|
||||||
import gitbucket.core.model.Profile.profile.blockingApi._
|
import gitbucket.core.model.Profile.profile.blockingApi._
|
||||||
import gitbucket.core.model.activity.{
|
import gitbucket.core.model.activity.{
|
||||||
|
BaseActivityInfo,
|
||||||
CloseIssueInfo,
|
CloseIssueInfo,
|
||||||
CreateBranchInfo,
|
CreateBranchInfo,
|
||||||
CreateTagInfo,
|
CreateTagInfo,
|
||||||
CreateWikiPageInfo,
|
CreateWikiPageInfo,
|
||||||
DeleteBranchInfo,
|
DeleteBranchInfo,
|
||||||
DeleteTagInfo,
|
DeleteTagInfo,
|
||||||
|
DeleteWikiInfo,
|
||||||
EditWikiPageInfo,
|
EditWikiPageInfo,
|
||||||
PushInfo
|
PushInfo
|
||||||
}
|
}
|
||||||
|
import gitbucket.core.util.JGitUtil.CommitInfo
|
||||||
// Imported names have higher precedence than names, defined in other files.
|
// Imported names have higher precedence than names, defined in other files.
|
||||||
// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above.
|
// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above.
|
||||||
import gitbucket.core.servlet.Database
|
import gitbucket.core.servlet.Database
|
||||||
@@ -483,39 +486,22 @@ class WikiCommitHook(owner: String, repository: String, pusher: String, baseUrl:
|
|||||||
val diffs = JGitUtil.getDiffs(git, None, commit.id, false, false)
|
val diffs = JGitUtil.getDiffs(git, None, commit.id, false, false)
|
||||||
diffs.collect {
|
diffs.collect {
|
||||||
case diff if diff.newPath.toLowerCase.endsWith(".md") =>
|
case diff if diff.newPath.toLowerCase.endsWith(".md") =>
|
||||||
val action = if (diff.changeType == ChangeType.ADD) "created" else "edited"
|
val action = mapToAction(diff.changeType)
|
||||||
val fileName = diff.newPath
|
val fileName = diff.newPath
|
||||||
updateLastActivityDate(owner, repository)
|
updateLastActivityDate(owner, repository)
|
||||||
action match {
|
buildWikiRecord(action, owner, repository, commit, fileName).foreach(recordActivity)
|
||||||
case "created" =>
|
|
||||||
val createWikiPageInfo = CreateWikiPageInfo(
|
|
||||||
owner,
|
|
||||||
repository,
|
|
||||||
commit.committerName,
|
|
||||||
fileName.dropRight(".md".length)
|
|
||||||
)
|
|
||||||
recordActivity(createWikiPageInfo)
|
|
||||||
case "edited" =>
|
|
||||||
val editWikiPageInfo = EditWikiPageInfo(
|
|
||||||
owner,
|
|
||||||
repository,
|
|
||||||
commit.committerName,
|
|
||||||
fileName.dropRight(".md".length),
|
|
||||||
commit.id
|
|
||||||
)
|
|
||||||
recordActivity(editWikiPageInfo)
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
(action, fileName, commit.id)
|
(action, fileName, commit.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val pages = commits
|
val pages = commits
|
||||||
.groupBy { case (action, fileName, commitId) => fileName }
|
.groupBy { case (_, fileName, _) => fileName }
|
||||||
.map {
|
.map {
|
||||||
case (fileName, commits) =>
|
case (fileName, commits) =>
|
||||||
(commits.head._1, fileName, commits.last._3)
|
val (commitHeadAction, _, _) = commits.head
|
||||||
|
val (_, _, commitLastId) = commits.last
|
||||||
|
(commitHeadAction, fileName, commitLastId)
|
||||||
}
|
}
|
||||||
|
|
||||||
callWebHookOf(owner, repository, WebHook.Gollum, settings) {
|
callWebHookOf(owner, repository, WebHook.Gollum, settings) {
|
||||||
@@ -538,6 +524,32 @@ class WikiCommitHook(owner: String, repository: String, pusher: String, baseUrl:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private[this] def mapToAction(changeType: ChangeType): String = changeType match {
|
||||||
|
case ChangeType.ADD | ChangeType.RENAME => "created"
|
||||||
|
case ChangeType.MODIFY => "edited"
|
||||||
|
case ChangeType.DELETE => "deleted"
|
||||||
|
case other =>
|
||||||
|
logger.error(s"Unsupported Wiki action: $other")
|
||||||
|
"unsupported action"
|
||||||
|
}
|
||||||
|
|
||||||
|
private[this] def buildWikiRecord(
|
||||||
|
action: String,
|
||||||
|
owner: String,
|
||||||
|
repo: String,
|
||||||
|
commit: CommitInfo,
|
||||||
|
fileName: String
|
||||||
|
): Option[BaseActivityInfo] = {
|
||||||
|
val pageName = fileName.dropRight(".md".length)
|
||||||
|
action match {
|
||||||
|
case "created" => Some(CreateWikiPageInfo(owner, repo, commit.committerName, pageName))
|
||||||
|
case "edited" => Some(EditWikiPageInfo(owner, repo, commit.committerName, pageName, commit.id))
|
||||||
|
case "deleted" => Some(DeleteWikiInfo(owner, repo, commit.committerName, pageName))
|
||||||
|
case other =>
|
||||||
|
logger.info(s"Attempted to build wiki record for unsupported action: $other")
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object GitLfs {
|
object GitLfs {
|
||||||
|
|||||||
Reference in New Issue
Block a user