Provide diff and patch API endpoints (#11751)
* 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>
This commit is contained in:
		
							parent
							
								
									17f8de7a54
								
							
						
					
					
						commit
						f761a37a0f
					
				| @ -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": { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user