summaryrefslogtreecommitdiffstats
path: root/routers/repo/pull.go
diff options
context:
space:
mode:
Diffstat (limited to 'routers/repo/pull.go')
-rw-r--r--routers/repo/pull.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index 559d9b267a..f8612d2b3b 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -11,6 +11,7 @@ import (
"crypto/subtle"
"fmt"
"html"
+ "net/http"
"path"
"strings"
@@ -467,6 +468,7 @@ func ViewPullCommits(ctx *context.Context) {
ctx.Data["Commits"] = commits
ctx.Data["CommitCount"] = commits.Len()
+ getBranchData(ctx, issue)
ctx.HTML(200, tplPullCommits)
}
@@ -596,6 +598,7 @@ func ViewPullFiles(ctx *context.Context) {
ctx.ServerError("GetCurrentReview", err)
return
}
+ getBranchData(ctx, issue)
ctx.HTML(200, tplPullFiles)
}
@@ -1010,3 +1013,74 @@ func DownloadPullDiffOrPatch(ctx *context.Context, patch bool) {
return
}
}
+
+// UpdatePullRequestTarget change pull request's target branch
+func UpdatePullRequestTarget(ctx *context.Context) {
+ issue := GetActionIssue(ctx)
+ pr := issue.PullRequest
+ if ctx.Written() {
+ return
+ }
+ if !issue.IsPull {
+ ctx.Error(http.StatusNotFound)
+ return
+ }
+
+ if !ctx.IsSigned || (!issue.IsPoster(ctx.User.ID) && !ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull)) {
+ ctx.Error(http.StatusForbidden)
+ return
+ }
+
+ targetBranch := ctx.QueryTrim("target_branch")
+ if len(targetBranch) == 0 {
+ ctx.Error(http.StatusNoContent)
+ return
+ }
+
+ if err := pull_service.ChangeTargetBranch(pr, ctx.User, targetBranch); err != nil {
+ if models.IsErrPullRequestAlreadyExists(err) {
+ err := err.(models.ErrPullRequestAlreadyExists)
+
+ RepoRelPath := ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name
+ errorMessage := ctx.Tr("repo.pulls.has_pull_request", ctx.Repo.RepoLink, RepoRelPath, err.IssueID)
+
+ ctx.Flash.Error(errorMessage)
+ ctx.JSON(http.StatusConflict, map[string]interface{}{
+ "error": err.Error(),
+ "user_error": errorMessage,
+ })
+ } else if models.IsErrIssueIsClosed(err) {
+ errorMessage := ctx.Tr("repo.pulls.is_closed")
+
+ ctx.Flash.Error(errorMessage)
+ ctx.JSON(http.StatusConflict, map[string]interface{}{
+ "error": err.Error(),
+ "user_error": errorMessage,
+ })
+ } else if models.IsErrPullRequestHasMerged(err) {
+ errorMessage := ctx.Tr("repo.pulls.has_merged")
+
+ ctx.Flash.Error(errorMessage)
+ ctx.JSON(http.StatusConflict, map[string]interface{}{
+ "error": err.Error(),
+ "user_error": errorMessage,
+ })
+ } else if models.IsErrBranchesEqual(err) {
+ errorMessage := ctx.Tr("repo.pulls.nothing_to_compare")
+
+ ctx.Flash.Error(errorMessage)
+ ctx.JSON(http.StatusBadRequest, map[string]interface{}{
+ "error": err.Error(),
+ "user_error": errorMessage,
+ })
+ } else {
+ ctx.ServerError("UpdatePullRequestTarget", err)
+ }
+ return
+ }
+ notification.NotifyPullRequestChangeTargetBranch(ctx.User, pr, targetBranch)
+
+ ctx.JSON(http.StatusOK, map[string]interface{}{
+ "base_branch": pr.BaseBranch,
+ })
+}