mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-10 15:35:59 +01:00
adding support for wiki page deletion recording (#2537)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package gitbucket.core.controller
|
||||
|
||||
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.WebHookService.WebHookGollumPayload
|
||||
import gitbucket.core.wiki.html
|
||||
@@ -251,14 +251,13 @@ trait WikiControllerBase extends ControllerBase {
|
||||
val pageName = StringUtil.urlDecode(params("page"))
|
||||
|
||||
defining(context.loginAccount.get) { loginAccount =>
|
||||
deleteWikiPage(
|
||||
val deleteWikiInfo = DeleteWikiInfo(
|
||||
repository.owner,
|
||||
repository.name,
|
||||
pageName,
|
||||
loginAccount.fullName,
|
||||
loginAccount.mailAddress,
|
||||
s"Destroyed ${pageName}"
|
||||
loginAccount.userName,
|
||||
pageName
|
||||
)
|
||||
recordActivity(deleteWikiInfo)
|
||||
updateLastActivityDate(repository.owner, repository.name)
|
||||
|
||||
redirect(s"/${repository.owner}/${repository.name}/wiki")
|
||||
|
||||
@@ -45,3 +45,23 @@ final case class EditWikiPageInfo(
|
||||
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.model.Profile.profile.blockingApi._
|
||||
import gitbucket.core.model.activity.{
|
||||
BaseActivityInfo,
|
||||
CloseIssueInfo,
|
||||
CreateBranchInfo,
|
||||
CreateTagInfo,
|
||||
CreateWikiPageInfo,
|
||||
DeleteBranchInfo,
|
||||
DeleteTagInfo,
|
||||
DeleteWikiInfo,
|
||||
EditWikiPageInfo,
|
||||
PushInfo
|
||||
}
|
||||
import gitbucket.core.util.JGitUtil.CommitInfo
|
||||
// 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.
|
||||
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)
|
||||
diffs.collect {
|
||||
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
|
||||
updateLastActivityDate(owner, repository)
|
||||
action match {
|
||||
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 _ =>
|
||||
}
|
||||
buildWikiRecord(action, owner, repository, commit, fileName).foreach(recordActivity)
|
||||
(action, fileName, commit.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val pages = commits
|
||||
.groupBy { case (action, fileName, commitId) => fileName }
|
||||
.groupBy { case (_, fileName, _) => fileName }
|
||||
.map {
|
||||
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) {
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user