* 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>
tags/v1.21.12.1
| @@ -21,18 +21,14 @@ func TestAPIReposGitCommits(t *testing.T) { | |||
| session := loginUser(t, user.Name) | |||
| 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) | |||
| //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) | |||
| 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) | |||
| for _, ref := range [...]string{ | |||
| @@ -41,20 +37,8 @@ func TestAPIReposGitCommits(t *testing.T) { | |||
| "65f1", // short 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.Get("", repo.GetAllCommits) | |||
| m.Group("/:ref", func() { | |||
| m.Get("", repo.GetSingleCommitByRef) | |||
| m.Get("/status", repo.GetCombinedCommitStatusByRef) | |||
| m.Get("/statuses", repo.GetCommitStatusesByRef) | |||
| }) | |||
| }, reqRepoReader(models.UnitTypeCode)) | |||
| m.Group("/git", func() { | |||
| m.Group("/commits", func() { | |||
| m.Get("/:sha", repo.GetSingleCommitBySHA) | |||
| m.Get("/:sha", repo.GetSingleCommit) | |||
| }) | |||
| m.Get("/refs", repo.GetGitAllRefs) | |||
| m.Get("/refs/*", repo.GetGitRefs) | |||
| @@ -21,9 +21,9 @@ import ( | |||
| "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 | |||
| // produces: | |||
| @@ -41,7 +41,7 @@ func GetSingleCommitBySHA(ctx *context.APIContext) { | |||
| // required: true | |||
| // - name: sha | |||
| // in: path | |||
| // description: the commit hash | |||
| // description: a git ref or commit sha | |||
| // type: string | |||
| // required: true | |||
| // responses: | |||
| @@ -53,54 +53,13 @@ func GetSingleCommitBySHA(ctx *context.APIContext) { | |||
| // "$ref": "#/responses/notFound" | |||
| 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 | |||
| } | |||
| 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) { | |||
| gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath()) | |||
| 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": { | |||
| "get": { | |||
| "produces": [ | |||
| @@ -3075,7 +3029,7 @@ | |||
| "repository" | |||
| ], | |||
| "summary": "Get a single commit from a repository", | |||
| "operationId": "repoGetSingleCommitBySHA", | |||
| "operationId": "repoGetSingleCommit", | |||
| "parameters": [ | |||
| { | |||
| "type": "string", | |||
| @@ -3093,7 +3047,7 @@ | |||
| }, | |||
| { | |||
| "type": "string", | |||
| "description": "the commit hash", | |||
| "description": "a git ref or commit sha", | |||
| "name": "sha", | |||
| "in": "path", | |||
| "required": true | |||