diff --git a/src/main/scala/gitbucket/core/controller/WikiController.scala b/src/main/scala/gitbucket/core/controller/WikiController.scala index 25689e4..caeac7c 100644 --- a/src/main/scala/gitbucket/core/controller/WikiController.scala +++ b/src/main/scala/gitbucket/core/controller/WikiController.scala @@ -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 @@ 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") diff --git a/src/main/scala/gitbucket/core/model/activity/WikiActivityInfo.scala b/src/main/scala/gitbucket/core/model/activity/WikiActivityInfo.scala index 8d2bc4f..6b84a8c 100644 --- a/src/main/scala/gitbucket/core/model/activity/WikiActivityInfo.scala +++ b/src/main/scala/gitbucket/core/model/activity/WikiActivityInfo.scala @@ -45,3 +45,23 @@ 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 + ) +} diff --git a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala index 588b8d6..4972295 100644 --- a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala @@ -16,15 +16,18 @@ 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 @@ 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 @@ } } + 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 {