diff --git a/src/main/resources/update/1_4.sql b/src/main/resources/update/1_4.sql index 1ac1a84..4750019 100644 --- a/src/main/resources/update/1_4.sql +++ b/src/main/resources/update/1_4.sql @@ -5,7 +5,9 @@ BRANCH VARCHAR(100) NOT NULL, REQUEST_USER_NAME VARCHAR(100) NOT NULL, REQUEST_REPOSITORY_NAME VARCHAR(100) NOT NULL, - REQUEST_BRANCH VARCHAR(100) NOT NULL + REQUEST_BRANCH VARCHAR(100) NOT NULL, + MERGE_START_ID VARCHAR(40), + MERGE_END_ID VARCHAR(40) ); ALTER TABLE PULL_REQUEST ADD CONSTRAINT IDX_PULL_REQUEST_PK PRIMARY KEY (USER_NAME, REPOSITORY_NAME, ISSUE_ID); diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index 52726e6..d601f45 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -4,13 +4,9 @@ import util.Directory._ 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 jp.sf.amateras.scalatra.forms._ -import util.JGitUtil.DiffInfo -import scala.Some -import util.JGitUtil.CommitInfo +import util.JGitUtil.{DiffInfo, CommitInfo} import org.eclipse.jgit.transport.RefSpec import org.apache.commons.io.FileUtils import org.eclipse.jgit.lib.PersonIdent @@ -50,6 +46,10 @@ val issueId = params("id").toInt getPullRequest(owner, name, issueId) map { case(issue, pullreq) => + + println(pullreq.mergeStartId) + println(pullreq.mergeEndId) + pulls.html.pullreq( issue, pullreq, getComments(owner, name, issueId.toInt), @@ -60,6 +60,7 @@ } getOrElse NotFound }) + // TODO display in single page? get("/:owner/:repository/pulls/:id/commits")(referrersOnly { repository => val owner = repository.owner val name = repository.name @@ -68,12 +69,17 @@ 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, + (if(pullreq.mergeStartId.isDefined){ + getCompareInfo(owner, name, pullreq.mergeStartId.get, owner, name, pullreq.mergeEndId.get)._1 + } else { + getCompareInfo(owner, name, pullreq.branch, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)._1 + }), hasWritePermission(owner, name, context.loginAccount), repository) } getOrElse NotFound }) + // TODO display in single page? get("/:owner/:repository/pulls/:id/files")(referrersOnly { repository => val owner = repository.owner val name = repository.name @@ -85,7 +91,11 @@ pulls.html.files( issue, pullreq, - getCompareInfo(owner, name, pullreq.branch, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)._2, + (if(pullreq.mergeStartId.isDefined){ + getCompareInfo(owner, name, pullreq.mergeStartId.get, owner, name, pullreq.mergeEndId.get)._2 + } else { + getCompareInfo(owner, name, pullreq.branch, pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch)._2 + }), newId.getName, hasWritePermission(owner, name, context.loginAccount), repository) @@ -93,7 +103,6 @@ } getOrElse NotFound }) - post("/:owner/:repository/pulls/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) => val issueId = params("id").toInt @@ -104,6 +113,12 @@ try { // TODO merge and close issue + val (commits, diffs) = getCompareInfo(repository.owner, repository.name, pullreq.branch, + pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.requestBranch) + mergePullRequest(repository.owner, repository.name, issueId, + git.getRepository.resolve("master").getName, + commits.head.head.id) + val loginAccount = context.loginAccount.get recordMergeActivity(repository.owner, repository.name, loginAccount.userName, issueId, form.message) @@ -213,6 +228,10 @@ */ private def getCompareInfo(userName: String, repositoryName: String, branch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = { + + import scala.collection.JavaConverters._ + import util.Implicits._ + withGit( getRepositoryDir(userName, repositoryName), getRepositoryDir(requestUserName, requestRepositoryName) @@ -225,16 +244,12 @@ 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.asScala val commits = newGit.log.addRange(oldId, newId).call.iterator.asScala.map { revCommit => new CommitInfo(revCommit) - }.toSeq.splitWith{ (commit1, commit2) => + }.toList.splitWith{ (commit1, commit2) => view.helpers.date(commit1.time) == view.helpers.date(commit2.time) } diff --git a/src/main/scala/model/PullRequest.scala b/src/main/scala/model/PullRequest.scala index a166fbd..82838a8 100644 --- a/src/main/scala/model/PullRequest.scala +++ b/src/main/scala/model/PullRequest.scala @@ -7,7 +7,9 @@ def requestUserName = column[String]("REQUEST_USER_NAME") def requestRepositoryName = column[String]("REQUEST_REPOSITORY_NAME") def requestBranch = column[String]("REQUEST_BRANCH") - def * = userName ~ repositoryName ~ issueId ~ branch ~ requestUserName ~ requestRepositoryName ~ requestBranch <> (PullRequest, PullRequest.unapply _) + def mergeStartId = column[String]("MERGE_START_ID") + def mergeEndId = column[String]("MERGE_END_ID") + def * = userName ~ repositoryName ~ issueId ~ branch ~ requestUserName ~ requestRepositoryName ~ requestBranch ~ mergeStartId.? ~ mergeEndId.? <> (PullRequest, PullRequest.unapply _) def byPrimaryKey(userName: String, repositoryName: String, issueId: Int) = byIssue(userName, repositoryName, issueId) def byPrimaryKey(userName: Column[String], repositoryName: Column[String], issueId: Column[Int]) = byIssue(userName, repositoryName, issueId) @@ -20,4 +22,6 @@ branch: String, requestUserName: String, requestRepositoryName: String, - requestBranch: String) \ No newline at end of file + requestBranch: String, + mergeStartId: Option[String], + mergeEndId: Option[String]) \ No newline at end of file diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index fadc567..899d613 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -5,10 +5,6 @@ import model._ -//import scala.slick.jdbc.{StaticQuery => Q} -//import Q.interpolation - - trait PullRequestService { self: IssuesService => def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = { @@ -30,6 +26,16 @@ originBranch, requestUserName, requestRepositoryName, - requestBranch)) + requestBranch, + None, + None)) + + def mergePullRequest(originUserName: String, originRepositoryName: String, issueId: Int, + mergeStartId: String, mergeEndId: String): Unit = { + Query(PullRequests) + .filter(_.byPrimaryKey(originUserName, originRepositoryName, issueId)) + .map(t => t.mergeStartId ~ t.mergeEndId) + .update(mergeStartId, mergeEndId) + } }