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 @@
- + @helper.html.preview( repository = repository, content = "", @@ -24,14 +24,14 @@ enableRefsLink = true, enableTaskList = true, hasWritePermission = hasWritePermission, - style = "width: 565px; height: 200px; max-height: 250px;", + style = "width: 690px; height: 200px; max-height: 250px;", elastic = true ) +
+ +
-
- -
@issueinfo(None, Nil, Nil, collaborators, milestones.map(x => (x, 0, 0)), labels, hasWritePermission, repository) diff --git a/src/main/twirl/gitbucket/core/pulls/compare.scala.html b/src/main/twirl/gitbucket/core/pulls/compare.scala.html index 569b6a2..1a22858 100644 --- a/src/main/twirl/gitbucket/core/pulls/compare.scala.html +++ b/src/main/twirl/gitbucket/core/pulls/compare.scala.html @@ -9,7 +9,11 @@ repository: gitbucket.core.service.RepositoryService.RepositoryInfo, originRepository: gitbucket.core.service.RepositoryService.RepositoryInfo, forkedRepository: gitbucket.core.service.RepositoryService.RepositoryInfo, - hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context) + hasOriginWritePermission: Boolean, + hasForkedWritePermission: Boolean, + collaborators: List[String], + milestones: List[gitbucket.core.model.Milestone], + labels: List[gitbucket.core.model.Label])(implicit context: gitbucket.core.controller.Context) @import context._ @import gitbucket.core.view.helpers._ @html.main(s"Pull Requests - ${repository.owner}/${repository.name}", Some(repository)){ @@ -47,27 +51,27 @@ Checking...
- @if(commits.nonEmpty && hasWritePermission){ + @if(commits.nonEmpty && hasForkedWritePermission){
Create pull request
@pulls.html.commits(commits, Some(comments), repository) - @helper.html.diff(diffs, repository, Some(commitId), Some(sourceId), true, None, hasWritePermission, false) + @helper.html.diff(diffs, repository, Some(commitId), Some(sourceId), true, None, hasForkedWritePermission, false)

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 */ /* ======================================================================== */