mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-07 14:05:52 +01:00
(refs #2)Add columns MERGE_START_ID and MERGE_END_ID to PULL_REQUEST.
This commit is contained in:
@@ -5,7 +5,9 @@ CREATE TABLE PULL_REQUEST(
|
|||||||
BRANCH VARCHAR(100) NOT NULL,
|
BRANCH VARCHAR(100) NOT NULL,
|
||||||
REQUEST_USER_NAME VARCHAR(100) NOT NULL,
|
REQUEST_USER_NAME VARCHAR(100) NOT NULL,
|
||||||
REQUEST_REPOSITORY_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);
|
ALTER TABLE PULL_REQUEST ADD CONSTRAINT IDX_PULL_REQUEST_PK PRIMARY KEY (USER_NAME, REPOSITORY_NAME, ISSUE_ID);
|
||||||
|
|||||||
@@ -4,13 +4,9 @@ import util.{CollaboratorsAuthenticator, FileUtil, JGitUtil, ReferrerAuthenticat
|
|||||||
import util.Directory._
|
import util.Directory._
|
||||||
import service._
|
import service._
|
||||||
import org.eclipse.jgit.treewalk.CanonicalTreeParser
|
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.api.Git
|
||||||
import jp.sf.amateras.scalatra.forms._
|
import jp.sf.amateras.scalatra.forms._
|
||||||
import util.JGitUtil.DiffInfo
|
import util.JGitUtil.{DiffInfo, CommitInfo}
|
||||||
import scala.Some
|
|
||||||
import util.JGitUtil.CommitInfo
|
|
||||||
import org.eclipse.jgit.transport.RefSpec
|
import org.eclipse.jgit.transport.RefSpec
|
||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
import org.eclipse.jgit.lib.PersonIdent
|
import org.eclipse.jgit.lib.PersonIdent
|
||||||
@@ -50,6 +46,10 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
val issueId = params("id").toInt
|
val issueId = params("id").toInt
|
||||||
|
|
||||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||||
|
|
||||||
|
println(pullreq.mergeStartId)
|
||||||
|
println(pullreq.mergeEndId)
|
||||||
|
|
||||||
pulls.html.pullreq(
|
pulls.html.pullreq(
|
||||||
issue, pullreq,
|
issue, pullreq,
|
||||||
getComments(owner, name, issueId.toInt),
|
getComments(owner, name, issueId.toInt),
|
||||||
@@ -60,6 +60,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// TODO display in single page?
|
||||||
get("/:owner/:repository/pulls/:id/commits")(referrersOnly { repository =>
|
get("/:owner/:repository/pulls/:id/commits")(referrersOnly { repository =>
|
||||||
val owner = repository.owner
|
val owner = repository.owner
|
||||||
val name = repository.name
|
val name = repository.name
|
||||||
@@ -68,12 +69,17 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
getPullRequest(owner, name, issueId) map { case(issue, pullreq) =>
|
||||||
pulls.html.commits(
|
pulls.html.commits(
|
||||||
issue, pullreq,
|
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),
|
hasWritePermission(owner, name, context.loginAccount),
|
||||||
repository)
|
repository)
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// TODO display in single page?
|
||||||
get("/:owner/:repository/pulls/:id/files")(referrersOnly { repository =>
|
get("/:owner/:repository/pulls/:id/files")(referrersOnly { repository =>
|
||||||
val owner = repository.owner
|
val owner = repository.owner
|
||||||
val name = repository.name
|
val name = repository.name
|
||||||
@@ -85,7 +91,11 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
pulls.html.files(
|
pulls.html.files(
|
||||||
issue, pullreq,
|
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,
|
newId.getName,
|
||||||
hasWritePermission(owner, name, context.loginAccount),
|
hasWritePermission(owner, name, context.loginAccount),
|
||||||
repository)
|
repository)
|
||||||
@@ -93,7 +103,6 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
post("/:owner/:repository/pulls/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) =>
|
post("/:owner/:repository/pulls/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) =>
|
||||||
val issueId = params("id").toInt
|
val issueId = params("id").toInt
|
||||||
|
|
||||||
@@ -104,6 +113,12 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// TODO merge and close issue
|
// 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
|
val loginAccount = context.loginAccount.get
|
||||||
recordMergeActivity(repository.owner, repository.name, loginAccount.userName, issueId, form.message)
|
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,
|
private def getCompareInfo(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = {
|
requestUserName: String, requestRepositoryName: String, requestBranch: String): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = {
|
||||||
|
|
||||||
|
import scala.collection.JavaConverters._
|
||||||
|
import util.Implicits._
|
||||||
|
|
||||||
withGit(
|
withGit(
|
||||||
getRepositoryDir(userName, repositoryName),
|
getRepositoryDir(userName, repositoryName),
|
||||||
getRepositoryDir(requestUserName, requestRepositoryName)
|
getRepositoryDir(requestUserName, requestRepositoryName)
|
||||||
@@ -225,16 +244,12 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
val newTreeIter = new CanonicalTreeParser
|
val newTreeIter = new CanonicalTreeParser
|
||||||
newTreeIter.reset(newReader, newGit.getRepository.resolve(s"${requestBranch}^{tree}"))
|
newTreeIter.reset(newReader, newGit.getRepository.resolve(s"${requestBranch}^{tree}"))
|
||||||
|
|
||||||
import scala.collection.JavaConverters._
|
|
||||||
import util.Implicits._
|
|
||||||
|
|
||||||
val oldId = oldGit.getRepository.resolve(branch)
|
val oldId = oldGit.getRepository.resolve(branch)
|
||||||
val newId = newGit.getRepository.resolve(requestBranch)
|
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 =>
|
val commits = newGit.log.addRange(oldId, newId).call.iterator.asScala.map { revCommit =>
|
||||||
new CommitInfo(revCommit)
|
new CommitInfo(revCommit)
|
||||||
}.toSeq.splitWith{ (commit1, commit2) =>
|
}.toList.splitWith{ (commit1, commit2) =>
|
||||||
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
view.helpers.date(commit1.time) == view.helpers.date(commit2.time)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ object PullRequests extends Table[PullRequest]("PULL_REQUEST") with IssueTemplat
|
|||||||
def requestUserName = column[String]("REQUEST_USER_NAME")
|
def requestUserName = column[String]("REQUEST_USER_NAME")
|
||||||
def requestRepositoryName = column[String]("REQUEST_REPOSITORY_NAME")
|
def requestRepositoryName = column[String]("REQUEST_REPOSITORY_NAME")
|
||||||
def requestBranch = column[String]("REQUEST_BRANCH")
|
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: String, repositoryName: String, issueId: Int) = byIssue(userName, repositoryName, issueId)
|
||||||
def byPrimaryKey(userName: Column[String], repositoryName: Column[String], issueId: Column[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,
|
branch: String,
|
||||||
requestUserName: String,
|
requestUserName: String,
|
||||||
requestRepositoryName: String,
|
requestRepositoryName: String,
|
||||||
requestBranch: String)
|
requestBranch: String,
|
||||||
|
mergeStartId: Option[String],
|
||||||
|
mergeEndId: Option[String])
|
||||||
@@ -5,10 +5,6 @@ import Database.threadLocalSession
|
|||||||
|
|
||||||
import model._
|
import model._
|
||||||
|
|
||||||
//import scala.slick.jdbc.{StaticQuery => Q}
|
|
||||||
//import Q.interpolation
|
|
||||||
|
|
||||||
|
|
||||||
trait PullRequestService { self: IssuesService =>
|
trait PullRequestService { self: IssuesService =>
|
||||||
|
|
||||||
def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = {
|
def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = {
|
||||||
@@ -30,6 +26,16 @@ trait PullRequestService { self: IssuesService =>
|
|||||||
originBranch,
|
originBranch,
|
||||||
requestUserName,
|
requestUserName,
|
||||||
requestRepositoryName,
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user