(refs #2)Pull request to the branch in the same repository is available.

This commit is contained in:
takezoe
2013-07-27 13:02:22 +09:00
parent 5f0eb91a81
commit f317d74bb4
3 changed files with 44 additions and 22 deletions

View File

@@ -23,9 +23,10 @@ trait PullRequestsControllerBase extends ControllerBase {
val pullRequestForm = mapping( val pullRequestForm = mapping(
"title" -> trim(label("Title" , text(required, maxlength(100)))), "title" -> trim(label("Title" , text(required, maxlength(100)))),
"content" -> trim(label("Content", optional(text()))), "content" -> trim(label("Content", optional(text()))),
"branch" -> trim(text(required, maxlength(100))), "targetUserName" -> trim(text(required, maxlength(100))),
"targetBranch" -> trim(text(required, maxlength(100))),
"requestUserName" -> trim(text(required, maxlength(100))), "requestUserName" -> trim(text(required, maxlength(100))),
"requestCommitId" -> trim(text(required, maxlength(100))), "requestBranch" -> trim(text(required, maxlength(100))),
"commitIdFrom" -> trim(text(required, maxlength(40))), "commitIdFrom" -> trim(text(required, maxlength(40))),
"commitIdTo" -> trim(text(required, maxlength(40))) "commitIdTo" -> trim(text(required, maxlength(40)))
)(PullRequestForm.apply) )(PullRequestForm.apply)
@@ -37,7 +38,8 @@ trait PullRequestsControllerBase extends ControllerBase {
case class PullRequestForm( case class PullRequestForm(
title: String, title: String,
content: Option[String], content: Option[String],
branch: String, targetUserName: String,
targetBranch: String,
requestUserName: String, requestUserName: String,
requestBranch: String, requestBranch: String,
commitIdFrom: String, commitIdFrom: String,
@@ -123,7 +125,9 @@ trait PullRequestsControllerBase extends ControllerBase {
pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo) pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo)
commits.flatten.foreach { commit => commits.flatten.foreach { commit =>
insertCommitId(repository.owner, repository.name, commit.id) if(!existsCommitId(repository.owner, repository.name, commit.id)){
insertCommitId(repository.owner, repository.name, commit.id)
}
} }
redirect(s"/${repository.owner}/${repository.name}/pulls/${issueId}") redirect(s"/${repository.owner}/${repository.name}/pulls/${issueId}")
@@ -136,6 +140,10 @@ trait PullRequestsControllerBase extends ControllerBase {
} }
}) })
/**
* Checks whether conflict will be caused in merging.
* Returns true if conflict will be caused.
*/
private def checkConflict(userName: String, repositoryName: String, branch: String, private def checkConflict(userName: String, repositoryName: String, branch: String,
requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = { requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = {
// TODO Are there more quick way? // TODO Are there more quick way?
@@ -165,7 +173,7 @@ trait PullRequestsControllerBase extends ControllerBase {
// FileUtils.deleteDirectory(tmpdir) // FileUtils.deleteDirectory(tmpdir)
// } // }
// } // }
true false
} }
get("/:owner/:repository/pulls/compare")(collaboratorsOnly { forkedRepository => get("/:owner/:repository/pulls/compare")(collaboratorsOnly { forkedRepository =>
@@ -192,14 +200,6 @@ trait PullRequestsControllerBase extends ControllerBase {
} }
}) })
private def parseCompareIdentifie(value: String, defaultOwner: String): (String, String) =
if(value.contains(':')){
val array = value.split(":")
(array(0), array(1))
} else {
(defaultOwner, value)
}
get("/:owner/:repository/pulls/compare/*...*")(collaboratorsOnly { repository => get("/:owner/:repository/pulls/compare/*...*")(collaboratorsOnly { repository =>
val Seq(origin, forked) = multiParams("splat") val Seq(origin, forked) = multiParams("splat")
val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, repository.owner) val (originOwner, tmpOriginBranch) = parseCompareIdentifie(origin, repository.owner)
@@ -246,9 +246,6 @@ trait PullRequestsControllerBase extends ControllerBase {
} }
}) })
private def getRepositoryNames(node: RepositoryTreeNode): List[String] =
node.owner :: node.children.map { child => getRepositoryNames(child) }.flatten
post("/:owner/:repository/pulls/new", pullRequestForm)(referrersOnly { (form, repository) => post("/:owner/:repository/pulls/new", pullRequestForm)(referrersOnly { (form, repository) =>
val loginUserName = context.loginAccount.get.userName val loginUserName = context.loginAccount.get.userName
@@ -264,7 +261,7 @@ trait PullRequestsControllerBase extends ControllerBase {
repository.owner, repository.owner,
repository.name, repository.name,
issueId, issueId,
form.branch, form.targetBranch,
form.requestUserName, form.requestUserName,
repository.name, repository.name,
form.requestBranch, form.requestBranch,
@@ -284,6 +281,9 @@ trait PullRequestsControllerBase extends ControllerBase {
redirect(s"/${repository.owner}/${repository.name}/pulls/${issueId}") redirect(s"/${repository.owner}/${repository.name}/pulls/${issueId}")
}) })
/**
* Handles w Git object simultaneously.
*/
private def withGit[T](oldDir: java.io.File, newDir: java.io.File)(action: (Git, Git) => T): T = { private def withGit[T](oldDir: java.io.File, newDir: java.io.File)(action: (Git, Git) => T): T = {
val oldGit = Git.open(oldDir) val oldGit = Git.open(oldDir)
val newGit = Git.open(newDir) val newGit = Git.open(newDir)
@@ -295,6 +295,29 @@ trait PullRequestsControllerBase extends ControllerBase {
} }
} }
/**
* Parses branch identifier and extracts owner and branch name as tuple.
*
* - "owner:branch" to ("owner", "branch")
* - "branch" to ("defaultOwner", "branch")
*/
private def parseCompareIdentifie(value: String, defaultOwner: String): (String, String) =
if(value.contains(':')){
val array = value.split(":")
(array(0), array(1))
} else {
(defaultOwner, value)
}
/**
* Extracts all repository names from [[service.RepositoryService.RepositoryTreeNode]] as flat list.
*/
private def getRepositoryNames(node: RepositoryTreeNode): List[String] =
node.owner :: node.children.map { child => getRepositoryNames(child) }.flatten
/**
* Returns the identifier of the root commit (or latest merge commit) of the specified branch.
*/
private def getForkedCommitId(oldGit: Git, newGit: Git, userName: String, repositoryName: String, branch: String, private def getForkedCommitId(oldGit: Git, newGit: Git, userName: String, repositoryName: String, branch: String,
requestUserName: String, requestRepositoryName: String, requestBranch: String): String = requestUserName: String, requestRepositoryName: String, requestBranch: String): String =
JGitUtil.getCommitLogs(newGit, requestBranch, true){ commit => JGitUtil.getCommitLogs(newGit, requestBranch, true){ commit =>

View File

@@ -69,9 +69,10 @@
<span class="error" id="error-title"></span> <span class="error" id="error-title"></span>
<input type="text" name="title" style="width: 600px" placeholder="Title"/> <input type="text" name="title" style="width: 600px" placeholder="Title"/>
@helper.html.preview(repository, "", false, true, "width: 600px; height: 200px;") @helper.html.preview(repository, "", false, true, "width: 600px; height: 200px;")
<input type="hidden" name="branch" value="@originId"/> <input type="hidden" name="targetUserName" value="@originRepository.owner"/>
<input type="hidden" name="requestUserName" value="@repository.owner"/> <input type="hidden" name="targetBranch" value="@originId"/>
<input type="hidden" name="requestCommitId" value="@forkedId"/> <input type="hidden" name="requestUserName" value="@forkedRepository.owner"/>
<input type="hidden" name="requestBranch" value="@forkedId"/>
<input type="hidden" name="commitIdFrom" value="@sourceId"/> <input type="hidden" name="commitIdFrom" value="@sourceId"/>
<input type="hidden" name="commitIdTo" value="@commitId"/> <input type="hidden" name="commitIdTo" value="@commitId"/>
</div> </div>

View File

@@ -32,7 +32,6 @@
@if(hasWritePermission){ @if(hasWritePermission){
@helper.html.dropdown() { @helper.html.dropdown() {
<li><a href="javascript:void(0);" class="assign" data-name=""><i class="icon-remove-circle"></i> Clear assignee</a></li> <li><a href="javascript:void(0);" class="assign" data-name=""><i class="icon-remove-circle"></i> Clear assignee</a></li>
<li class="divider"></li>
@collaborators.map { collaborator => @collaborators.map { collaborator =>
<li><a href="javascript:void(0);" class="assign" data-name="@collaborator"><i class="icon-white"></i>@avatar(collaborator, 20) @collaborator</a></li> <li><a href="javascript:void(0);" class="assign" data-name="@collaborator"><i class="icon-white"></i>@avatar(collaborator, 20) @collaborator</a></li>
} }
@@ -49,7 +48,6 @@
@if(hasWritePermission){ @if(hasWritePermission){
@helper.html.dropdown() { @helper.html.dropdown() {
<li><a href="javascript:void(0);" class="milestone" data-id=""><i class="icon-remove-circle"></i> No milestone</a></li> <li><a href="javascript:void(0);" class="milestone" data-id=""><i class="icon-remove-circle"></i> No milestone</a></li>
<li class="divider"></li>
@milestones.map { milestone => @milestones.map { milestone =>
<li><a href="javascript:void(0);" class="milestone" data-id="@milestone.milestoneId"><i class="icon-white"></i> @milestone.title</a></li> <li><a href="javascript:void(0);" class="milestone" data-id="@milestone.milestoneId"><i class="icon-white"></i> @milestone.title</a></li>
} }