diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index b948799..e113132 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -35,6 +35,60 @@ 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 @@ 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 @@ 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 @@ } } + /** + * 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) + } + } + } diff --git a/src/main/twirl/pulls/commits.scala.html b/src/main/twirl/pulls/commits.scala.html new file mode 100644 index 0000000..64bead2 --- /dev/null +++ b/src/main/twirl/pulls/commits.scala.html @@ -0,0 +1,32 @@ +@(issue: model.Issue, + pullreq: model.PullRequest, + commits: Seq[Seq[util.JGitUtil.CommitInfo]], + hasWritePermission: Boolean, + repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context) +@import context._ +@import view.helpers._ +@html.main("%s - Issue #%d - %s/%s".format(issue.title, issue.issueId, repository.owner, repository.name)){ + @html.header("issues", repository) + @tab("commits", issue.issueId, repository) +
@date(day.head.time) | +||
---|---|---|
+ @avatar(commit.committer, 20) + @commit.committer + | +@commit.shortMessage | ++ @commit.id.substring(0, 7) + | +