mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-10-31 18:46:28 +01:00
(refs #2)Implementing the comparing view.
This commit is contained in:
@@ -6,35 +6,62 @@ import service._
|
||||
import org.eclipse.jgit.treewalk.CanonicalTreeParser
|
||||
import util.JGitUtil.{DiffInfo, CommitInfo}
|
||||
import scala.collection.mutable.ArrayBuffer
|
||||
import org.eclipse.jgit.api.Git
|
||||
import org.eclipse.jgit.lib.ObjectId
|
||||
|
||||
class PullRequestsController extends PullRequestsControllerBase
|
||||
with RepositoryService with AccountService with ReferrerAuthenticator
|
||||
|
||||
trait PullRequestsControllerBase extends ControllerBase {
|
||||
self: ReferrerAuthenticator =>
|
||||
self: ReferrerAuthenticator with RepositoryService =>
|
||||
|
||||
get("/:owner/:repository/pulls")(referrersOnly { repository =>
|
||||
pulls.html.list(repository)
|
||||
})
|
||||
|
||||
// TODO Replace correct authenticator
|
||||
get("/:owner/:repository/pulls/compare")(referrersOnly { newRepo =>
|
||||
(newRepo.repository.originUserName, newRepo.repository.originRepositoryName) match {
|
||||
case (None,_)|(_, None) => NotFound // TODO BadRequest?
|
||||
case (Some(originUserName), Some(originRepositoryName)) => {
|
||||
getRepository(originUserName, originRepositoryName, baseUrl).map { oldRepo =>
|
||||
withGit(
|
||||
getRepositoryDir(originUserName, originRepositoryName),
|
||||
getRepositoryDir(params("owner"), params("repository"))
|
||||
){ (oldGit, newGit) =>
|
||||
val oldBranch = JGitUtil.getDefaultBranch(oldGit, oldRepo).get._2
|
||||
val newBranch = JGitUtil.getDefaultBranch(newGit, newRepo).get._2
|
||||
|
||||
redirect(s"${context.path}/${newRepo.owner}/${newRepo.name}/pulls/compare/${originUserName}:${oldBranch}...${newBranch}")
|
||||
}
|
||||
} getOrElse NotFound
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// TODO Replace correct authenticator
|
||||
get("/:owner/:repository/pulls/compare/*:*...*")(referrersOnly { repository =>
|
||||
if(repository.repository.originUserName.isEmpty || repository.repository.originRepositoryName.isEmpty){
|
||||
NotFound // TODO BadRequest?
|
||||
} else {
|
||||
val userName = params("owner")
|
||||
val repositoryName = params("repository")
|
||||
val Seq(origin, originId, forkedId) = multiParams("splat")
|
||||
getRepository(
|
||||
repository.repository.originUserName.get,
|
||||
repository.repository.originRepositoryName.get, baseUrl
|
||||
).map{ originRepository =>
|
||||
|
||||
JGitUtil.withGit(getRepositoryDir(userName, repositoryName)){ newGit =>
|
||||
JGitUtil.withGit(getRepositoryDir(origin, repository.repository.originRepositoryName.get)){ oldGit =>
|
||||
val Seq(origin, originId, forkedId) = multiParams("splat")
|
||||
|
||||
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("master^{tree}"))
|
||||
oldTreeIter.reset(oldReader, oldGit.getRepository.resolve(s"${originId}^{tree}"))
|
||||
|
||||
val newReader = newGit.getRepository.newObjectReader
|
||||
val newTreeIter = new CanonicalTreeParser
|
||||
newTreeIter.reset(newReader, newGit.getRepository.resolve("master^{tree}"))
|
||||
newTreeIter.reset(newReader, newGit.getRepository.resolve(s"${forkedId}^{tree}"))
|
||||
|
||||
import scala.collection.JavaConverters._
|
||||
import util.Implicits._
|
||||
@@ -61,9 +88,21 @@ trait PullRequestsControllerBase extends ControllerBase {
|
||||
|
||||
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)
|
||||
}, diffs.toList, origin, originId, forkedId, newId.getName, repository, originRepository)
|
||||
}
|
||||
}
|
||||
} getOrElse NotFound
|
||||
}
|
||||
})
|
||||
|
||||
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)
|
||||
try {
|
||||
action(oldGit, newGit)
|
||||
} finally {
|
||||
oldGit.getRepository.close
|
||||
newGit.getRepository.close
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user