* 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>master
@@ -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 | |||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/master?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) | |||||
// check invalid requests | |||||
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/commits/..?token="+token, user.Name) | |||||
req = NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/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) | |||||
resp := 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) | |||||
req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/git/commits/%s?token="+token, user.Name, ref) | |||||
session.MakeRequest(t, req, http.StatusOK) | |||||
} | } | ||||
} | } | ||||
@@ -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 | |||||
func GetSingleCommitBySHA(ctx *context.APIContext) { | |||||
// swagger:operation GET /repos/{owner}/{repo}/git/commits/{sha} repository repoGetSingleCommitBySHA | |||||
// GetSingleCommit get a commit via sha | |||||
func GetSingleCommit(ctx *context.APIContext) { | |||||
// 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) { | |||||
ctx.Error(http.StatusUnprocessableEntity, "no valid sha", fmt.Sprintf("no valid sha: %s", sha)) | |||||
if (validation.GitRefNamePatternInvalid.MatchString(sha) || !validation.CheckGitRefAdditionalRulesValid(sha)) && !git.SHAPattern.MatchString(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 | ||||