* Provide diff and patch API endpoints The diff and patch endpoints on the main routes are not accessible by token therefore we provide new API based endpoints for these Fix #10923 Signed-off-by: Andrew Thornton <art27@cantab.net> * placate swagger Signed-off-by: Andrew Thornton <art27@cantab.net> * Make the response an actual string Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: Lauris BH <lauris@nix.lv>tags/v1.13.0-rc1
@@ -65,6 +65,10 @@ type APINotFound struct{} | |||
// swagger:response redirect | |||
type APIRedirect struct{} | |||
//APIString is a string response | |||
// swagger:response string | |||
type APIString string | |||
// Error responds with an error message to client with given obj as the message. | |||
// If status is 500, also it prints error to log. | |||
func (ctx *APIContext) Error(status int, title string, obj interface{}) { |
@@ -796,6 +796,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
m.Group("/:index", func() { | |||
m.Combo("").Get(repo.GetPullRequest). | |||
Patch(reqToken(), reqRepoWriter(models.UnitTypePullRequests), bind(api.EditPullRequestOption{}), repo.EditPullRequest) | |||
m.Get(".diff", repo.DownloadPullDiff) | |||
m.Get(".patch", repo.DownloadPullPatch) | |||
m.Combo("/merge").Get(repo.IsPullRequestMerged). | |||
Post(reqToken(), mustNotBeArchived, bind(auth.MergePullRequestForm{}), repo.MergePullRequest) | |||
m.Group("/reviews", func() { |
@@ -169,6 +169,88 @@ func GetPullRequest(ctx *context.APIContext) { | |||
ctx.JSON(http.StatusOK, convert.ToAPIPullRequest(pr)) | |||
} | |||
// DownloadPullDiff render a pull's raw diff | |||
func DownloadPullDiff(ctx *context.APIContext) { | |||
// swagger:operation GET /repos/{owner}/{repo}/pulls/{index}.diff repository repoDownloadPullDiff | |||
// --- | |||
// summary: Get a pull request diff | |||
// produces: | |||
// - text/plain | |||
// parameters: | |||
// - name: owner | |||
// in: path | |||
// description: owner of the repo | |||
// type: string | |||
// required: true | |||
// - name: repo | |||
// in: path | |||
// description: name of the repo | |||
// type: string | |||
// required: true | |||
// - name: index | |||
// in: path | |||
// description: index of the pull request to get | |||
// type: integer | |||
// format: int64 | |||
// required: true | |||
// responses: | |||
// "200": | |||
// "$ref": "#/responses/string" | |||
// "404": | |||
// "$ref": "#/responses/notFound" | |||
DownloadPullDiffOrPatch(ctx, false) | |||
} | |||
// DownloadPullPatch render a pull's raw patch | |||
func DownloadPullPatch(ctx *context.APIContext) { | |||
// swagger:operation GET /repos/{owner}/{repo}/pulls/{index}.patch repository repoDownloadPullPatch | |||
// --- | |||
// summary: Get a pull request patch file | |||
// produces: | |||
// - text/plain | |||
// parameters: | |||
// - name: owner | |||
// in: path | |||
// description: owner of the repo | |||
// type: string | |||
// required: true | |||
// - name: repo | |||
// in: path | |||
// description: name of the repo | |||
// type: string | |||
// required: true | |||
// - name: index | |||
// in: path | |||
// description: index of the pull request to get | |||
// type: integer | |||
// format: int64 | |||
// required: true | |||
// responses: | |||
// "200": | |||
// "$ref": "#/responses/string" | |||
// "404": | |||
// "$ref": "#/responses/notFound" | |||
DownloadPullDiffOrPatch(ctx, true) | |||
} | |||
// DownloadPullDiffOrPatch render a pull's raw diff or patch | |||
func DownloadPullDiffOrPatch(ctx *context.APIContext, patch bool) { | |||
pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) | |||
if err != nil { | |||
if models.IsErrPullRequestNotExist(err) { | |||
ctx.NotFound() | |||
} else { | |||
ctx.InternalServerError(err) | |||
} | |||
return | |||
} | |||
if err := pull_service.DownloadDiffOrPatch(pr, ctx, patch); err != nil { | |||
ctx.InternalServerError(err) | |||
return | |||
} | |||
} | |||
// CreatePullRequest does what it says | |||
func CreatePullRequest(ctx *context.APIContext, form api.CreatePullRequestOption) { | |||
// swagger:operation POST /repos/{owner}/{repo}/pulls repository repoCreatePullRequest |
@@ -6649,6 +6649,94 @@ | |||
} | |||
} | |||
}, | |||
"/repos/{owner}/{repo}/pulls/{index}.diff": { | |||
"get": { | |||
"produces": [ | |||
"text/plain" | |||
], | |||
"tags": [ | |||
"repository" | |||
], | |||
"summary": "Get a pull request diff", | |||
"operationId": "repoDownloadPullDiff", | |||
"parameters": [ | |||
{ | |||
"type": "string", | |||
"description": "owner of the repo", | |||
"name": "owner", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "string", | |||
"description": "name of the repo", | |||
"name": "repo", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "integer", | |||
"format": "int64", | |||
"description": "index of the pull request to get", | |||
"name": "index", | |||
"in": "path", | |||
"required": true | |||
} | |||
], | |||
"responses": { | |||
"200": { | |||
"$ref": "#/responses/string" | |||
}, | |||
"404": { | |||
"$ref": "#/responses/notFound" | |||
} | |||
} | |||
} | |||
}, | |||
"/repos/{owner}/{repo}/pulls/{index}.patch": { | |||
"get": { | |||
"produces": [ | |||
"text/plain" | |||
], | |||
"tags": [ | |||
"repository" | |||
], | |||
"summary": "Get a pull request patch file", | |||
"operationId": "repoDownloadPullPatch", | |||
"parameters": [ | |||
{ | |||
"type": "string", | |||
"description": "owner of the repo", | |||
"name": "owner", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "string", | |||
"description": "name of the repo", | |||
"name": "repo", | |||
"in": "path", | |||
"required": true | |||
}, | |||
{ | |||
"type": "integer", | |||
"format": "int64", | |||
"description": "index of the pull request to get", | |||
"name": "index", | |||
"in": "path", | |||
"required": true | |||
} | |||
], | |||
"responses": { | |||
"200": { | |||
"$ref": "#/responses/string" | |||
}, | |||
"404": { | |||
"$ref": "#/responses/notFound" | |||
} | |||
} | |||
} | |||
}, | |||
"/repos/{owner}/{repo}/pulls/{index}/merge": { | |||
"get": { | |||
"produces": [ | |||
@@ -15209,6 +15297,12 @@ | |||
"redirect": { | |||
"description": "APIRedirect is a redirect response" | |||
}, | |||
"string": { | |||
"description": "APIString is a string response", | |||
"schema": { | |||
"type": "string" | |||
} | |||
}, | |||
"validationError": { | |||
"description": "APIValidationError is error format response related to input validation", | |||
"headers": { |