diff options
author | 6543 <6543@obermui.de> | 2020-01-17 07:03:40 +0100 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2020-01-17 08:03:40 +0200 |
commit | 36943e56d66a2d711a6b0c27219ce91a3ddc020a (patch) | |
tree | 6e1c57454beeaa9d64470c82db1140a5f540ad65 /routers/repo/pull.go | |
parent | 9f40bb020eaea153eca77d3071a4f2cc8bcd2a8e (diff) | |
download | gitea-36943e56d66a2d711a6b0c27219ce91a3ddc020a.tar.gz gitea-36943e56d66a2d711a6b0c27219ce91a3ddc020a.zip |
Add "Update Branch" button to Pull Requests (#9784)
* add Divergence
* add Update Button
* first working version
* re-use code
* split raw merge commands and db-change functions (notify, cache, ...)
* use rawMerge (remove redundant code)
* own function to get Diverging of PRs
* use FlashError
* correct Error Msg
* hook is triggerd ... so remove comment
* add "branch2" to "user2/repo1" because it unit-test "TestPullView_ReviewerMissed" use it but dont exist jet :/
* move GetPerm to IsUserAllowedToUpdate
* add Flash Success MSG
* imprufe code
- remove useless js chage
* fix-lint
* TEST: add PullRequest ID:5
Repo: user2/repo1
Base: branch1
Head: pr-to-update
* correct comments
* make PR5 outdated
* fix Tests
* WIP: add pull update test
* update revs
* update locales
* working TEST
* update UI
* misspell
* change style
* add 1s delay so rev exist
* move row up (before merge row)
* fix lint nit
* UI remove divider
* Update style
* nits
* do it right
* introduce IsSameRepo
* remove useless check
Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'routers/repo/pull.go')
-rw-r--r-- | routers/repo/pull.go | 82 |
1 files changed, 81 insertions, 1 deletions
diff --git a/routers/repo/pull.go b/routers/repo/pull.go index 901ab48856..fc0012ffbe 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -14,6 +14,7 @@ import ( "net/http" "path" "strings" + "time" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/auth" @@ -342,8 +343,21 @@ func PrepareViewPullInfo(ctx *context.Context, issue *models.Issue) *git.Compare setMergeTarget(ctx, pull) + divergence, err := pull_service.GetDiverging(pull) + if err != nil { + ctx.ServerError("GetDiverging", err) + return nil + } + ctx.Data["Divergence"] = divergence + allowUpdate, err := pull_service.IsUserAllowedToUpdate(pull, ctx.User) + if err != nil { + ctx.ServerError("GetDiverging", err) + return nil + } + ctx.Data["UpdateAllowed"] = allowUpdate + if err := pull.LoadProtectedBranch(); err != nil { - ctx.ServerError("GetLatestCommitStatus", err) + ctx.ServerError("LoadProtectedBranch", err) return nil } ctx.Data["EnableStatusCheck"] = pull.ProtectedBranch != nil && pull.ProtectedBranch.EnableStatusCheck @@ -587,6 +601,72 @@ func ViewPullFiles(ctx *context.Context) { ctx.HTML(200, tplPullFiles) } +// UpdatePullRequest merge master into PR +func UpdatePullRequest(ctx *context.Context) { + issue := checkPullInfo(ctx) + if ctx.Written() { + return + } + if issue.IsClosed { + ctx.NotFound("MergePullRequest", nil) + return + } + if issue.PullRequest.HasMerged { + ctx.NotFound("MergePullRequest", nil) + return + } + + if err := issue.PullRequest.LoadBaseRepo(); err != nil { + ctx.InternalServerError(err) + return + } + if err := issue.PullRequest.LoadHeadRepo(); err != nil { + ctx.InternalServerError(err) + return + } + + allowedUpdate, err := pull_service.IsUserAllowedToUpdate(issue.PullRequest, ctx.User) + if err != nil { + ctx.ServerError("IsUserAllowedToMerge", err) + return + } + + // ToDo: add check if maintainers are allowed to change branch ... (need migration & co) + if !allowedUpdate { + ctx.Flash.Error(ctx.Tr("repo.pulls.update_not_allowed")) + ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index)) + return + } + + // default merge commit message + message := fmt.Sprintf("Merge branch '%s' into %s", issue.PullRequest.BaseBranch, issue.PullRequest.HeadBranch) + + if err = pull_service.Update(issue.PullRequest, ctx.User, message); err != nil { + sanitize := func(x string) string { + runes := []rune(x) + + if len(runes) > 512 { + x = "..." + string(runes[len(runes)-512:]) + } + + return strings.Replace(html.EscapeString(x), "\n", "<br>", -1) + } + if models.IsErrMergeConflicts(err) { + conflictError := err.(models.ErrMergeConflicts) + ctx.Flash.Error(ctx.Tr("repo.pulls.merge_conflict", sanitize(conflictError.StdErr), sanitize(conflictError.StdOut))) + ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index)) + return + } + ctx.Flash.Error(err.Error()) + ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index)) + } + + time.Sleep(1 * time.Second) + + ctx.Flash.Success(ctx.Tr("repo.pulls.update_branch_success")) + ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index)) +} + // MergePullRequest response for merging pull request func MergePullRequest(ctx *context.Context, form auth.MergePullRequestForm) { issue := checkPullInfo(ctx) |