diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index dee821f..6fb1656 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -6,35 +6,62 @@ 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 @@ 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 + } + } + } diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 43cb126..e4dc1ed 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -218,7 +218,7 @@ 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 diff --git a/src/main/scala/service/RepositoryService.scala b/src/main/scala/service/RepositoryService.scala index d207f6d..4ec1651 100644 --- a/src/main/scala/service/RepositoryService.scala +++ b/src/main/scala/service/RepositoryService.scala @@ -185,6 +185,17 @@ } } +// 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 { diff --git a/src/main/scala/util/JGitUtil.scala b/src/main/scala/util/JGitUtil.scala index b2ce900..747ca66 100644 --- a/src/main/scala/util/JGitUtil.scala +++ b/src/main/scala/util/JGitUtil.scala @@ -15,6 +15,7 @@ import org.eclipse.jgit.errors.MissingObjectException import java.util.Date import org.eclipse.jgit.api.errors.NoHeadException +import service.RepositoryService /** * Provides complex JGit operations. @@ -419,7 +420,7 @@ case true if(logs.size < 2) => getCommitLog(i, logs :+ i.next) case _ => logs } - + val revWalk = new RevWalk(git.getRepository) revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(id))) @@ -532,4 +533,14 @@ 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) + } + } \ No newline at end of file diff --git a/src/main/twirl/pulls/compare.scala.html b/src/main/twirl/pulls/compare.scala.html index e3decca..8ea107a 100644 --- a/src/main/twirl/pulls/compare.scala.html +++ b/src/main/twirl/pulls/compare.scala.html @@ -1,13 +1,33 @@ @(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)
- @origin:@originId ... @repository.owner:@forkedId +
+ Edit + @origin:@originId ... @repository.owner:@forkedId +
+
Click to create a pull request for this comparison @@ -63,6 +83,15 @@ }