(refs #74)Web hook is completed.

This commit is contained in:
takezoe
2013-09-14 17:14:37 +09:00
parent c1eccd391d
commit 36115734bb
3 changed files with 39 additions and 24 deletions

View File

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

View File

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

View File

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