mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-10-31 18:46:28 +01:00
(refs #2)Add tabs to the pull request page.
This commit is contained in:
@@ -35,6 +35,60 @@ trait PullRequestsControllerBase extends ControllerBase {
|
||||
pulls.html.list(repository)
|
||||
})
|
||||
|
||||
get("/:owner/:repository/pulls/:id")(referrersOnly { repository =>
|
||||
val owner = repository.owner
|
||||
val name = repository.name
|
||||
val issueId = params("id").toInt
|
||||
|
||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||
pulls.html.pullreq(
|
||||
issue, pullreq,
|
||||
getComments(owner, name, issueId.toInt),
|
||||
(getCollaborators(owner, name) :+ owner).sorted,
|
||||
getMilestones(owner, name),
|
||||
hasWritePermission(owner, name, context.loginAccount),
|
||||
repository)
|
||||
} getOrElse NotFound
|
||||
})
|
||||
|
||||
get("/:owner/:repository/pulls/:id/commits")(referrersOnly { repository =>
|
||||
val owner = repository.owner
|
||||
val name = repository.name
|
||||
val issueId = params("id").toInt
|
||||
|
||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||
pulls.html.commits(
|
||||
issue, pullreq,
|
||||
getCompareInfo(owner, name, pullreq.branch, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)._1,
|
||||
hasWritePermission(owner, name, context.loginAccount),
|
||||
repository)
|
||||
} getOrElse NotFound
|
||||
})
|
||||
|
||||
get("/:owner/:repository/pulls/:id/files")(referrersOnly { repository =>
|
||||
val owner = repository.owner
|
||||
val name = repository.name
|
||||
val issueId = params("id").toInt
|
||||
|
||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||
JGitUtil.withGit(getRepositoryDir(owner, name)){ git =>
|
||||
val newId = git.getRepository.resolve(pullreq.requestBranch)
|
||||
|
||||
pulls.html.files(
|
||||
issue, pullreq,
|
||||
getCompareInfo(owner, name, pullreq.branch, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)._2,
|
||||
newId.getName,
|
||||
hasWritePermission(owner, name, context.loginAccount),
|
||||
repository)
|
||||
}
|
||||
} getOrElse NotFound
|
||||
})
|
||||
|
||||
|
||||
post("/:owner/:repository/pulls/:id/merge")(collaboratorsOnly { repository =>
|
||||
// TODO Not implemented yet.
|
||||
})
|
||||
|
||||
// TODO Replace correct authenticator
|
||||
get("/:owner/:repository/pulls/compare")(collaboratorsOnly { newRepo =>
|
||||
(newRepo.repository.originUserName, newRepo.repository.originRepositoryName) match {
|
||||
@@ -64,47 +118,18 @@ trait PullRequestsControllerBase extends ControllerBase {
|
||||
repository.repository.originUserName.get,
|
||||
repository.repository.originRepositoryName.get, baseUrl
|
||||
).map{ originRepository =>
|
||||
|
||||
val Seq(origin, originId, forkedId) = multiParams("splat")
|
||||
val userName = params("owner")
|
||||
val repositoryName = params("repository")
|
||||
|
||||
withGit(
|
||||
getRepositoryDir(origin, repository.repository.originRepositoryName.get),
|
||||
getRepositoryDir(params("owner"), params("repository"))
|
||||
){ (oldGit, newGit) =>
|
||||
val oldReader = oldGit.getRepository.newObjectReader
|
||||
val oldTreeIter = new CanonicalTreeParser
|
||||
oldTreeIter.reset(oldReader, oldGit.getRepository.resolve(s"${originId}^{tree}"))
|
||||
JGitUtil.withGit(getRepositoryDir(userName, repositoryName)){ git =>
|
||||
val newId = git.getRepository.resolve(forkedId)
|
||||
|
||||
val newReader = newGit.getRepository.newObjectReader
|
||||
val newTreeIter = new CanonicalTreeParser
|
||||
newTreeIter.reset(newReader, newGit.getRepository.resolve(s"${forkedId}^{tree}"))
|
||||
val pullreq = getCompareInfo(
|
||||
origin, repository.repository.originRepositoryName.get, originId,
|
||||
params("owner"), params("repository"), forkedId)
|
||||
|
||||
import scala.collection.JavaConverters._
|
||||
import util.Implicits._
|
||||
|
||||
val oldId = oldGit.getRepository.resolve(originId)
|
||||
val newId = newGit.getRepository.resolve(forkedId)
|
||||
val i = newGit.log.addRange(oldId, newId).call.iterator
|
||||
|
||||
val commits = new ArrayBuffer[CommitInfo]
|
||||
while(i.hasNext){
|
||||
val revCommit = i.next
|
||||
commits += new CommitInfo(revCommit)
|
||||
}
|
||||
|
||||
val diffs = newGit.diff.setOldTree(oldTreeIter).setNewTree(newTreeIter).call.asScala.map { diff =>
|
||||
if(FileUtil.isImage(diff.getOldPath) || FileUtil.isImage(diff.getNewPath)){
|
||||
DiffInfo(diff.getChangeType, diff.getOldPath, diff.getNewPath, None, None)
|
||||
} else {
|
||||
DiffInfo(diff.getChangeType, diff.getOldPath, diff.getNewPath,
|
||||
JGitUtil.getContent(oldGit, diff.getOldId.toObjectId, false).filter(FileUtil.isText).map(new String(_, "UTF-8")),
|
||||
JGitUtil.getContent(newGit, diff.getNewId.toObjectId, false).filter(FileUtil.isText).map(new String(_, "UTF-8")))
|
||||
}
|
||||
}
|
||||
|
||||
pulls.html.compare(commits.toList.splitWith{ (commit1, commit2) =>
|
||||
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
||||
}, diffs.toList, origin, originId, forkedId, newId.getName, repository, originRepository)
|
||||
pulls.html.compare(pullreq._1, pullreq._2, origin, originId, forkedId, newId.getName, repository, originRepository)
|
||||
}
|
||||
} getOrElse NotFound
|
||||
}
|
||||
@@ -135,26 +160,6 @@ trait PullRequestsControllerBase extends ControllerBase {
|
||||
redirect(s"/${repository.owner}/${repository.name}/pulls/${issueId}")
|
||||
})
|
||||
|
||||
get("/:owner/:repository/pulls/:id")(referrersOnly { repository =>
|
||||
val owner = repository.owner
|
||||
val name = repository.name
|
||||
val issueId = params("id").toInt
|
||||
|
||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||
pulls.html.pullreq(
|
||||
issue, pullreq,
|
||||
getComments(owner, name, issueId.toInt),
|
||||
(getCollaborators(owner, name) :+ owner).sorted,
|
||||
getMilestones(owner, name),
|
||||
hasWritePermission(owner, name, context.loginAccount),
|
||||
repository)
|
||||
} getOrElse NotFound
|
||||
})
|
||||
|
||||
post("/:owner/:repository/pulls/:id/merge")(collaboratorsOnly { repository =>
|
||||
// TODO Not implemented yet.
|
||||
})
|
||||
|
||||
private def withGit[T](oldDir: java.io.File, newDir: java.io.File)(action: (Git, Git) => T): T = {
|
||||
val oldGit = Git.open(oldDir)
|
||||
val newGit = Git.open(newDir)
|
||||
@@ -166,4 +171,50 @@ trait PullRequestsControllerBase extends ControllerBase {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the commits and diffs between specified repository and revision.
|
||||
*/
|
||||
private def getCompareInfo(userName: String, repositoryName: String, branch: String,
|
||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = {
|
||||
withGit(
|
||||
getRepositoryDir(userName, repositoryName),
|
||||
getRepositoryDir(requestUserName, requestRepositoryName)
|
||||
){ (oldGit, newGit) =>
|
||||
val oldReader = oldGit.getRepository.newObjectReader
|
||||
val oldTreeIter = new CanonicalTreeParser
|
||||
oldTreeIter.reset(oldReader, oldGit.getRepository.resolve(s"${branch}^{tree}"))
|
||||
|
||||
val newReader = newGit.getRepository.newObjectReader
|
||||
val newTreeIter = new CanonicalTreeParser
|
||||
newTreeIter.reset(newReader, newGit.getRepository.resolve(s"${requestBranch}^{tree}"))
|
||||
|
||||
import scala.collection.JavaConverters._
|
||||
import util.Implicits._
|
||||
|
||||
val oldId = oldGit.getRepository.resolve(branch)
|
||||
val newId = newGit.getRepository.resolve(requestBranch)
|
||||
val i = newGit.log.addRange(oldId, newId).call.iterator
|
||||
|
||||
val commits = new ArrayBuffer[CommitInfo]
|
||||
while(i.hasNext){
|
||||
val revCommit = i.next
|
||||
commits += new CommitInfo(revCommit)
|
||||
}
|
||||
|
||||
val diffs = newGit.diff.setOldTree(oldTreeIter).setNewTree(newTreeIter).call.asScala.map { diff =>
|
||||
if(FileUtil.isImage(diff.getOldPath) || FileUtil.isImage(diff.getNewPath)){
|
||||
DiffInfo(diff.getChangeType, diff.getOldPath, diff.getNewPath, None, None)
|
||||
} else {
|
||||
DiffInfo(diff.getChangeType, diff.getOldPath, diff.getNewPath,
|
||||
JGitUtil.getContent(oldGit, diff.getOldId.toObjectId, false).filter(FileUtil.isText).map(new String(_, "UTF-8")),
|
||||
JGitUtil.getContent(newGit, diff.getNewId.toObjectId, false).filter(FileUtil.isText).map(new String(_, "UTF-8")))
|
||||
}
|
||||
}
|
||||
|
||||
(commits.toList.splitWith{ (commit1, commit2) =>
|
||||
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
||||
}, diffs.toSeq)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user