diff options
Diffstat (limited to 'routers/api/v1/repo/pull.go')
-rw-r--r-- | routers/api/v1/repo/pull.go | 112 |
1 files changed, 65 insertions, 47 deletions
diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 1c273b7dc9..0392eb8e8c 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -70,6 +70,7 @@ func ListPullRequests(ctx *context.APIContext, form api.ListPullRequestsOptions) // responses: // "200": // "$ref": "#/responses/PullRequestList" + prs, maxResults, err := models.PullRequests(ctx.Repo.Repository.ID, &models.PullRequestsOptions{ Page: ctx.QueryInt("page"), State: ctx.QueryTrim("state"), @@ -79,33 +80,33 @@ func ListPullRequests(ctx *context.APIContext, form api.ListPullRequestsOptions) }) if err != nil { - ctx.Error(500, "PullRequests", err) + ctx.Error(http.StatusInternalServerError, "PullRequests", err) return } apiPrs := make([]*api.PullRequest, len(prs)) for i := range prs { if err = prs[i].LoadIssue(); err != nil { - ctx.Error(500, "LoadIssue", err) + ctx.Error(http.StatusInternalServerError, "LoadIssue", err) return } if err = prs[i].LoadAttributes(); err != nil { - ctx.Error(500, "LoadAttributes", err) + ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) return } if err = prs[i].GetBaseRepo(); err != nil { - ctx.Error(500, "GetBaseRepo", err) + ctx.Error(http.StatusInternalServerError, "GetBaseRepo", err) return } if err = prs[i].GetHeadRepo(); err != nil { - ctx.Error(500, "GetHeadRepo", err) + ctx.Error(http.StatusInternalServerError, "GetHeadRepo", err) return } apiPrs[i] = prs[i].APIFormat() } ctx.SetLinkHeader(int(maxResults), models.ItemsPerPage) - ctx.JSON(200, &apiPrs) + ctx.JSON(http.StatusOK, &apiPrs) } // GetPullRequest returns a single PR based on index @@ -135,25 +136,26 @@ func GetPullRequest(ctx *context.APIContext) { // responses: // "200": // "$ref": "#/responses/PullRequest" + pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { if models.IsErrPullRequestNotExist(err) { ctx.NotFound() } else { - ctx.Error(500, "GetPullRequestByIndex", err) + ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err) } return } if err = pr.GetBaseRepo(); err != nil { - ctx.Error(500, "GetBaseRepo", err) + ctx.Error(http.StatusInternalServerError, "GetBaseRepo", err) return } if err = pr.GetHeadRepo(); err != nil { - ctx.Error(500, "GetHeadRepo", err) + ctx.Error(http.StatusInternalServerError, "GetHeadRepo", err) return } - ctx.JSON(200, pr.APIFormat()) + ctx.JSON(http.StatusOK, pr.APIFormat()) } // CreatePullRequest does what it says @@ -183,6 +185,11 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption // responses: // "201": // "$ref": "#/responses/PullRequest" + // "409": + // "$ref": "#/responses/error" + // "422": + // "$ref": "#/responses/validationError" + var ( repo = ctx.Repo.Repository labelIDs []int64 @@ -201,7 +208,7 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption existingPr, err := models.GetUnmergedPullRequest(headRepo.ID, ctx.Repo.Repository.ID, headBranch, baseBranch) if err != nil { if !models.IsErrPullRequestNotExist(err) { - ctx.Error(500, "GetUnmergedPullRequest", err) + ctx.Error(http.StatusInternalServerError, "GetUnmergedPullRequest", err) return } } else { @@ -213,14 +220,14 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption HeadBranch: existingPr.HeadBranch, BaseBranch: existingPr.BaseBranch, } - ctx.Error(409, "GetUnmergedPullRequest", err) + ctx.Error(http.StatusConflict, "GetUnmergedPullRequest", err) return } if len(form.Labels) > 0 { labels, err := models.GetLabelsInRepoByIDs(ctx.Repo.Repository.ID, form.Labels) if err != nil { - ctx.Error(500, "GetLabelsInRepoByIDs", err) + ctx.Error(http.StatusInternalServerError, "GetLabelsInRepoByIDs", err) return } @@ -236,7 +243,7 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption if models.IsErrMilestoneNotExist(err) { ctx.NotFound() } else { - ctx.Error(500, "GetMilestoneByRepoID", err) + ctx.Error(http.StatusInternalServerError, "GetMilestoneByRepoID", err) } return } @@ -275,9 +282,9 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption assigneeIDs, err := models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees) if err != nil { if models.IsErrUserNotExist(err) { - ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) + ctx.Error(http.StatusUnprocessableEntity, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) } else { - ctx.Error(500, "AddAssigneeByName", err) + ctx.Error(http.StatusInternalServerError, "AddAssigneeByName", err) } return } @@ -285,34 +292,34 @@ func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption for _, aID := range assigneeIDs { assignee, err := models.GetUserByID(aID) if err != nil { - ctx.Error(500, "GetUserByID", err) + ctx.Error(http.StatusInternalServerError, "GetUserByID", err) return } valid, err := models.CanBeAssigned(assignee, repo, true) if err != nil { - ctx.Error(500, "canBeAssigned", err) + ctx.Error(http.StatusInternalServerError, "canBeAssigned", err) return } if !valid { - ctx.Error(422, "canBeAssigned", models.ErrUserDoesNotHaveAccessToRepo{UserID: aID, RepoName: repo.Name}) + ctx.Error(http.StatusUnprocessableEntity, "canBeAssigned", models.ErrUserDoesNotHaveAccessToRepo{UserID: aID, RepoName: repo.Name}) return } } if err := pull_service.NewPullRequest(repo, prIssue, labelIDs, []string{}, pr, assigneeIDs); err != nil { if models.IsErrUserDoesNotHaveAccessToRepo(err) { - ctx.Error(400, "UserDoesNotHaveAccessToRepo", err) + ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err) return } - ctx.Error(500, "NewPullRequest", err) + ctx.Error(http.StatusInternalServerError, "NewPullRequest", err) return } notification.NotifyNewPullRequest(pr) log.Trace("Pull request created: %d/%d", repo.ID, prIssue.ID) - ctx.JSON(201, pr.APIFormat()) + ctx.JSON(http.StatusCreated, pr.APIFormat()) } // EditPullRequest does what it says @@ -348,12 +355,19 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { // responses: // "201": // "$ref": "#/responses/PullRequest" + // "403": + // "$ref": "#/responses/forbidden" + // "412": + // "$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(500, "GetPullRequestByIndex", err) + ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err) } return } @@ -367,7 +381,7 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { issue.Repo = ctx.Repo.Repository if !issue.IsPoster(ctx.User.ID) && !ctx.Repo.CanWrite(models.UnitTypePullRequests) { - ctx.Status(403) + ctx.Status(http.StatusForbidden) return } @@ -388,7 +402,7 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { } if err := models.UpdateIssueDeadline(issue, deadlineUnix, ctx.User); err != nil { - ctx.Error(500, "UpdateIssueDeadline", err) + ctx.Error(http.StatusInternalServerError, "UpdateIssueDeadline", err) return } issue.DeadlineUnix = deadlineUnix @@ -406,9 +420,9 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { err = issue_service.UpdateAssignees(issue, form.Assignee, form.Assignees, ctx.User) if err != nil { if models.IsErrUserNotExist(err) { - ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) + ctx.Error(http.StatusUnprocessableEntity, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) } else { - ctx.Error(500, "UpdateAssignees", err) + ctx.Error(http.StatusInternalServerError, "UpdateAssignees", err) } return } @@ -419,7 +433,7 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { oldMilestoneID := issue.MilestoneID issue.MilestoneID = form.Milestone if err = issue_service.ChangeMilestoneAssign(issue, ctx.User, oldMilestoneID); err != nil { - ctx.Error(500, "ChangeMilestoneAssign", err) + ctx.Error(http.StatusInternalServerError, "ChangeMilestoneAssign", err) return } } @@ -427,17 +441,17 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { if ctx.Repo.CanWrite(models.UnitTypePullRequests) && form.Labels != nil { labels, err := models.GetLabelsInRepoByIDs(ctx.Repo.Repository.ID, form.Labels) if err != nil { - ctx.Error(500, "GetLabelsInRepoByIDsError", err) + ctx.Error(http.StatusInternalServerError, "GetLabelsInRepoByIDsError", err) return } if err = issue.ReplaceLabels(labels, ctx.User); err != nil { - ctx.Error(500, "ReplaceLabelsError", err) + ctx.Error(http.StatusInternalServerError, "ReplaceLabelsError", err) return } } if err = models.UpdateIssue(issue); err != nil { - ctx.Error(500, "UpdateIssue", err) + ctx.Error(http.StatusInternalServerError, "UpdateIssue", err) return } if form.State != nil { @@ -446,7 +460,7 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { ctx.Error(http.StatusPreconditionFailed, "DependenciesLeft", "cannot close this pull request because it still has open dependencies") return } - ctx.Error(500, "ChangeStatus", err) + ctx.Error(http.StatusInternalServerError, "ChangeStatus", err) return } } @@ -457,13 +471,13 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { if models.IsErrPullRequestNotExist(err) { ctx.NotFound() } else { - ctx.Error(500, "GetPullRequestByIndex", err) + ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err) } return } // TODO this should be 200, not 201 - ctx.JSON(201, pr.APIFormat()) + ctx.JSON(http.StatusCreated, pr.APIFormat()) } // IsPullRequestMerged checks if a PR exists given an index @@ -495,18 +509,19 @@ func IsPullRequestMerged(ctx *context.APIContext) { // description: pull request has been merged // "404": // description: pull request has not been merged + pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { if models.IsErrPullRequestNotExist(err) { ctx.NotFound() } else { - ctx.Error(500, "GetPullRequestByIndex", err) + ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err) } return } if pr.HasMerged { - ctx.Status(204) + ctx.Status(http.StatusNoContent) } ctx.NotFound() } @@ -544,12 +559,15 @@ func MergePullRequest(ctx *context.APIContext, form auth.MergePullRequestForm) { // "$ref": "#/responses/empty" // "405": // "$ref": "#/responses/empty" + // "409": + // "$ref": "#/responses/error" + pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { if models.IsErrPullRequestNotExist(err) { ctx.NotFound("GetPullRequestByIndex", err) } else { - ctx.Error(500, "GetPullRequestByIndex", err) + ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err) } return } @@ -569,7 +587,7 @@ func MergePullRequest(ctx *context.APIContext, form auth.MergePullRequestForm) { if ctx.IsSigned { // Update issue-user. if err = pr.Issue.ReadBy(ctx.User.ID); err != nil { - ctx.Error(500, "ReadBy", err) + ctx.Error(http.StatusInternalServerError, "ReadBy", err) return } } @@ -580,18 +598,18 @@ func MergePullRequest(ctx *context.APIContext, form auth.MergePullRequestForm) { } if !pr.CanAutoMerge() || pr.HasMerged || pr.IsWorkInProgress() { - ctx.Status(405) + ctx.Status(http.StatusMethodNotAllowed) return } isPass, err := pull_service.IsPullCommitStatusPass(pr) if err != nil { - ctx.Error(500, "IsPullCommitStatusPass", err) + ctx.Error(http.StatusInternalServerError, "IsPullCommitStatusPass", err) return } if !isPass && !ctx.IsUserRepoAdmin() { - ctx.Status(405) + ctx.Status(http.StatusMethodNotAllowed) return } @@ -616,7 +634,7 @@ func MergePullRequest(ctx *context.APIContext, form auth.MergePullRequestForm) { if err := pull_service.Merge(pr, ctx.User, ctx.Repo.GitRepo, models.MergeStyle(form.Do), message); err != nil { if models.IsErrInvalidMergeStyle(err) { - ctx.Status(405) + ctx.Status(http.StatusMethodNotAllowed) return } else if models.IsErrMergeConflicts(err) { conflictError := err.(models.ErrMergeConflicts) @@ -628,15 +646,15 @@ func MergePullRequest(ctx *context.APIContext, form auth.MergePullRequestForm) { conflictError := err.(models.ErrMergeUnrelatedHistories) ctx.JSON(http.StatusConflict, conflictError) } else if models.IsErrMergePushOutOfDate(err) { - ctx.Status(http.StatusConflict) + ctx.Error(http.StatusConflict, "Merge", "merge push out of date") return } - ctx.Error(500, "Merge", err) + ctx.Error(http.StatusInternalServerError, "Merge", err) return } log.Trace("Pull request merged: %d", pr.ID) - ctx.Status(200) + ctx.Status(http.StatusOK) } func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) (*models.User, *models.Repository, *git.Repository, *git.CompareInfo, string, string) { @@ -706,7 +724,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) } else { headGitRepo, err = git.OpenRepository(models.RepoPath(headUser.Name, headRepo.Name)) if err != nil { - ctx.Error(500, "OpenRepository", err) + ctx.Error(http.StatusInternalServerError, "OpenRepository", err) return nil, nil, nil, nil, "", "" } } @@ -759,7 +777,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) compareInfo, err := headGitRepo.GetCompareInfo(models.RepoPath(baseRepo.Owner.Name, baseRepo.Name), baseBranch, headBranch) if err != nil { headGitRepo.Close() - ctx.Error(500, "GetCompareInfo", err) + ctx.Error(http.StatusInternalServerError, "GetCompareInfo", err) return nil, nil, nil, nil, "", "" } |