diff --git a/project/build.scala b/project/build.scala index 856771b..f6a4b0f 100644 --- a/project/build.scala +++ b/project/build.scala @@ -36,6 +36,7 @@ "org.pegdown" % "pegdown" % "1.3.0", "org.apache.commons" % "commons-compress" % "1.5", "org.apache.commons" % "commons-email" % "1.3.1", + "org.apache.httpcomponents" % "httpclient" % "4.2.5", "com.typesafe.slick" %% "slick" % "1.0.1", "com.novell.ldap" % "jldap" % "2009-10-07", "com.h2database" % "h2" % "1.3.171", diff --git a/src/main/scala/service/WebHookService.scala b/src/main/scala/service/WebHookService.scala index 08d1035..d7e6bd3 100644 --- a/src/main/scala/service/WebHookService.scala +++ b/src/main/scala/service/WebHookService.scala @@ -17,13 +17,28 @@ def deleteWebHookURL(owner: String, repository: String, url :String): Unit = 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.jackson.Serialization 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) - 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 @@ object WebHookService { case class WebHookPayload( - before: String, - after: String, ref: String, commits: List[WebHookCommit], repository: WebHookRepository) @@ -50,9 +63,7 @@ case class WebHookRepository( name: String, url: String, - pledgie: String, description: String, - homepage: String, watchers: Int, forks: Int, `private`: Boolean, diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index 2c15806..b2af6ea 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -12,6 +12,8 @@ import util.{JGitUtil, Directory} import service._ import WebHookService._ +import org.eclipse.jgit.diff.DiffEntry +import org.apache.http.client.methods.HttpPost /** * Provides Git repository via HTTP. @@ -57,20 +59,22 @@ logger.debug("requestURI: " + request.getRequestURI) logger.debug("userName:" + userName) - val paths = request.getRequestURI.substring(request.getContextPath.length).split("/") + val paths = request.getRequestURI.substring(request.getContextPath.length).split("/") val owner = paths(2) val repository = paths(3).replaceFirst("\\.git$", "") - - logger.debug("repository:" + owner + "/" + repository) + val baseURL = request.getRequestURL.toString.replaceFirst("/git/", "/").replaceFirst("\\.git/.*$", "") - receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, userName)) + logger.debug("repository:" + owner + "/" + repository) + logger.debug("baseURL:" + baseURL) + + receivePack.setPostReceiveHook(new CommitLogHook(owner, repository, userName, baseURL)) receivePack } } 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 { private val logger = LoggerFactory.getLogger(classOf[CommitLogHook]) @@ -112,22 +116,24 @@ } } - // TODO call web hook + // call web hook val repositoryInfo = getRepository(owner, repository, "").get val repositoryOwner = getAccountByUserName(owner) + val payload = WebHookPayload( - before = "", - after = "", - ref = "", + ref = command.getRefName, commits = newCommits.map { commit => + val diffs = JGitUtil.getDiffs(git, commit.id, false) + WebHookCommit( id = commit.id, message = commit.fullMessage, timestamp = commit.time.toString, - url = "", - added = Nil, - removed = Nil, - modified = Nil, + url = baseURL + "/commit/" + commit.id, + added = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.ADD) => x.newPath }, + removed = diffs._1.collect { case x if(x.changeType == DiffEntry.ChangeType.DELETE) => x.oldPath }, + modified = diffs._1.collect { case x if(x.changeType != DiffEntry.ChangeType.ADD && + x.changeType != DiffEntry.ChangeType.DELETE) => x.newPath }, author = WebHookUser( name = commit.committer, email = commit.mailAddress @@ -136,10 +142,8 @@ }.toList, repository = WebHookRepository( name = repositoryInfo.name, - url = "", - pledgie = "", + url = baseURL, description = repositoryInfo.repository.description.getOrElse(""), - homepage = "", watchers = 0, forks = repositoryInfo.forkedCount, `private` = repositoryInfo.repository.isPrivate, @@ -150,8 +154,7 @@ ) ) - // TODO invoke WebHookService - sendWebHook(payload) + callWebHook(owner, repository, payload) } } // update repository last modified time.