diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index cef3328..365fb92 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -70,11 +70,8 @@ val name = repository.name getPullRequest(owner, name, issueId) map { case(issue, pullreq) => using(Git.open(getRepositoryDir(owner, name))){ git => - // prepare head branch - val commitIdTo = fetchPullRequest(git, issueId, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch) - updateCommitIdTo(owner, name, issueId, commitIdTo) - - val (commits, diffs) = getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, commitIdTo) + val (commits, diffs) = + getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo) pulls.html.pullreq( issue, pullreq, @@ -446,20 +443,4 @@ hasWritePermission(owner, repoName, context.loginAccount)) } - /** - * Fetch pull request contents into refs/pull/${issueId}/head and return the head commit id of the pull request. - */ - private def fetchPullRequest(git: Git, issueId: Int, requestUserName: String, requestRepositoryName: String, requestBranch: String): String = { - try { - git.fetch - .setRemote(getRepositoryDir(requestUserName, requestRepositoryName).toURI.toString) - .setRefSpecs(new RefSpec(s"refs/heads/${requestBranch}:refs/pull/${issueId}/head").setForceUpdate(true)) - .call - } catch { - case ex: Exception => // ignore - } - git.getRepository.resolve(s"refs/pull/${issueId}/head").getName - } - - } diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index 5b41a76..7d11f08 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -46,6 +46,18 @@ commitIdFrom, commitIdTo)) + def getPullRequestsByRequest(userName: String, repositoryName: String, branch: String, closed: Boolean): List[PullRequest] = + Query(PullRequests) + .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } + .filter { case (t1, t2) => + (t1.requestUserName is userName.bind) && + (t1.requestRepositoryName is repositoryName.bind) && + (t1.requestBranch is branch.bind) && + (t2.closed is closed.bind) + } + .map { case (t1, t2) => t1 } + .list + } object PullRequestService { diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index 0068844..a00a928 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -78,7 +78,7 @@ import scala.collection.JavaConverters._ 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 PullRequestService with WebHookService { private val logger = LoggerFactory.getLogger(classOf[CommitLogHook]) @@ -130,6 +130,16 @@ } } + if(refName(1) == "heads"){ + command.getType match { + case ReceiveCommand.Type.CREATE | + ReceiveCommand.Type.UPDATE | + ReceiveCommand.Type.UPDATE_NONFASTFORWARD => + updatePullRequests(branchName) + case _ => + } + } + // call web hook val webHookURLs = getWebHookURLs(owner, repository) if(webHookURLs.nonEmpty){ @@ -158,4 +168,21 @@ } } + /** + * Fetch pull request contents into refs/pull/${issueId}/head and update pull request table. + */ + private def updatePullRequests(branch: String) = + getPullRequestsByRequest(owner, repository, branch, false).foreach { pullreq => + if(getRepository(pullreq.userName, pullreq.repositoryName, baseURL).isDefined){ + using(Git.open(Directory.getRepositoryDir(pullreq.userName, pullreq.repositoryName))){ git => + git.fetch + .setRemote(Directory.getRepositoryDir(owner, repository).toURI.toString) + .setRefSpecs(new RefSpec(s"refs/heads/${branch}:refs/pull/${pullreq.issueId}/head").setForceUpdate(true)) + .call + + val commitIdTo = git.getRepository.resolve(s"refs/pull/${pullreq.issueId}/head").getName + updateCommitIdTo(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo) + } + } + } }