(refs #2)Add columns MERGE_START_ID and MERGE_END_ID to PULL_REQUEST.

This commit is contained in:
takezoe
2013-07-15 04:49:14 +09:00
parent dc59d1f3ca
commit 9bb6b216e9
4 changed files with 48 additions and 21 deletions

View File

@@ -5,7 +5,9 @@ CREATE TABLE PULL_REQUEST(
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);

View File

@@ -4,13 +4,9 @@ import util.{CollaboratorsAuthenticator, FileUtil, JGitUtil, ReferrerAuthenticat
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 @@ trait PullRequestsControllerBase extends ControllerBase {
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 @@ trait PullRequestsControllerBase extends ControllerBase {
} 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 @@ trait PullRequestsControllerBase extends ControllerBase {
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 @@ trait PullRequestsControllerBase extends ControllerBase {
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 @@ trait PullRequestsControllerBase extends ControllerBase {
} getOrElse NotFound
})
post("/:owner/:repository/pulls/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) =>
val issueId = params("id").toInt
@@ -104,6 +113,12 @@ trait PullRequestsControllerBase extends ControllerBase {
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 @@ trait PullRequestsControllerBase extends ControllerBase {
*/
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 @@ trait PullRequestsControllerBase extends ControllerBase {
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)
}

View File

@@ -7,7 +7,9 @@ object PullRequests extends Table[PullRequest]("PULL_REQUEST") with IssueTemplat
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 @@ case class PullRequest(
branch: String,
requestUserName: String,
requestRepositoryName: String,
requestBranch: String)
requestBranch: String,
mergeStartId: Option[String],
mergeEndId: Option[String])

View File

@@ -5,10 +5,6 @@ import Database.threadLocalSession
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 @@ trait PullRequestService { self: IssuesService =>
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)
}
}