diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index fcddd27..eae7523 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -46,7 +46,10 @@ "requestRepositoryName" -> trim(text(required, maxlength(100))), "requestBranch" -> trim(text(required, maxlength(100))), "commitIdFrom" -> trim(text(required, maxlength(40))), - "commitIdTo" -> trim(text(required, maxlength(40))) + "commitIdTo" -> trim(text(required, maxlength(40))), + "assignedUserName" -> trim(optional(text())), + "milestoneId" -> trim(optional(number())), + "labelNames" -> trim(optional(text())) )(PullRequestForm.apply) val mergeForm = mapping( @@ -62,7 +65,11 @@ requestRepositoryName: String, requestBranch: String, commitIdFrom: String, - commitIdTo: String) + commitIdTo: String, + assignedUserName: Option[String], + milestoneId: Option[Int], + labelNames: Option[String] + ) case class MergeForm(message: String) @@ -332,7 +339,12 @@ forkedRepository, originRepository, forkedRepository, - hasWritePermission(forkedRepository.owner, forkedRepository.name, context.loginAccount)) + hasWritePermission(originRepository.owner, originRepository.name, context.loginAccount), + hasWritePermission(forkedRepository.owner, forkedRepository.name, context.loginAccount), + (getCollaborators(originRepository.owner, originRepository.name) ::: (if(getAccountByUserName(originRepository.owner).get.isGroupAccount) Nil else List(originRepository.owner))).sorted, + getMilestones(originRepository.owner, originRepository.name), + getLabels(originRepository.owner, originRepository.name) + ) } }) getOrElse NotFound }) @@ -368,46 +380,61 @@ }) post("/:owner/:repository/pulls/new", pullRequestForm)(referrersOnly { (form, repository) => - val loginUserName = context.loginAccount.get.userName + defining(repository.owner, repository.name){ case (owner, name) => + val writable = hasWritePermission(owner, name, context.loginAccount) + val loginUserName = context.loginAccount.get.userName - val issueId = createIssue( - owner = repository.owner, - repository = repository.name, - loginUser = loginUserName, - title = form.title, - content = form.content, - assignedUserName = None, - milestoneId = None, - isPullRequest = true) + val issueId = createIssue( + owner = repository.owner, + repository = repository.name, + loginUser = loginUserName, + title = form.title, + content = form.content, + assignedUserName = if(writable) form.assignedUserName else None, + milestoneId = if(writable) form.milestoneId else None, + isPullRequest = true) - createPullRequest( - originUserName = repository.owner, - originRepositoryName = repository.name, - issueId = issueId, - originBranch = form.targetBranch, - requestUserName = form.requestUserName, - requestRepositoryName = form.requestRepositoryName, - requestBranch = form.requestBranch, - commitIdFrom = form.commitIdFrom, - commitIdTo = form.commitIdTo) + createPullRequest( + originUserName = repository.owner, + originRepositoryName = repository.name, + issueId = issueId, + originBranch = form.targetBranch, + requestUserName = form.requestUserName, + requestRepositoryName = form.requestRepositoryName, + requestBranch = form.requestBranch, + commitIdFrom = form.commitIdFrom, + commitIdTo = form.commitIdTo) - // fetch requested branch - fetchAsPullRequest(repository.owner, repository.name, form.requestUserName, form.requestRepositoryName, form.requestBranch, issueId) - - // record activity - recordPullRequestActivity(repository.owner, repository.name, loginUserName, issueId, form.title) - - // call web hook - callPullRequestWebHook("opened", repository, issueId, context.baseUrl, context.loginAccount.get) - - // notifications - getIssue(repository.owner, repository.name, issueId.toString) foreach { issue => - Notifier().toNotify(repository, issue, form.content.getOrElse("")){ - Notifier.msgPullRequest(s"${context.baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}") + // insert labels + if(writable){ + form.labelNames.map { value => + val labels = getLabels(owner, name) + value.split(",").foreach { labelName => + labels.find(_.labelName == labelName).map { label => + registerIssueLabel(repository.owner, repository.name, issueId, label.labelId) + } + } + } } - } - redirect(s"/${repository.owner}/${repository.name}/pull/${issueId}") + // fetch requested branch + fetchAsPullRequest(owner, name, form.requestUserName, form.requestRepositoryName, form.requestBranch, issueId) + + // record activity + recordPullRequestActivity(owner, name, loginUserName, issueId, form.title) + + // call web hook + callPullRequestWebHook("opened", repository, issueId, context.baseUrl, context.loginAccount.get) + + // notifications + getIssue(owner, name, issueId.toString) foreach { issue => + Notifier().toNotify(repository, issue, form.content.getOrElse("")){ + Notifier.msgPullRequest(s"${context.baseUrl}/${owner}/${name}/pull/${issueId}") + } + } + + redirect(s"/${owner}/${name}/pull/${issueId}") + } }) /** diff --git a/src/main/twirl/gitbucket/core/issues/create.scala.html b/src/main/twirl/gitbucket/core/issues/create.scala.html index 75bb566..d36fab8 100644 --- a/src/main/twirl/gitbucket/core/issues/create.scala.html +++ b/src/main/twirl/gitbucket/core/issues/create.scala.html @@ -16,7 +16,7 @@
Showing you all comments on commits in this comparison.
- @issues.html.commentlist(None, comments, hasWritePermission, repository, None) + @issues.html.commentlist(None, comments, hasForkedWritePermission, repository, None) } } } @@ -174,7 +179,7 @@ $('#show-form').click(); } - @if(hasWritePermission){ + @if(hasForkedWritePermission){ function checkConflict(from, to){ $('.check-conflict').show(); $.get('@url(repository)/compare/' + from + '...' + to + '/mergecheck', diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 9836b58..4a6904e 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -60,6 +60,10 @@ .head .octicon,.head .mega-octicon{ color : #BBB; } + +.align-right { + text-align: right; +} /* ======================================================================== */ /* Global Header */ /* ======================================================================== */