diff --git a/src/main/scala/app/RepositorySettingsController.scala b/src/main/scala/app/RepositorySettingsController.scala index f2447e3..b6a1369 100644 --- a/src/main/scala/app/RepositorySettingsController.scala +++ b/src/main/scala/app/RepositorySettingsController.scala @@ -2,10 +2,15 @@ import service._ import util.Directory._ -import util.{UsersAuthenticator, OwnerAuthenticator} +import util.{JGitUtil, UsersAuthenticator, OwnerAuthenticator} import jp.sf.amateras.scalatra.forms._ import org.apache.commons.io.FileUtils import org.scalatra.FlashMapSupport +import service.WebHookService.{WebHookRepository, WebHookUser, WebHookCommit, WebHookPayload} +import org.eclipse.jgit.diff.DiffEntry +import scala.collection.mutable.ListBuffer +import org.eclipse.jgit.revwalk.RevCommit +import util.JGitUtil.CommitInfo class RepositorySettingsController extends RepositorySettingsControllerBase with RepositoryService with AccountService with WebHookService @@ -103,7 +108,7 @@ * Display the web hook page. */ get("/:owner/:repository/settings/hooks")(ownerOnly { repository => - settings.html.hooks(getWebHookURLs(repository.owner, repository.name), repository) + settings.html.hooks(getWebHookURLs(repository.owner, repository.name), repository, flash.get("info")) }) /** @@ -124,6 +129,42 @@ }) /** + * Send the test request to registered web hook URLs. + */ + get("/:owner/:repository/settings/hooks/test")(ownerOnly { repository => + JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git => + // TODO Retrieve only specified branch logs. + val i = git.log.setMaxCount(3).call.iterator + // TODO Don't use ListBuffer!!!! + val list = new ListBuffer[CommitInfo]() + while(i.hasNext){ + val commit = i.next + list.append(new CommitInfo(commit)) + } + + val payload = new WebHookPayload( + git, + "refs/heads/" + repository.repository.defaultBranch, + repository, + list.toList, + getAccountByUserName(repository.owner).get) + + callWebHook(repository.owner, repository.name, payload) + flash += "info" -> "Test payload deployed!" + } + redirect(s"/${repository.owner}/${repository.name}/settings/hooks") + }) + + get("/xxx/xxx/xxx/webhooktest"){ + println(params("payload")) + } + + post("/xxx/xxx/xxx/webhooktest"){ + println(params("payload")) + } + + + /** * Display the delete repository page. */ get("/:owner/:repository/settings/delete")(ownerOnly { diff --git a/src/main/scala/service/WebHookService.scala b/src/main/scala/service/WebHookService.scala index f6ded00..9d68855 100644 --- a/src/main/scala/service/WebHookService.scala +++ b/src/main/scala/service/WebHookService.scala @@ -5,6 +5,15 @@ import model._ import org.slf4j.LoggerFactory +import service.RepositoryService.RepositoryInfo +import util.JGitUtil +import org.eclipse.jgit.diff.DiffEntry +import util.JGitUtil.CommitInfo +import org.eclipse.jgit.api.Git +import org.apache.http.message.BasicNameValuePair +import org.apache.http.client.entity.UrlEncodedFormEntity +import org.apache.http.protocol.HTTP +import org.apache.http.NameValuePair trait WebHookService { import WebHookService._ @@ -40,7 +49,11 @@ webHookURLs.foreach { webHookUrl => val f = future { val httpPost = new HttpPost(webHookUrl.url) - httpPost.getParams.setParameter("payload", json) + + val params: java.util.List[NameValuePair] = new java.util.ArrayList() + params.add(new BasicNameValuePair("payload", json)) + httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)) + httpClient.execute(httpPost) httpPost.releaseConnection() } @@ -61,7 +74,44 @@ case class WebHookPayload( ref: String, commits: List[WebHookCommit], - repository: WebHookRepository) + repository: WebHookRepository){ + + def this(git: Git, refName: String, repositoryInfo: RepositoryInfo, commits: List[CommitInfo], repositoryOwner: Account) = + this( + refName, + commits.map { commit => + val diffs = JGitUtil.getDiffs(git, commit.id, false) + val commitUrl = repositoryInfo.url.replaceFirst("/git/", "/").replaceFirst("\\.git$", "") + "/commit/" + commit.id + + WebHookCommit( + id = commit.id, + message = commit.fullMessage, + timestamp = commit.time.toString, + url = commitUrl, + 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 + ) + ) + }.toList, + WebHookRepository( + name = repositoryInfo.name, + url = repositoryInfo.url, + description = repositoryInfo.repository.description.getOrElse(""), + watchers = 0, + forks = repositoryInfo.forkedCount, + `private` = repositoryInfo.repository.isPrivate, + owner = WebHookUser( + name = repositoryOwner.userName, + email = repositoryOwner.mailAddress + ) + ) + ) + } case class WebHookCommit( id: String, diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index b2af6ea..06d1f7f 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -62,7 +62,7 @@ val paths = request.getRequestURI.substring(request.getContextPath.length).split("/") val owner = paths(2) val repository = paths(3).replaceFirst("\\.git$", "") - val baseURL = request.getRequestURL.toString.replaceFirst("/git/", "/").replaceFirst("\\.git/.*$", "") + val baseURL = request.getRequestURL.toString.replaceFirst("/git/.*", "") logger.debug("repository:" + owner + "/" + repository) logger.debug("baseURL:" + baseURL) @@ -116,43 +116,14 @@ } } + println(getRepository(owner, repository, baseURL).get.url) + // call web hook - val repositoryInfo = getRepository(owner, repository, "").get - val repositoryOwner = getAccountByUserName(owner) - - val payload = WebHookPayload( - 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 = 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 - ) - ) - }.toList, - repository = WebHookRepository( - name = repositoryInfo.name, - url = baseURL, - description = repositoryInfo.repository.description.getOrElse(""), - watchers = 0, - forks = repositoryInfo.forkedCount, - `private` = repositoryInfo.repository.isPrivate, - owner = WebHookUser( - name = repositoryOwner.get.userName, - email = repositoryOwner.get.mailAddress - ) - ) - ) + val payload = new WebHookPayload(git, + command.getRefName, + getRepository(owner, repository, baseURL).get, + newCommits, + getAccountByUserName(owner).get) callWebHook(owner, repository, payload) } diff --git a/src/main/twirl/settings/hooks.scala.html b/src/main/twirl/settings/hooks.scala.html index 2f132c8..739cb43 100644 --- a/src/main/twirl/settings/hooks.scala.html +++ b/src/main/twirl/settings/hooks.scala.html @@ -1,9 +1,10 @@ -@(webHooks: List[model.WebHook], repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) +@(webHooks: List[model.WebHook], repository: service.RepositoryService.RepositoryInfo, info: Option[Any])(implicit context: app.Context) @import context._ @import view.helpers._ @html.main("Settings", Some(repository)){ @html.header("settings", repository) @menu("hooks", repository){ + @helper.html.information(info)