adding support for wiki page deletion recording (#2537)

This commit is contained in:
James Yoo
2020-09-05 00:15:43 -07:00
committed by GitHub
parent 4d70b056ad
commit 73d05aefad
3 changed files with 60 additions and 29 deletions

View File

@@ -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")

View File

@@ -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
)
}

View File

@@ -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 {