mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-07 05:55:51 +01:00
(refs #4)Implementing activity recording for git push.
This commit is contained in:
@@ -25,50 +25,76 @@ trait ActivityService {
|
|||||||
def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit =
|
def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"create_repository",
|
"create_repository",
|
||||||
"[[%s]] created [[%s/%s]]".format(activityUserName, userName, repositoryName),
|
s"[user:${activityUserName}] created [repo:${userName}/${repositoryName}]",
|
||||||
None,
|
None,
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordCreateIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"open_issue",
|
"open_issue",
|
||||||
"[[%s]] opened issue [[%s/%s#%d]]".format(activityUserName, userName, repositoryName, issueId),
|
s"[user:${activityUserName}] opened issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordCloseIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"close_issue",
|
"close_issue",
|
||||||
"[[%s]] closed issue [[%s/%s#%d]]".format(activityUserName, userName, repositoryName, issueId),
|
s"[user:${activityUserName}] closed issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
def recordReopenIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, title: String): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"reopen_issue",
|
"reopen_issue",
|
||||||
"[[%s]] closed reopened [[%s/%s#%d]]".format(activityUserName, userName, repositoryName, issueId),
|
s"[user:${activityUserName}] closed reopened [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(title),
|
Some(title),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit =
|
def recordCommentIssueActivity(userName: String, repositoryName: String, activityUserName: String, issueId: Int, comment: String): Unit =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"comment_issue",
|
"comment_issue",
|
||||||
"[[%s]] commented on issue [[%s/%s#%d]]".format(activityUserName, userName, repositoryName, issueId),
|
s"[user:${activityUserName}] commented on issue [issue:${userName}/${repositoryName}#${issueId}]",
|
||||||
Some(comment),
|
Some(cut(comment, 200)),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) =
|
def recordCreateWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"create_wiki",
|
"create_wiki",
|
||||||
"[[%s]] created the [[%s/%s]] wiki".format(activityUserName, userName, repositoryName),
|
s"[user:${activityUserName}] created the [repo:${userName}/${repositoryName}] wiki",
|
||||||
Some(pageName),
|
Some(pageName),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) =
|
def recordEditWikiPageActivity(userName: String, repositoryName: String, activityUserName: String, pageName: String) =
|
||||||
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
"edit_wiki",
|
"edit_wiki",
|
||||||
"[[%s]] edited the [[%s/%s]] wiki".format(activityUserName, userName, repositoryName),
|
s"[user:${activityUserName}] edited the [repo:${userName}/${repositoryName}] wiki",
|
||||||
Some(pageName),
|
Some(pageName),
|
||||||
currentDate)
|
currentDate)
|
||||||
|
|
||||||
|
def recordPushActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
|
branchName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
||||||
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
|
"push",
|
||||||
|
s"[user:${activityUserName}] pushed to [branch:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
||||||
|
Some(commits.map { commit => commit.id + ":" + commit.shortMessage }.mkString("\n")),
|
||||||
|
currentDate)
|
||||||
|
|
||||||
|
def recordCreateTagActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
|
tagName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
||||||
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
|
"create_tag",
|
||||||
|
s"[user:${activityUserName}] created tag [tag:${userName}/${repositoryName}#${tagName}] at [repo:${userName}/${repositoryName}]",
|
||||||
|
None,
|
||||||
|
currentDate)
|
||||||
|
|
||||||
|
def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String,
|
||||||
|
branchName: String, commits: List[util.JGitUtil.CommitInfo]) =
|
||||||
|
Activities.autoInc insert(userName, repositoryName, activityUserName,
|
||||||
|
"create_tag",
|
||||||
|
s"[user:${activityUserName}] created branch [tag:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]",
|
||||||
|
None,
|
||||||
|
currentDate)
|
||||||
|
|
||||||
|
private def cut(value: String, length: Int): String =
|
||||||
|
if(value.length > length) value.substring(0, length) + "..." else value
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class GitBucketReceivePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
|
|
||||||
override def create(request: HttpServletRequest, db: Repository): ReceivePack = {
|
override def create(request: HttpServletRequest, db: Repository): ReceivePack = {
|
||||||
val receivePack = new ReceivePack(db)
|
val receivePack = new ReceivePack(db)
|
||||||
val userName = request.getAttribute("USER_NAME")
|
val userName = request.getAttribute("USER_NAME").asInstanceOf[String]
|
||||||
|
|
||||||
logger.debug("requestURI: " + request.getRequestURI)
|
logger.debug("requestURI: " + request.getRequestURI)
|
||||||
logger.debug("userName:" + userName)
|
logger.debug("userName:" + userName)
|
||||||
@@ -60,29 +60,54 @@ class GitBucketReceivePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
|
|
||||||
logger.debug("repository:" + owner + "/" + repository)
|
logger.debug("repository:" + owner + "/" + repository)
|
||||||
|
|
||||||
receivePack.setPostReceiveHook(new CommitLogHook(owner, repository))
|
receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, userName))
|
||||||
receivePack
|
receivePack
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
|
|
||||||
class CommitLogHook(owner: String, repository: String) extends PostReceiveHook
|
class CommitLogHook(owner: String, repository: String, userName: String) extends PostReceiveHook
|
||||||
with RepositoryService with AccountService with IssuesService {
|
with RepositoryService with AccountService with IssuesService with ActivityService {
|
||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
||||||
|
|
||||||
def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = {
|
def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = {
|
||||||
JGitUtil.withGit(Directory.getRepositoryDir(owner, repository)) { git =>
|
JGitUtil.withGit(Directory.getRepositoryDir(owner, repository)) { git =>
|
||||||
commands.asScala.foreach { command =>
|
commands.asScala.foreach { command =>
|
||||||
JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name).foreach { commit =>
|
val commits = JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name)
|
||||||
"(^|\\W)#(\\d+)(\\W|$)".r.findAllIn(commit.fullMessage).matchData.foreach { matchData =>
|
.filter(commit => JGitUtil.getBranchesOfCommit(git, commit.id).length == 1)
|
||||||
val issueId = matchData.group(2)
|
val refName = command.getRefName.split("/")
|
||||||
if(getAccountByUserName(commit.committer).isDefined && getIssue(owner, repository, issueId).isDefined){
|
|
||||||
createComment(owner, repository, commit.committer, issueId.toInt, commit.fullMessage, None)
|
println("****************************")
|
||||||
|
println(command.getRefName)
|
||||||
|
println(command.getMessage)
|
||||||
|
println(command.getResult)
|
||||||
|
println(command.getType)
|
||||||
|
println("****************************")
|
||||||
|
|
||||||
|
// apply issue comment
|
||||||
|
if(refName(1) == "heads"){
|
||||||
|
commits.foreach { commit =>
|
||||||
|
"(^|\\W)#(\\d+)(\\W|$)".r.findAllIn(commit.fullMessage).matchData.foreach { matchData =>
|
||||||
|
val issueId = matchData.group(2)
|
||||||
|
if(getAccountByUserName(commit.committer).isDefined && getIssue(owner, repository, issueId).isDefined){
|
||||||
|
createComment(owner, repository, commit.committer, issueId.toInt, commit.fullMessage, None)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
git.getRepository.getAllRefs.asScala.map { e =>
|
||||||
|
println(e._1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// record activity
|
||||||
|
if(refName(1) == "heads"){
|
||||||
|
recordPushActivity(owner, repository, userName, refName(2), commits)
|
||||||
|
} else if(refName(1) == "tags"){
|
||||||
|
recordCreateTagActivity(owner, repository, userName, refName(2), commits)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update repository last modified time.
|
// update repository last modified time.
|
||||||
|
|||||||
@@ -34,10 +34,14 @@ object helpers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def activityMessage(message: String)(implicit context: app.Context): Html = {
|
def activityMessage(message: String)(implicit context: app.Context): Html = {
|
||||||
|
val a = s"a $message aa $$1 a"
|
||||||
|
|
||||||
Html(message
|
Html(message
|
||||||
.replaceAll("\\[\\[([^\\s]+?)/([^\\s]+?)#((\\d+))\\]\\]", "<a href=\"%s/$1/$2/issues/$3\">$1/$2#$3</a>".format(context.path))
|
.replaceAll("\\[issue:([^\\s]+?)/([^\\s]+?)#((\\d+))\\]" , s"""<a href="${context.path}/$$1/$$2/issues/$$3">$$1/$$2#$$3</a>""")
|
||||||
.replaceAll("\\[\\[([^\\s]+?)/([^\\s]+?)\\]\\]", "<a href=\"%s/$1/$2\">$1/$2</a>".format(context.path))
|
.replaceAll("\\[repo:([^\\s]+?)/([^\\s]+?)\\]" , s"""<a href="${context.path}/$$1/$$2\">$$1/$$2</a>""")
|
||||||
.replaceAll("\\[\\[([^\\s]+?)\\]\\]", "<a href=\"%s/$1\">$1</a>".format(context.path))
|
.replaceAll("\\[branch:([^\\s]+?)/([^\\s]+?)#([^\\s]+?)\\]", s"""<a href="${context.path}/$$1/$$2/tree/$$3">$$3</a>""")
|
||||||
|
.replaceAll("\\[tag:([^\\s]+?)/([^\\s]+?)#([^\\s]+?)\\]" , s"""<a href="${context.path}/$$1/$$2/tree/$$3">$$3</a>""")
|
||||||
|
.replaceAll("\\[user:([^\\s]+?)\\]" , s"""<a href="${context.path}/$$1">$$1</a>""")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,16 @@
|
|||||||
case "edit_wiki" => {
|
case "edit_wiki" => {
|
||||||
<div>Edited <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
|
<div>Edited <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
|
||||||
}
|
}
|
||||||
|
case "push" => {
|
||||||
|
<div>
|
||||||
|
{additionalInfo.split("\n").map{ commit =>
|
||||||
|
<div>
|
||||||
|
<a href={"%s/%s/%s/commit/%s".format(path, activity.userName, activity.repositoryName, commit.substring(0, 40))} class="monospace">{commit.substring(0, 7)}</a>
|
||||||
|
<span>{commit.substring(41)}</span>
|
||||||
|
</div>
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
case _ => {
|
case _ => {
|
||||||
<div>{additionalInfo}</div>
|
<div>{additionalInfo}</div>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user