149 lines
4.1 KiB
Go
149 lines
4.1 KiB
Go
package repo
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"code.gitea.io/gitea/models"
|
|
"code.gitea.io/gitea/modules/context"
|
|
"code.gitea.io/gitea/modules/convert"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
api "code.gitea.io/gitea/modules/structs"
|
|
"code.gitea.io/gitea/routers/api/v1/utils"
|
|
"code.gitea.io/gitea/services/gitdiff"
|
|
)
|
|
|
|
// ListPullRequestVersions returns a list of all PR versions
|
|
func ListPullRequestVersions(ctx *context.APIContext) {
|
|
// swagger:operation GET /repos/{owner}/{repo}/pulls/{index}/versions repository repoListPullRequestVersions
|
|
// ---
|
|
// summary: List a repos's pull versions requests***
|
|
// produces:
|
|
// - application/json
|
|
// 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
|
|
// - name: page
|
|
// in: query
|
|
// description: page number of results to return (1-based)
|
|
// type: integer
|
|
// - name: limit
|
|
// in: query
|
|
// description: page size of results
|
|
// type: integer
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/PullRequestVersionList"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
|
|
if err != nil {
|
|
if models.IsErrPullRequestNotExist(err) {
|
|
ctx.NotFound()
|
|
} else {
|
|
ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err)
|
|
}
|
|
}
|
|
|
|
lisOptions := utils.GetListOptions(ctx)
|
|
prvs, maxResults, err := models.PullRequestVersions(pr.ID, &lisOptions)
|
|
if err != nil {
|
|
ctx.Error(http.StatusInternalServerError, "PullRequestVersions", err)
|
|
return
|
|
}
|
|
|
|
apiPrvs := make([]*api.PullRequestVersion, len(prvs))
|
|
for i := range prvs {
|
|
apiPrvs[i] = convert.ToAPIPullRequestVersion(prvs[i])
|
|
}
|
|
|
|
ctx.SetLinkHeader(int(maxResults), lisOptions.PageSize)
|
|
ctx.Header().Set("X-Total", fmt.Sprintf("%d", maxResults))
|
|
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
|
|
ctx.Header().Set("Access-Control-Expose-Headers", "X-Total-Count, Link, X-Total")
|
|
|
|
ctx.JSON(http.StatusOK, &apiPrvs)
|
|
}
|
|
|
|
// GetPullRequestVersionDiff
|
|
func GetPullRequestVersionDiff(ctx *context.APIContext) {
|
|
// swagger:operation GET /repos/{owner}/{repo}/pulls/{index}/versions/{versionId}/diff repository repoGetPullRequestVersionDiff
|
|
// ---
|
|
// summary: Get a pull request version diffs***
|
|
// produces:
|
|
// - application/json
|
|
// parameters:
|
|
// - name: owner
|
|
// in: path
|
|
// description: owner of the repo
|
|
// type: string
|
|
// required: true
|
|
// - name: repo
|
|
// in: path
|
|
// description: owner 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
|
|
// - name: versionId
|
|
// in: path
|
|
// description: id of the pull request version to get
|
|
// type: integer
|
|
// format: int64
|
|
// required: true
|
|
// responses:
|
|
// "200":
|
|
// "$ref": "#/responses/Diff"
|
|
// "404":
|
|
// "$ref": "#/responses/notFound"
|
|
|
|
if ctx.Repo.Repository.IsEmpty {
|
|
ctx.NotFound()
|
|
return
|
|
}
|
|
|
|
pr, err := models.GetPullRequestByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
|
|
if err != nil {
|
|
if models.IsErrPullRequestNotExist(err) {
|
|
ctx.NotFound()
|
|
} else {
|
|
ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
prv, err := models.GetPullRequestVersionByID(pr.ID, ctx.ParamsInt64(":versionId"))
|
|
if err != nil {
|
|
if models.IsErrPullRequestNotExist(err) {
|
|
ctx.NotFound()
|
|
} else {
|
|
ctx.Error(http.StatusInternalServerError, "GetPullRequestVersionByID", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
if diffs, err := gitdiff.GetDiffRange(ctx.Repo.GitRepo, prv.BaseCommitID, prv.HeadCommitID, setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles); err == nil {
|
|
ctx.JSON(http.StatusOK, diffs)
|
|
} else {
|
|
ctx.Error(http.StatusInternalServerError, "GetDiffRange", err)
|
|
}
|
|
}
|