mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-01 19:15:59 +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")
|
||||
getRepository(
|
||||
repository.repository.originUserName.get,
|
||||
repository.repository.originRepositoryName.get, baseUrl
|
||||
).map{ originRepository =>
|
||||
|
||||
val Seq(origin, originId, forkedId) = multiParams("splat")
|
||||
|
||||
JGitUtil.withGit(getRepositoryDir(userName, repositoryName)){ newGit =>
|
||||
JGitUtil.withGit(getRepositoryDir(origin, repository.repository.originRepositoryName.get)){ oldGit =>
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
|
||||
JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git =>
|
||||
val revisions = Seq(if(revstr.isEmpty) repository.repository.defaultBranch else revstr, repository.branchList.head)
|
||||
// get specified commit
|
||||
revisions.map { rev => (git.getRepository.resolve(rev), rev)}.find(_._1 != null).map { case (objectId, revision) =>
|
||||
JGitUtil.getDefaultBranch(git, repository, revstr).map { case (objectId, revision) =>
|
||||
val revCommit = JGitUtil.getRevCommitFromId(git, objectId)
|
||||
|
||||
// get files
|
||||
|
||||
@@ -185,6 +185,17 @@ trait RepositoryService { self: AccountService =>
|
||||
}
|
||||
}
|
||||
|
||||
// def getBaseRepositories(userName: String, repositoryName: String, repositories: List[String] = Nil): List[String] = {
|
||||
// Query(Repositories).filter { t =>
|
||||
// (t.originUserName is userName.bind) && (t.originRepositoryName is repositoryName.bind)
|
||||
// }.map(_.userName).list match {
|
||||
// case Nil => repositories.sorted
|
||||
// case list => list.map { x =>
|
||||
// getBaseRepositories(x, repositoryName, x :: repositories)
|
||||
// }.flatten
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
object RepositoryService {
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.eclipse.jgit.util.io.DisabledOutputStream
|
||||
import org.eclipse.jgit.errors.MissingObjectException
|
||||
import java.util.Date
|
||||
import org.eclipse.jgit.api.errors.NoHeadException
|
||||
import service.RepositoryService
|
||||
|
||||
/**
|
||||
* Provides complex JGit operations.
|
||||
@@ -532,4 +533,14 @@ object JGitUtil {
|
||||
config.save
|
||||
}
|
||||
|
||||
def getDefaultBranch(git: Git, repository: RepositoryService.RepositoryInfo,
|
||||
revstr: String = ""): Option[(ObjectId, String)] = {
|
||||
Seq(
|
||||
if(revstr.isEmpty) repository.repository.defaultBranch else revstr,
|
||||
repository.branchList.head
|
||||
).map { rev =>
|
||||
(git.getRepository.resolve(rev), rev)
|
||||
}.find(_._1 != null)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +1,34 @@
|
||||
@(commits: Seq[Seq[util.JGitUtil.CommitInfo]], diffs: List[util.JGitUtil.DiffInfo],
|
||||
origin: String, originId: String, forkedId: String, commitId: String,
|
||||
repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
||||
repository: service.RepositoryService.RepositoryInfo,
|
||||
originRepository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context)
|
||||
@import context._
|
||||
@import view.helpers._
|
||||
@import org.eclipse.jgit.diff.DiffEntry.ChangeType
|
||||
@html.main("Pull Requests - " + repository.owner + "/" + repository.name){
|
||||
@html.header("pulls", repository)
|
||||
<div style="border: 1px solid #eee; background-color: #f8f8f8; margin-bottom: 10px; padding: 8px;">
|
||||
<div id="compare-info">
|
||||
<a href="#" id="edit-compare-condition" class="btn btn-mini pull-right">Edit</a>
|
||||
<span class="label label-info monospace">@origin:@originId</span> ... <span class="label label-info monospace">@repository.owner:@forkedId</span>
|
||||
</div>
|
||||
<div id="compare-edit" style="display: none;">
|
||||
<a href="#" id="refresh-compare" class="pull-right"><i class="icon-remove-circle"></i></a>
|
||||
<span class="label label-info monospace">@origin/@repository.name:</span>
|
||||
@helper.html.dropdown(originId) {
|
||||
@originRepository.branchList.map { branch =>
|
||||
<li><a href="#">@helper.html.checkicon(branch == originId) @branch</a></li>
|
||||
}
|
||||
}
|
||||
...
|
||||
<span class="label label-info monospace">@repository.owner/@repository.name:</span>
|
||||
@helper.html.dropdown(forkedId) {
|
||||
@repository.branchList.map { branch =>
|
||||
<li><a href="#">@helper.html.checkicon(branch == forkedId) @branch</a></li>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-bottom: 10px;">
|
||||
<a href="#" class="btn">Click to create a pull request for this comparison</a>
|
||||
</div>
|
||||
@@ -63,6 +83,15 @@
|
||||
}
|
||||
<script>
|
||||
$(function(){
|
||||
$('#edit-compare-condition').click(function(){
|
||||
$('#compare-info').hide();
|
||||
$('#compare-edit').show();
|
||||
});
|
||||
|
||||
$('#refresh-compare').click(function(){
|
||||
// TODO send request
|
||||
});
|
||||
|
||||
$('#toggle-file-list').click(function(){
|
||||
$('#commit-file-list').toggle();
|
||||
if($(this).val() == 'Show file list'){
|
||||
|
||||
Reference in New Issue
Block a user