aboutsummaryrefslogtreecommitdiffstats
path: root/routers/api/v1/repo/pull.go
diff options
context:
space:
mode:
author赵智超 <1012112796@qq.com>2020-08-05 04:55:22 +0800
committerGitHub <noreply@github.com>2020-08-04 21:55:22 +0100
commit8a6790b2aa07fa006d0338669e1da6134a58e313 (patch)
tree3026006db62060a278a028764396d0dd41ef9526 /routers/api/v1/repo/pull.go
parente61c09ed7331e6ea72e4d9f08c0490713598942d (diff)
downloadgitea-8a6790b2aa07fa006d0338669e1da6134a58e313.tar.gz
gitea-8a6790b2aa07fa006d0338669e1da6134a58e313.zip
Add API to update pr headBranch (#12419)
* [API] Add update pr headBranch api Signed-off-by: a1012112796 <1012112796@qq.com>
Diffstat (limited to 'routers/api/v1/repo/pull.go')
-rw-r--r--routers/api/v1/repo/pull.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go
index 5acbb9e297..5fc0cd8cfb 100644
--- a/routers/api/v1/repo/pull.go
+++ b/routers/api/v1/repo/pull.go
@@ -968,3 +968,99 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption)
return headUser, headRepo, headGitRepo, compareInfo, baseBranch, headBranch
}
+
+// UpdatePullRequest merge PR's baseBranch into headBranch
+func UpdatePullRequest(ctx *context.APIContext) {
+ // swagger:operation POST /repos/{owner}/{repo}/pulls/{index}/update repository repoUpdatePullRequest
+ // ---
+ // summary: Merge PR's baseBranch into headBranch
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: owner
+ // in: path
+ // description: owner of the repo
+ // type: string
+ // required: true
+ // - name: repo
+ // in: path
+ // description: name of the repo
+ // type: string
+ // required: true
+ // - name: index
+ // in: path
+ // description: index of the pull request to get
+ // type: integer
+ // format: int64
+ // required: true
+ // responses:
+ // "200":
+ // "$ref": "#/responses/empty"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ // "404":
+ // "$ref": "#/responses/notFound"
+ // "409":
+ // "$ref": "#/responses/error"
+ // "422":
+ // "$ref": "#/responses/validationError"
+
+ pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
+ if err != nil {
+ if models.IsErrPullRequestNotExist(err) {
+ ctx.NotFound()
+ } else {
+ ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err)
+ }
+ return
+ }
+
+ if pr.HasMerged {
+ ctx.Error(http.StatusUnprocessableEntity, "UpdatePullRequest", err)
+ return
+ }
+
+ if err = pr.LoadIssue(); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadIssue", err)
+ return
+ }
+
+ if pr.Issue.IsClosed {
+ ctx.Error(http.StatusUnprocessableEntity, "UpdatePullRequest", err)
+ return
+ }
+
+ if err = pr.LoadBaseRepo(); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadBaseRepo", err)
+ return
+ }
+ if err = pr.LoadHeadRepo(); err != nil {
+ ctx.Error(http.StatusInternalServerError, "LoadHeadRepo", err)
+ return
+ }
+
+ allowedUpdate, err := pull_service.IsUserAllowedToUpdate(pr, ctx.User)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "IsUserAllowedToMerge", err)
+ return
+ }
+
+ if !allowedUpdate {
+ ctx.Status(http.StatusForbidden)
+ return
+ }
+
+ // default merge commit message
+ message := fmt.Sprintf("Merge branch '%s' into %s", pr.BaseBranch, pr.HeadBranch)
+
+ if err = pull_service.Update(pr, ctx.User, message); err != nil {
+ if models.IsErrMergeConflicts(err) {
+ ctx.Error(http.StatusConflict, "Update", "merge failed because of conflict")
+ return
+ }
+ ctx.Error(http.StatusInternalServerError, "pull_service.Update", err)
+ return
+ }
+
+ ctx.Status(http.StatusOK)
+}