diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index 68815f9..f77fb8e 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -248,6 +248,7 @@ }) get("/:owner/:repository/compare")(referrersOnly { forkedRepository => + val headBranch:Option[String] = params.get("head") (forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { case (Some(originUserName), Some(originRepositoryName)) => { getRepository(originUserName, originRepositoryName, context.baseUrl).map { originRepository => @@ -255,8 +256,8 @@ Git.open(getRepositoryDir(originUserName, originRepositoryName)), Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name)) ){ (oldGit, newGit) => - val oldBranch = JGitUtil.getDefaultBranch(oldGit, originRepository).get._2 - val newBranch = JGitUtil.getDefaultBranch(newGit, forkedRepository).get._2 + val newBranch = headBranch.getOrElse(JGitUtil.getDefaultBranch(newGit, forkedRepository).get._2) + val oldBranch = originRepository.branchList.find( _ == newBranch).getOrElse(JGitUtil.getDefaultBranch(oldGit, originRepository).get._2) redirect(s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${originUserName}:${oldBranch}...${newBranch}") } @@ -265,7 +266,7 @@ case _ => { using(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))){ git => JGitUtil.getDefaultBranch(git, forkedRepository).map { case (_, defaultBranch) => - redirect(s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${defaultBranch}...${defaultBranch}") + redirect(s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${defaultBranch}...${headBranch.getOrElse(defaultBranch)}") } getOrElse { redirect(s"/${forkedRepository.owner}/${forkedRepository.name}") } diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 411a58d..03183bf 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -525,6 +525,7 @@ }, // groups of current user new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount), + getPullRequestFromBranch(repository.owner, repository.name, revstr, repository.repository.defaultBranch), flash.get("info"), flash.get("error")) } } getOrElse NotFound diff --git a/src/main/scala/gitbucket/core/service/PullRequestService.scala b/src/main/scala/gitbucket/core/service/PullRequestService.scala index a6f4a2a..67db3c8 100644 --- a/src/main/scala/gitbucket/core/service/PullRequestService.scala +++ b/src/main/scala/gitbucket/core/service/PullRequestService.scala @@ -84,6 +84,28 @@ .list /** + * for repository viewer. + * 1. find pull request from from `branch` to othre branch on same repository + * 1. return if exists pull request to `defaultBranch` + * 2. return if exists pull request to othre branch + * 2. return None + */ + def getPullRequestFromBranch(userName: String, repositoryName: String, branch: String, defaultBranch: String) + (implicit s: Session): Option[(PullRequest, Issue)] = + PullRequests + .innerJoin(Issues).on { (t1, t2) => t1.byPrimaryKey(t2.userName, t2.repositoryName, t2.issueId) } + .filter { case (t1, t2) => + (t1.requestUserName === userName.bind) && + (t1.requestRepositoryName === repositoryName.bind) && + (t1.requestBranch === branch.bind) && + (t1.userName === userName.bind) && + (t1.repositoryName === repositoryName.bind) && + (t2.closed === false.bind) + } + .sortBy{ case (t1, t2) => t1.branch =!= defaultBranch.bind } + .firstOption + + /** * 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 = diff --git a/src/main/twirl/gitbucket/core/repo/files.scala.html b/src/main/twirl/gitbucket/core/repo/files.scala.html index 11d5f70..4695c0e 100644 --- a/src/main/twirl/gitbucket/core/repo/files.scala.html +++ b/src/main/twirl/gitbucket/core/repo/files.scala.html @@ -6,6 +6,7 @@ files: List[gitbucket.core.util.JGitUtil.FileInfo], readme: Option[(List[String], String)], hasWritePermission: Boolean, + branchPullRequest: Option[(gitbucket.core.model.PullRequest, gitbucket.core.model.Issue)], info: Option[Any] = None, error: Option[Any] = None)(implicit context: gitbucket.core.controller.Context) @import context._ @@ -13,6 +14,11 @@ @html.main(s"${repository.owner}/${repository.name}", Some(repository)) { @html.menu("code", repository, Some(branch), pathList.isEmpty, groupNames.isEmpty, info, error){