diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 00f6755..74fceae 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -21,7 +21,7 @@ class RepositoryViewerController extends RepositoryViewerControllerBase with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService - with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator + with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator with PullRequestService /** @@ -29,7 +29,7 @@ */ trait RepositoryViewerControllerBase extends ControllerBase { self: RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService - with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator => + with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator with PullRequestService => ArchiveCommand.registerFormat("zip", new ZipFormat) ArchiveCommand.registerFormat("tar.gz", new TgzFormat) @@ -496,6 +496,9 @@ //refUpdate.setRefLogMessage("merged", true) refUpdate.update() + // update pull request + updatePullRequests(repository.owner, repository.name, branch) + // record activity recordPushActivity(repository.owner, repository.name, loginAccount.userName, branch, List(new CommitInfo(JGitUtil.getRevCommitFromId(git, commitId)))) diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index 9a3239b..68121f9 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -3,6 +3,7 @@ import model.Profile._ import profile.simple._ import model.{PullRequest, Issue} +import util.JGitUtil trait PullRequestService { self: IssuesService => import PullRequestService._ @@ -81,6 +82,18 @@ .map { case (t1, t2) => t1 } .list + /** + * Fetch pull request contents into refs/pull/${issueId}/head and update pull request table. + */ + def updatePullRequests(owner: String, repository: String, branch: String)(implicit s: Session): Unit = + getPullRequestsByRequest(owner, repository, branch, false).foreach { pullreq => + if(Repositories.filter(_.byRepository(pullreq.userName, pullreq.repositoryName)).exists.run){ + val (commitIdTo, commitIdFrom) = JGitUtil.updatePullRequest( + pullreq.userName, pullreq.repositoryName, pullreq.branch, pullreq.issueId, + pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch) + updateCommitId(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo, commitIdFrom) + } + } } object PullRequestService { diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index df55d46..7fde407 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -174,7 +174,7 @@ case ReceiveCommand.Type.CREATE | ReceiveCommand.Type.UPDATE | ReceiveCommand.Type.UPDATE_NONFASTFORWARD => - updatePullRequests(branchName) + updatePullRequests(owner, repository, branchName) case _ => } } @@ -211,26 +211,4 @@ } } } - - /** - * 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.open(Directory.getRepositoryDir(pullreq.requestUserName, pullreq.requestRepositoryName))){ (oldGit, newGit) => - oldGit.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 = oldGit.getRepository.resolve(s"refs/pull/${pullreq.issueId}/head").getName - val commitIdFrom = JGitUtil.getForkedCommitId(oldGit, newGit, - pullreq.userName, pullreq.repositoryName, pullreq.branch, - pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch) - updateCommitId(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo, commitIdFrom) - } - } - } } diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index b5e2e3b..0f76f1e 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -13,6 +13,7 @@ import org.eclipse.jgit.treewalk.filter._ import org.eclipse.jgit.diff.DiffEntry.ChangeType import org.eclipse.jgit.errors.{ConfigInvalidException, MissingObjectException} +import org.eclipse.jgit.transport.RefSpec import java.util.Date import org.eclipse.jgit.api.errors.{JGitInternalException, InvalidRefNameException, RefAlreadyExistsException, NoHeadException} import service.RepositoryService @@ -675,6 +676,25 @@ } /** + * Fetch pull request contents into refs/pull/${issueId}/head and return (commitIdTo, commitIdFrom) + */ + def updatePullRequest(userName: String, repositoryName:String, branch: String, issueId: Int, + requestUserName: String, requestRepositoryName: String, requestBranch: String):(String, String) = + using(Git.open(Directory.getRepositoryDir(userName, repositoryName)), + Git.open(Directory.getRepositoryDir(requestUserName, requestRepositoryName))){ (oldGit, newGit) => + oldGit.fetch + .setRemote(Directory.getRepositoryDir(requestUserName, requestRepositoryName).toURI.toString) + .setRefSpecs(new RefSpec(s"refs/heads/${requestBranch}:refs/pull/${issueId}/head").setForceUpdate(true)) + .call + + val commitIdTo = oldGit.getRepository.resolve(s"refs/pull/${issueId}/head").getName + val commitIdFrom = getForkedCommitId(oldGit, newGit, + userName, repositoryName, branch, + requestUserName, requestRepositoryName, requestBranch) + (commitIdTo, commitIdFrom) + } + + /** * Returns the last modified commit of specified path * @param git the Git object * @param startCommit the search base commit id