diff options
author | zeripath <art27@cantab.net> | 2021-12-20 00:32:54 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-20 08:32:54 +0800 |
commit | e4e411821d985cf8f9007d9640909ab9ee271dd7 (patch) | |
tree | 11af3c3a933949d0561f1e292acd8296181a63db /routers/api | |
parent | b24a965b81d5aa4e7bd87c6a4c6370d7e0ec9a50 (diff) | |
download | gitea-e4e411821d985cf8f9007d9640909ab9ee271dd7.tar.gz gitea-e4e411821d985cf8f9007d9640909ab9ee271dd7.zip |
Abort merge if head has been updated before pressing merge (#18032)
* Abort merge if head has been updated before pressing merge
It is possible that a PR head may be pushed to between the merge page being shown
and the merge button being pressed. Pass the current expected head in as a parameter
and cancel the merge if it has changed.
Fix #18028
Signed-off-by: Andrew Thornton <art27@cantab.net>
* adjust swagger
Signed-off-by: Andrew Thornton <art27@cantab.net>
* fix test
Signed-off-by: Andrew Thornton <art27@cantab.net>
* placate lint
Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'routers/api')
-rw-r--r-- | routers/api/v1/repo/pull.go | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 4c774e8af7..2b7280d39b 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -838,7 +838,7 @@ func MergePullRequest(ctx *context.APIContext) { message += "\n\n" + form.MergeMessageField } - if err := pull_service.Merge(pr, ctx.User, ctx.Repo.GitRepo, repo_model.MergeStyle(form.Do), message); err != nil { + if err := pull_service.Merge(pr, ctx.User, ctx.Repo.GitRepo, repo_model.MergeStyle(form.Do), form.HeadCommitID, message); err != nil { if models.IsErrInvalidMergeStyle(err) { ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do))) return @@ -854,6 +854,9 @@ func MergePullRequest(ctx *context.APIContext) { } else if git.IsErrPushOutOfDate(err) { ctx.Error(http.StatusConflict, "Merge", "merge push out of date") return + } else if models.IsErrSHADoesNotMatch(err) { + ctx.Error(http.StatusConflict, "Merge", "head out of date") + return } else if git.IsErrPushRejected(err) { errPushRej := err.(*git.ErrPushRejected) if len(errPushRej.Message) == 0 { |