mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 21:45:50 +01:00
(refs #74)Web hook is completed.
This commit is contained in:
@@ -36,6 +36,7 @@ object MyBuild extends Build {
|
|||||||
"org.pegdown" % "pegdown" % "1.3.0",
|
"org.pegdown" % "pegdown" % "1.3.0",
|
||||||
"org.apache.commons" % "commons-compress" % "1.5",
|
"org.apache.commons" % "commons-compress" % "1.5",
|
||||||
"org.apache.commons" % "commons-email" % "1.3.1",
|
"org.apache.commons" % "commons-email" % "1.3.1",
|
||||||
|
"org.apache.httpcomponents" % "httpclient" % "4.2.5",
|
||||||
"com.typesafe.slick" %% "slick" % "1.0.1",
|
"com.typesafe.slick" %% "slick" % "1.0.1",
|
||||||
"com.novell.ldap" % "jldap" % "2009-10-07",
|
"com.novell.ldap" % "jldap" % "2009-10-07",
|
||||||
"com.h2database" % "h2" % "1.3.171",
|
"com.h2database" % "h2" % "1.3.171",
|
||||||
|
|||||||
@@ -17,13 +17,28 @@ trait WebHookService {
|
|||||||
def deleteWebHookURL(owner: String, repository: String, url :String): Unit =
|
def deleteWebHookURL(owner: String, repository: String, url :String): Unit =
|
||||||
Query(WebHooks).filter(_.byPrimaryKey(owner, repository, url)).delete
|
Query(WebHooks).filter(_.byPrimaryKey(owner, repository, url)).delete
|
||||||
|
|
||||||
def sendWebHook(payload: WebHookPayload): Unit = {
|
def callWebHook(owner: String, repository: String, payload: WebHookPayload): Unit = {
|
||||||
import org.json4s._
|
import org.json4s._
|
||||||
import org.json4s.jackson.Serialization
|
import org.json4s.jackson.Serialization
|
||||||
import org.json4s.jackson.Serialization.{read, write}
|
import org.json4s.jackson.Serialization.{read, write}
|
||||||
|
import org.apache.http.client.methods.HttpPost
|
||||||
|
import org.apache.http.impl.client.DefaultHttpClient
|
||||||
|
|
||||||
implicit val formats = Serialization.formats(NoTypeHints)
|
implicit val formats = Serialization.formats(NoTypeHints)
|
||||||
|
|
||||||
println(write(payload))
|
val webHookURLs = getWebHookURLs(owner, repository)
|
||||||
|
|
||||||
|
if(webHookURLs.nonEmpty){
|
||||||
|
val json = write(payload)
|
||||||
|
val httpClient = new DefaultHttpClient()
|
||||||
|
|
||||||
|
webHookURLs.foreach { webHookUrl =>
|
||||||
|
val httpPost = new HttpPost(webHookUrl.url)
|
||||||
|
httpPost.getParams.setParameter("payload", json)
|
||||||
|
httpClient.execute(httpPost)
|
||||||
|
httpPost.releaseConnection()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -31,8 +46,6 @@ trait WebHookService {
|
|||||||
object WebHookService {
|
object WebHookService {
|
||||||
|
|
||||||
case class WebHookPayload(
|
case class WebHookPayload(
|
||||||
before: String,
|
|
||||||
after: String,
|
|
||||||
ref: String,
|
ref: String,
|
||||||
commits: List[WebHookCommit],
|
commits: List[WebHookCommit],
|
||||||
repository: WebHookRepository)
|
repository: WebHookRepository)
|
||||||
@@ -50,9 +63,7 @@ object WebHookService {
|
|||||||
case class WebHookRepository(
|
case class WebHookRepository(
|
||||||
name: String,
|
name: String,
|
||||||
url: String,
|
url: String,
|
||||||
pledgie: String,
|
|
||||||
description: String,
|
description: String,
|
||||||
homepage: String,
|
|
||||||
watchers: Int,
|
watchers: Int,
|
||||||
forks: Int,
|
forks: Int,
|
||||||
`private`: Boolean,
|
`private`: Boolean,
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import javax.servlet.http.HttpServletRequest
|
|||||||
import util.{JGitUtil, Directory}
|
import util.{JGitUtil, Directory}
|
||||||
import service._
|
import service._
|
||||||
import WebHookService._
|
import WebHookService._
|
||||||
|
import org.eclipse.jgit.diff.DiffEntry
|
||||||
|
import org.apache.http.client.methods.HttpPost
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides Git repository via HTTP.
|
* Provides Git repository via HTTP.
|
||||||
@@ -60,17 +62,19 @@ class GitBucketReceivePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
val paths = request.getRequestURI.substring(request.getContextPath.length).split("/")
|
val paths = request.getRequestURI.substring(request.getContextPath.length).split("/")
|
||||||
val owner = paths(2)
|
val owner = paths(2)
|
||||||
val repository = paths(3).replaceFirst("\\.git$", "")
|
val repository = paths(3).replaceFirst("\\.git$", "")
|
||||||
|
val baseURL = request.getRequestURL.toString.replaceFirst("/git/", "/").replaceFirst("\\.git/.*$", "")
|
||||||
|
|
||||||
logger.debug("repository:" + owner + "/" + repository)
|
logger.debug("repository:" + owner + "/" + repository)
|
||||||
|
logger.debug("baseURL:" + baseURL)
|
||||||
|
|
||||||
receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, userName))
|
receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, userName, baseURL))
|
||||||
receivePack
|
receivePack
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
|
|
||||||
class CommitLogHook(owner: String, repository: String, userName: String) extends PostReceiveHook
|
class CommitLogHook(owner: String, repository: String, userName: String, baseURL: String) extends PostReceiveHook
|
||||||
with RepositoryService with AccountService with IssuesService with ActivityService with WebHookService {
|
with RepositoryService with AccountService with IssuesService with ActivityService with WebHookService {
|
||||||
|
|
||||||
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
private val logger = LoggerFactory.getLogger(classOf[CommitLogHook])
|
||||||
@@ -112,22 +116,24 @@ class CommitLogHook(owner: String, repository: String, userName: String) extends
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO call web hook
|
// call web hook
|
||||||
val repositoryInfo = getRepository(owner, repository, "").get
|
val repositoryInfo = getRepository(owner, repository, "").get
|
||||||
val repositoryOwner = getAccountByUserName(owner)
|
val repositoryOwner = getAccountByUserName(owner)
|
||||||
|
|
||||||
val payload = WebHookPayload(
|
val payload = WebHookPayload(
|
||||||
before = "",
|
ref = command.getRefName,
|
||||||
after = "",
|
|
||||||
ref = "",
|
|
||||||
commits = newCommits.map { commit =>
|
commits = newCommits.map { commit =>
|
||||||
|
val diffs = JGitUtil.getDiffs(git, commit.id, false)
|
||||||
|
|
||||||
WebHookCommit(
|
WebHookCommit(
|
||||||
id = commit.id,
|
id = commit.id,
|
||||||
message = commit.fullMessage,
|
message = commit.fullMessage,
|
||||||
timestamp = commit.time.toString,
|
timestamp = commit.time.toString,
|
||||||
url = "",
|
url = baseURL + "/commit/" + commit.id,
|
||||||
added = Nil,
|
added = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.ADD) => x.newPath },
|
||||||
removed = Nil,
|
removed = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.DELETE) => x.oldPath },
|
||||||
modified = Nil,
|
modified = diffs._1.collect { case x if(x.changeType != DiffEntry.ChangeType.ADD &&
|
||||||
|
x.changeType != DiffEntry.ChangeType.DELETE) => x.newPath },
|
||||||
author = WebHookUser(
|
author = WebHookUser(
|
||||||
name = commit.committer,
|
name = commit.committer,
|
||||||
email = commit.mailAddress
|
email = commit.mailAddress
|
||||||
@@ -136,10 +142,8 @@ class CommitLogHook(owner: String, repository: String, userName: String) extends
|
|||||||
}.toList,
|
}.toList,
|
||||||
repository = WebHookRepository(
|
repository = WebHookRepository(
|
||||||
name = repositoryInfo.name,
|
name = repositoryInfo.name,
|
||||||
url = "",
|
url = baseURL,
|
||||||
pledgie = "",
|
|
||||||
description = repositoryInfo.repository.description.getOrElse(""),
|
description = repositoryInfo.repository.description.getOrElse(""),
|
||||||
homepage = "",
|
|
||||||
watchers = 0,
|
watchers = 0,
|
||||||
forks = repositoryInfo.forkedCount,
|
forks = repositoryInfo.forkedCount,
|
||||||
`private` = repositoryInfo.repository.isPrivate,
|
`private` = repositoryInfo.repository.isPrivate,
|
||||||
@@ -150,8 +154,7 @@ class CommitLogHook(owner: String, repository: String, userName: String) extends
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO invoke WebHookService
|
callWebHook(owner, repository, payload)
|
||||||
sendWebHook(payload)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update repository last modified time.
|
// update repository last modified time.
|
||||||
|
|||||||
Reference in New Issue
Block a user