mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-03 03:55:58 +01:00
(refs #442)show compare/pull request link near branch link.
This commit is contained in:
@@ -248,6 +248,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
get("/:owner/:repository/compare")(referrersOnly { forkedRepository =>
|
||||||
|
val headBranch:Option[String] = params.get("head")
|
||||||
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
(forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match {
|
||||||
case (Some(originUserName), Some(originRepositoryName)) => {
|
case (Some(originUserName), Some(originRepositoryName)) => {
|
||||||
getRepository(originUserName, originRepositoryName, context.baseUrl).map { originRepository =>
|
getRepository(originUserName, originRepositoryName, context.baseUrl).map { originRepository =>
|
||||||
@@ -255,8 +256,8 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
Git.open(getRepositoryDir(originUserName, originRepositoryName)),
|
Git.open(getRepositoryDir(originUserName, originRepositoryName)),
|
||||||
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))
|
||||||
){ (oldGit, newGit) =>
|
){ (oldGit, newGit) =>
|
||||||
val oldBranch = JGitUtil.getDefaultBranch(oldGit, originRepository).get._2
|
val newBranch = headBranch.getOrElse(JGitUtil.getDefaultBranch(newGit, forkedRepository).get._2)
|
||||||
val newBranch = 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}")
|
redirect(s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${originUserName}:${oldBranch}...${newBranch}")
|
||||||
}
|
}
|
||||||
@@ -265,7 +266,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
case _ => {
|
case _ => {
|
||||||
using(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))){ git =>
|
using(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))){ git =>
|
||||||
JGitUtil.getDefaultBranch(git, forkedRepository).map { case (_, defaultBranch) =>
|
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 {
|
} getOrElse {
|
||||||
redirect(s"/${forkedRepository.owner}/${forkedRepository.name}")
|
redirect(s"/${forkedRepository.owner}/${forkedRepository.name}")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -525,6 +525,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
|||||||
}, // groups of current user
|
}, // groups of current user
|
||||||
new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit
|
new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit
|
||||||
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount),
|
files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount),
|
||||||
|
getPullRequestFromBranch(repository.owner, repository.name, revstr, repository.repository.defaultBranch),
|
||||||
flash.get("info"), flash.get("error"))
|
flash.get("info"), flash.get("error"))
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
|
|||||||
@@ -83,6 +83,28 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
.map { case (t1, t2) => t1 }
|
.map { case (t1, t2) => t1 }
|
||||||
.list
|
.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.
|
* Fetch pull request contents into refs/pull/${issueId}/head and update pull request table.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
files: List[gitbucket.core.util.JGitUtil.FileInfo],
|
files: List[gitbucket.core.util.JGitUtil.FileInfo],
|
||||||
readme: Option[(List[String], String)],
|
readme: Option[(List[String], String)],
|
||||||
hasWritePermission: Boolean,
|
hasWritePermission: Boolean,
|
||||||
|
branchPullRequest: Option[(gitbucket.core.model.PullRequest, gitbucket.core.model.Issue)],
|
||||||
info: Option[Any] = None,
|
info: Option[Any] = None,
|
||||||
error: Option[Any] = None)(implicit context: gitbucket.core.controller.Context)
|
error: Option[Any] = None)(implicit context: gitbucket.core.controller.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@@ -13,6 +14,11 @@
|
|||||||
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
@html.main(s"${repository.owner}/${repository.name}", Some(repository)) {
|
||||||
@html.menu("code", repository, Some(branch), pathList.isEmpty, groupNames.isEmpty, info, error){
|
@html.menu("code", repository, Some(branch), pathList.isEmpty, groupNames.isEmpty, info, error){
|
||||||
<div class="head">
|
<div class="head">
|
||||||
|
@branchPullRequest.map{ case (pullRequest, issue) =>
|
||||||
|
<a href="@url(repository)/pull/@pullRequest.issueId" class="btn btn-pullrequest-branch btn-mini" title="@issue.title" data-toggle="tooltip">#@pullRequest.issueId</a>
|
||||||
|
}.getOrElse{
|
||||||
|
<a href="@url(repository)/compare?head=@urlEncode(encodeRefName(branch))" class="btn btn-success btn-mini"><i class="icon-white icon-retweet" data-toggle="tooltip" title="Compare, review, create a pull request"></i></a>
|
||||||
|
}
|
||||||
@helper.html.branchcontrol(
|
@helper.html.branchcontrol(
|
||||||
branch,
|
branch,
|
||||||
repository,
|
repository,
|
||||||
|
|||||||
@@ -701,6 +701,12 @@ span.simplified-path {
|
|||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-pullrequest-branch{
|
||||||
|
background: none;
|
||||||
|
border: 1px solid #0088cc;
|
||||||
|
color: #0088cc;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* nav pulls group */
|
/* nav pulls group */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package gitbucket.core.service
|
||||||
|
|
||||||
|
import gitbucket.core.model._
|
||||||
|
import gitbucket.core.model.Profile._
|
||||||
|
|
||||||
|
import org.specs2.mutable.Specification
|
||||||
|
|
||||||
|
class PullRequestServiceSpec extends Specification with ServiceSpecBase with PullRequestService with IssuesService {
|
||||||
|
def swap(r: (Issue, PullRequest)) = (r._2 -> r._1)
|
||||||
|
"PullRequestService.getPullRequestFromBranch" should {
|
||||||
|
"""
|
||||||
|
|return pull request if exists pull request from `branch` to `defaultBranch` and not closed.
|
||||||
|
|return pull request if exists pull request from `branch` to othre branch and not closed.
|
||||||
|
|return None if all pull request is closed""".stripMargin.trim in { withTestDB { implicit se =>
|
||||||
|
generateNewUserWithDBRepository("user1", "repo1")
|
||||||
|
generateNewUserWithDBRepository("user1", "repo2")
|
||||||
|
generateNewUserWithDBRepository("user2", "repo1")
|
||||||
|
generateNewPullRequest("user1/repo1/master", "user1/repo1/head2") // not target branch
|
||||||
|
generateNewPullRequest("user1/repo1/head1", "user1/repo1/master") // not target branch ( swap from, to )
|
||||||
|
generateNewPullRequest("user1/repo1/master", "user2/repo1/head1") // othre user
|
||||||
|
generateNewPullRequest("user1/repo1/master", "user1/repo2/head1") // othre repository
|
||||||
|
val r1 = swap(generateNewPullRequest("user1/repo1/master2", "user1/repo1/head1"))
|
||||||
|
val r2 = swap(generateNewPullRequest("user1/repo1/master", "user1/repo1/head1"))
|
||||||
|
val r3 = swap(generateNewPullRequest("user1/repo1/master4", "user1/repo1/head1"))
|
||||||
|
getPullRequestFromBranch("user1", "repo1", "head1", "master") must_== Some(r2)
|
||||||
|
updateClosed("user1", "repo1", r2._1.issueId, true)
|
||||||
|
getPullRequestFromBranch("user1", "repo1", "head1", "master").get must beOneOf(r1, r2)
|
||||||
|
updateClosed("user1", "repo1", r1._1.issueId, true)
|
||||||
|
updateClosed("user1", "repo1", r3._1.issueId, true)
|
||||||
|
getPullRequestFromBranch("user1", "repo1", "head1", "master") must beNone
|
||||||
|
} }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,7 +39,7 @@ trait ServiceSpecBase {
|
|||||||
with CommitStatusService (){}
|
with CommitStatusService (){}
|
||||||
|
|
||||||
def generateNewUserWithDBRepository(userName:String, repositoryName:String)(implicit s:Session):Account = {
|
def generateNewUserWithDBRepository(userName:String, repositoryName:String)(implicit s:Session):Account = {
|
||||||
val ac = generateNewAccount(userName)
|
val ac = AccountService.getAccountByUserName(userName).getOrElse(generateNewAccount(userName))
|
||||||
dummyService.createRepository(repositoryName, userName, None, false)
|
dummyService.createRepository(repositoryName, userName, None, false)
|
||||||
ac
|
ac
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user