Consolidate API for getting single commit (#11368)
* Allow Git ref for /repos/{owner}/{repo}/git/commits/{sha} * Consolidate API for getting single commit * Fix tests and do it differently Co-authored-by: zeripath <art27@cantab.net>release/v1.15
parent
59b9b77a0d
commit
32b8172e56
|
@ -21,18 +21,14 @@ func TestAPIReposGitCommits(t *testing.T) {
|
||||||
session := loginUser(t, user.Name)
|
session := loginUser(t, user.Name)
|
||||||
token := getTokenForLoggedInUser(t, session)
|
token := getTokenForLoggedInUser(t, session)
|
||||||
|
|
||||||
//check invalid requests for GetCommitsBySHA
|
// check invalid requests
|
||||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/master?token="+token, user.Name)
|
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/12345?token="+token, user.Name)
|
||||||
session.MakeRequest(t, req, http.StatusUnprocessableEntity)
|
|
||||||
|
|
||||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/12345?token="+token, user.Name)
|
|
||||||
session.MakeRequest(t, req, http.StatusNotFound)
|
session.MakeRequest(t, req, http.StatusNotFound)
|
||||||
|
|
||||||
//check invalid requests for GetCommitsByRef
|
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/..?token="+token, user.Name)
|
||||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/commits/..?token="+token, user.Name)
|
|
||||||
session.MakeRequest(t, req, http.StatusUnprocessableEntity)
|
session.MakeRequest(t, req, http.StatusUnprocessableEntity)
|
||||||
|
|
||||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/commits/branch-not-exist?token="+token, user.Name)
|
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/branch-not-exist?token="+token, user.Name)
|
||||||
session.MakeRequest(t, req, http.StatusNotFound)
|
session.MakeRequest(t, req, http.StatusNotFound)
|
||||||
|
|
||||||
for _, ref := range [...]string{
|
for _, ref := range [...]string{
|
||||||
|
@ -41,20 +37,8 @@ func TestAPIReposGitCommits(t *testing.T) {
|
||||||
"65f1", // short sha
|
"65f1", // short sha
|
||||||
"65f1bf27bc3bf70f64657658635e66094edbcb4d", // full sha
|
"65f1bf27bc3bf70f64657658635e66094edbcb4d", // full sha
|
||||||
} {
|
} {
|
||||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/commits/%s?token="+token, user.Name, ref)
|
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/%s?token="+token, user.Name, ref)
|
||||||
resp := session.MakeRequest(t, req, http.StatusOK)
|
session.MakeRequest(t, req, http.StatusOK)
|
||||||
commitByRef := new(api.Commit)
|
|
||||||
DecodeJSON(t, resp, commitByRef)
|
|
||||||
assert.Len(t, commitByRef.SHA, 40)
|
|
||||||
assert.EqualValues(t, commitByRef.SHA, commitByRef.RepoCommit.Tree.SHA)
|
|
||||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/%s?token="+token, user.Name, commitByRef.SHA)
|
|
||||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
|
||||||
commitBySHA := new(api.Commit)
|
|
||||||
DecodeJSON(t, resp, commitBySHA)
|
|
||||||
|
|
||||||
assert.EqualValues(t, commitByRef.SHA, commitBySHA.SHA)
|
|
||||||
assert.EqualValues(t, commitByRef.HTMLURL, commitBySHA.HTMLURL)
|
|
||||||
assert.EqualValues(t, commitByRef.RepoCommit.Message, commitBySHA.RepoCommit.Message)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -817,14 +817,13 @@ func RegisterRoutes(m *macaron.Macaron) {
|
||||||
m.Group("/commits", func() {
|
m.Group("/commits", func() {
|
||||||
m.Get("", repo.GetAllCommits)
|
m.Get("", repo.GetAllCommits)
|
||||||
m.Group("/:ref", func() {
|
m.Group("/:ref", func() {
|
||||||
m.Get("", repo.GetSingleCommitByRef)
|
|
||||||
m.Get("/status", repo.GetCombinedCommitStatusByRef)
|
m.Get("/status", repo.GetCombinedCommitStatusByRef)
|
||||||
m.Get("/statuses", repo.GetCommitStatusesByRef)
|
m.Get("/statuses", repo.GetCommitStatusesByRef)
|
||||||
})
|
})
|
||||||
}, reqRepoReader(models.UnitTypeCode))
|
}, reqRepoReader(models.UnitTypeCode))
|
||||||
m.Group("/git", func() {
|
m.Group("/git", func() {
|
||||||
m.Group("/commits", func() {
|
m.Group("/commits", func() {
|
||||||
m.Get("/:sha", repo.GetSingleCommitBySHA)
|
m.Get("/:sha", repo.GetSingleCommit)
|
||||||
})
|
})
|
||||||
m.Get("/refs", repo.GetGitAllRefs)
|
m.Get("/refs", repo.GetGitAllRefs)
|
||||||
m.Get("/refs/*", repo.GetGitRefs)
|
m.Get("/refs/*", repo.GetGitRefs)
|
||||||
|
|
|
@ -21,9 +21,9 @@ import (
|
||||||
"code.gitea.io/gitea/routers/api/v1/utils"
|
"code.gitea.io/gitea/routers/api/v1/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetSingleCommitBySHA get a commit via sha
|
// GetSingleCommit get a commit via sha
|
||||||
func GetSingleCommitBySHA(ctx *context.APIContext) {
|
func GetSingleCommit(ctx *context.APIContext) {
|
||||||
// swagger:operation GET /repos/{owner}/{repo}/git/commits/{sha} repository repoGetSingleCommitBySHA
|
// swagger:operation GET /repos/{owner}/{repo}/git/commits/{sha} repository repoGetSingleCommit
|
||||||
// ---
|
// ---
|
||||||
// summary: Get a single commit from a repository
|
// summary: Get a single commit from a repository
|
||||||
// produces:
|
// produces:
|
||||||
|
@ -41,7 +41,7 @@ func GetSingleCommitBySHA(ctx *context.APIContext) {
|
||||||
// required: true
|
// required: true
|
||||||
// - name: sha
|
// - name: sha
|
||||||
// in: path
|
// in: path
|
||||||
// description: the commit hash
|
// description: a git ref or commit sha
|
||||||
// type: string
|
// type: string
|
||||||
// required: true
|
// required: true
|
||||||
// responses:
|
// responses:
|
||||||
|
@ -53,54 +53,13 @@ func GetSingleCommitBySHA(ctx *context.APIContext) {
|
||||||
// "$ref": "#/responses/notFound"
|
// "$ref": "#/responses/notFound"
|
||||||
|
|
||||||
sha := ctx.Params(":sha")
|
sha := ctx.Params(":sha")
|
||||||
if !git.SHAPattern.MatchString(sha) {
|
if (validation.GitRefNamePatternInvalid.MatchString(sha) || !validation.CheckGitRefAdditionalRulesValid(sha)) && !git.SHAPattern.MatchString(sha) {
|
||||||
ctx.Error(http.StatusUnprocessableEntity, "no valid sha", fmt.Sprintf("no valid sha: %s", sha))
|
ctx.Error(http.StatusUnprocessableEntity, "no valid ref or sha", fmt.Sprintf("no valid ref or sha: %s", sha))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
getCommit(ctx, sha)
|
getCommit(ctx, sha)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSingleCommitByRef get a commit via ref
|
|
||||||
func GetSingleCommitByRef(ctx *context.APIContext) {
|
|
||||||
// swagger:operation GET /repos/{owner}/{repo}/commits/{ref} repository repoGetSingleCommitByRef
|
|
||||||
// ---
|
|
||||||
// summary: Get a single commit from a repository
|
|
||||||
// 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: ref
|
|
||||||
// in: path
|
|
||||||
// description: a git ref
|
|
||||||
// type: string
|
|
||||||
// required: true
|
|
||||||
// responses:
|
|
||||||
// "200":
|
|
||||||
// "$ref": "#/responses/Commit"
|
|
||||||
// "422":
|
|
||||||
// "$ref": "#/responses/validationError"
|
|
||||||
// "404":
|
|
||||||
// "$ref": "#/responses/notFound"
|
|
||||||
|
|
||||||
ref := ctx.Params("ref")
|
|
||||||
|
|
||||||
if validation.GitRefNamePatternInvalid.MatchString(ref) || !validation.CheckGitRefAdditionalRulesValid(ref) {
|
|
||||||
ctx.Error(http.StatusUnprocessableEntity, "no valid sha", fmt.Sprintf("no valid ref: %s", ref))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
getCommit(ctx, ref)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getCommit(ctx *context.APIContext, identifier string) {
|
func getCommit(ctx *context.APIContext, identifier string) {
|
||||||
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
|
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -2549,52 +2549,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/repos/{owner}/{repo}/commits/{ref}": {
|
|
||||||
"get": {
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"repository"
|
|
||||||
],
|
|
||||||
"summary": "Get a single commit from a repository",
|
|
||||||
"operationId": "repoGetSingleCommitByRef",
|
|
||||||
"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": "string",
|
|
||||||
"description": "a git ref",
|
|
||||||
"name": "ref",
|
|
||||||
"in": "path",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"$ref": "#/responses/Commit"
|
|
||||||
},
|
|
||||||
"404": {
|
|
||||||
"$ref": "#/responses/notFound"
|
|
||||||
},
|
|
||||||
"422": {
|
|
||||||
"$ref": "#/responses/validationError"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/repos/{owner}/{repo}/commits/{ref}/statuses": {
|
"/repos/{owner}/{repo}/commits/{ref}/statuses": {
|
||||||
"get": {
|
"get": {
|
||||||
"produces": [
|
"produces": [
|
||||||
|
@ -3075,7 +3029,7 @@
|
||||||
"repository"
|
"repository"
|
||||||
],
|
],
|
||||||
"summary": "Get a single commit from a repository",
|
"summary": "Get a single commit from a repository",
|
||||||
"operationId": "repoGetSingleCommitBySHA",
|
"operationId": "repoGetSingleCommit",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -3093,7 +3047,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "the commit hash",
|
"description": "a git ref or commit sha",
|
||||||
"name": "sha",
|
"name": "sha",
|
||||||
"in": "path",
|
"in": "path",
|
||||||
"required": true
|
"required": true
|
||||||
|
|
Loading…
Reference in New Issue