summaryrefslogtreecommitdiffstats
path: root/routers/repo/pull.go
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2020-01-17 07:03:40 +0100
committerLauris BH <lauris@nix.lv>2020-01-17 08:03:40 +0200
commit36943e56d66a2d711a6b0c27219ce91a3ddc020a (patch)
tree6e1c57454beeaa9d64470c82db1140a5f540ad65 /routers/repo/pull.go
parent9f40bb020eaea153eca77d3071a4f2cc8bcd2a8e (diff)
downloadgitea-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.go82
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)