diff --git a/src/main/resources/update/1_4.sql b/src/main/resources/update/1_4.sql index c1b3022..1ac1a84 100644 --- a/src/main/resources/update/1_4.sql +++ b/src/main/resources/update/1_4.sql @@ -2,10 +2,10 @@ USER_NAME VARCHAR(100) NOT NULL, REPOSITORY_NAME VARCHAR(100) NOT NULL, ISSUE_ID INT NOT NULL, - ORIGIN_BRANCH VARCHAR(100) NOT NULL, + BRANCH VARCHAR(100) NOT NULL, REQUEST_USER_NAME VARCHAR(100) NOT NULL, REQUEST_REPOSITORY_NAME VARCHAR(100) NOT NULL, - REQUEST_COMMIT_ID VARCHAR(40) NOT NULL + REQUEST_BRANCH VARCHAR(100) NOT NULL ); 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 c5d7a2a..b948799 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -25,11 +25,11 @@ "content" -> trim(label("Content", optional(text()))), "branch" -> trim(text(required, maxlength(100))), "requestUserName" -> trim(text(required, maxlength(100))), - "requestCommitId" -> trim(text(required, maxlength(40))) + "requestBranch" -> trim(text(required, maxlength(100))) )(PullRequestForm.apply) case class PullRequestForm(title: String, content: Option[String], branch: String, - requestUserName: String, requestCommitId: String) + requestUserName: String, requestBranch: String) get("/:owner/:repository/pulls")(referrersOnly { repository => pulls.html.list(repository) @@ -128,7 +128,7 @@ form.branch, form.requestUserName, repository.name, - form.requestCommitId) + form.requestBranch) recordPullRequestActivity(repository.owner, repository.name, loginUserName, issueId, form.title) @@ -138,16 +138,14 @@ get("/:owner/:repository/pulls/:id")(referrersOnly { repository => val owner = repository.owner val name = repository.name - val issueId = params("id") + val issueId = params("id").toInt - getIssue(owner, name, issueId) map { - issues.html.issue( - _, + getPullRequest(owner, name, issueId) map { case(issue, pullreq) => + pulls.html.pullreq( + issue, pullreq, getComments(owner, name, issueId.toInt), - getIssueLabels(owner, name, issueId.toInt), (getCollaborators(owner, name) :+ owner).sorted, getMilestones(owner, name), - Nil, hasWritePermission(owner, name, context.loginAccount), repository) } getOrElse NotFound diff --git a/src/main/scala/model/PullRequest.scala b/src/main/scala/model/PullRequest.scala index 5645ae7..a166fbd 100644 --- a/src/main/scala/model/PullRequest.scala +++ b/src/main/scala/model/PullRequest.scala @@ -3,11 +3,11 @@ import scala.slick.driver.H2Driver.simple._ object PullRequests extends Table[PullRequest]("PULL_REQUEST") with IssueTemplate { + def branch = column[String]("BRANCH") def requestUserName = column[String]("REQUEST_USER_NAME") def requestRepositoryName = column[String]("REQUEST_REPOSITORY_NAME") - def requestCommitId = column[String]("REQUEST_COMMIT_ID") - def originBranch = column[String]("ORIGIN_BRANCH") - def * = userName ~ repositoryName ~ issueId ~ originBranch ~ requestUserName ~ requestRepositoryName ~ requestCommitId <> (PullRequest, PullRequest.unapply _) + def requestBranch = column[String]("REQUEST_BRANCH") + def * = userName ~ repositoryName ~ issueId ~ branch ~ requestUserName ~ requestRepositoryName ~ requestBranch <> (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) @@ -17,7 +17,7 @@ userName: String, repositoryName: String, issueId: Int, - originBranch: String, + branch: String, requestUserName: String, requestRepositoryName: String, - requestCommitId: String) \ No newline at end of file + requestBranch: String) \ No newline at end of file diff --git a/src/main/scala/service/PullRequestService.scala b/src/main/scala/service/PullRequestService.scala index a52fe11..fadc567 100644 --- a/src/main/scala/service/PullRequestService.scala +++ b/src/main/scala/service/PullRequestService.scala @@ -9,10 +9,20 @@ //import Q.interpolation -trait PullRequestService { +trait PullRequestService { self: IssuesService => + + def getPullRequest(owner: String, repository: String, issueId: Int): Option[(Issue, PullRequest)] = { + val issue = getIssue(owner, repository, issueId.toString) + if(issue.isDefined){ + Query(PullRequests).filter(_.byPrimaryKey(owner, repository, issueId)).firstOption match { + case Some(pullreq) => Some((issue.get, pullreq)) + case None => None + } + } else None + } def createPullRequest(originUserName: String, originRepositoryName: String, issueId: Int, - originBranch: String, requestUserName: String, requestRepositoryName: String, requestCommitId: String): Unit = + originBranch: String, requestUserName: String, requestRepositoryName: String, requestBranch: String): Unit = PullRequests insert (PullRequest( originUserName, originRepositoryName, @@ -20,6 +30,6 @@ originBranch, requestUserName, requestRepositoryName, - requestCommitId)) + requestBranch)) } diff --git a/src/main/twirl/pulls/compare.scala.html b/src/main/twirl/pulls/compare.scala.html index 4edd2d6..3c6ab3a 100644 --- a/src/main/twirl/pulls/compare.scala.html +++ b/src/main/twirl/pulls/compare.scala.html @@ -40,7 +40,7 @@ @helper.html.preview(repository, "", false, true, "width: 600px; height: 200px;") - + diff --git a/src/main/twirl/pulls/pullreq.scala.html b/src/main/twirl/pulls/pullreq.scala.html new file mode 100644 index 0000000..c4e0606 --- /dev/null +++ b/src/main/twirl/pulls/pullreq.scala.html @@ -0,0 +1,270 @@ +@(issue: model.Issue, + pullreq: model.PullRequest, + comments: List[model.IssueComment], + collaborators: List[String], + milestones: List[model.Milestone], + 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) + @issues.html.tab("issues", repository) + +
+
+
@avatar(issue.openedUserName, 48)
+
+
+
+ @if(hasWritePermission || loginAccount.map(_.userName == issue.openedUserName).getOrElse(false)){ + Edit + } +
+ @issue.openedUserName opened this issue @datetime(issue.registeredDate) +
+

@issue.title

+
+
+ + @issue.assignedUserName.map { userName => + @avatar(userName, 20) @userName is assigned + }.getOrElse("No one is assigned") + + @if(hasWritePermission){ + @helper.html.dropdown() { +
  • Clear assignee
  • +
  • + @collaborators.map { collaborator => +
  • @avatar(collaborator, 20) @collaborator
  • + } + } + } +
    + + @issue.milestoneId.map { milestoneId => + @milestones.find(_.milestoneId == milestoneId).map { milestone => + Milestone: @milestone.title + } + }.getOrElse("No milestone") + + @if(hasWritePermission){ + @helper.html.dropdown() { +
  • No milestone
  • +
  • + @milestones.map { milestone => +
  • @milestone.title
  • + } + } + } +
    +
    +
    + @markdown(issue.content getOrElse "No description given.", repository, false, true) +
    +
    +
    + @comments.map { comment => +
    @avatar(comment.commentedUserName, 48)
    +
    +
    + + @comment.commentedUserName commented + + @datetime(comment.registeredDate) + @if(hasWritePermission || loginAccount.map(_.userName == comment.commentedUserName).getOrElse(false)){ + + } + +
    +
    + @markdown(comment.content, repository, false, true) +
    +
    + @comment.action.map { action => +
    + @if(action == "close"){ + Closed + @comment.commentedUserName closed the issue @datetime(comment.registeredDate) + } else { + Reopened + @comment.commentedUserName reopened the issue @datetime(comment.registeredDate) + } +
    + } + } + +
    +
    +
    +
    + +
    +
    + This pull request can be automatically merged. +
    +
    + You can also merge branches on the command line. +
    + +
    + +
    +
    + + @if(loginAccount.isDefined){ +
    +
    @avatar(loginAccount.get.userName, 48)
    +
    +
    + @helper.html.preview(repository, "", false, true, "width: 680px; height: 100px;") +
    +
    +
    + + + @if(hasWritePermission || issue.openedUserName == loginAccount.get.userName){ + + } +
    +
    + } +
    +
    + @if(issue.closed) { + Closed + } else { + Open + } +
    + @comments.size @plural(comments.size, "comment") +
    +
    +
    +} + \ No newline at end of file