]> source.dussan.org Git - gitea.git/commitdiff
Let branch/tag name be a valid ref to get CI status (#16400)
author6543 <6543@obermui.de>
Tue, 13 Jul 2021 07:14:14 +0000 (09:14 +0200)
committerGitHub <noreply@github.com>
Tue, 13 Jul 2021 07:14:14 +0000 (08:14 +0100)
* fix #16384#

* refactor: move shared helper func to utils package

* extend Tests

* use ctx.Repo.GitRepo if not nil

integrations/repo_commits_test.go
routers/api/v1/repo/git_ref.go
routers/api/v1/repo/status.go
routers/api/v1/utils/git.go [new file with mode: 0644]

index 306175d812f27ba2cfdf172b718ffb270695c4eb..8dcbcd368350c86d14101c5d6d7af4b6188eaa57 100644 (file)
@@ -73,26 +73,36 @@ func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) {
 
        //By SHA
        req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/statuses")
-       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
+       reqOne := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/status")
+       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
+
        //By Ref
        req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/statuses")
-       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
+       reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/status")
+       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
        req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/v1.1/statuses")
-       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
+       reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/v1.1/status")
+       testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
 }
 
-func testRepoCommitsWithStatus(t *testing.T, resp *httptest.ResponseRecorder, state string) {
+func testRepoCommitsWithStatus(t *testing.T, resp, respOne *httptest.ResponseRecorder, state string) {
        json := jsoniter.ConfigCompatibleWithStandardLibrary
-       decoder := json.NewDecoder(resp.Body)
-       statuses := []*api.CommitStatus{}
-       assert.NoError(t, decoder.Decode(&statuses))
-       assert.Len(t, statuses, 1)
-       for _, s := range statuses {
-               assert.Equal(t, api.CommitStatusState(state), s.State)
-               assert.Equal(t, setting.AppURL+"api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d", s.URL)
-               assert.Equal(t, "http://test.ci/", s.TargetURL)
-               assert.Equal(t, "", s.Description)
-               assert.Equal(t, "testci", s.Context)
+       var statuses []*api.CommitStatus
+       assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), &statuses))
+       var status api.CombinedStatus
+       assert.NoError(t, json.Unmarshal(respOne.Body.Bytes(), &status))
+       assert.NotNil(t, status)
+
+       if assert.Len(t, statuses, 1) {
+               assert.Equal(t, api.CommitStatusState(state), statuses[0].State)
+               assert.Equal(t, setting.AppURL+"api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d", statuses[0].URL)
+               assert.Equal(t, "http://test.ci/", statuses[0].TargetURL)
+               assert.Equal(t, "", statuses[0].Description)
+               assert.Equal(t, "testci", statuses[0].Context)
+
+               assert.Len(t, status.Statuses, 1)
+               assert.Equal(t, statuses[0], status.Statuses[0])
+               assert.Equal(t, "65f1bf27bc3bf70f64657658635e66094edbcb4d", status.SHA)
        }
 }
 
index bd43ad4fc8ab84d5a421550811e351ec339775df..e304e06740bea96a1c8949d460fcfe0d41d13064 100644 (file)
@@ -8,8 +8,8 @@ import (
        "net/http"
 
        "code.gitea.io/gitea/modules/context"
-       "code.gitea.io/gitea/modules/git"
        api "code.gitea.io/gitea/modules/structs"
+       "code.gitea.io/gitea/routers/api/v1/utils"
 )
 
 // GetGitAllRefs get ref or an list all the refs of a repository
@@ -73,22 +73,8 @@ func GetGitRefs(ctx *context.APIContext) {
        getGitRefsInternal(ctx, ctx.Params("*"))
 }
 
-func getGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
-       gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
-       if err != nil {
-               return nil, "OpenRepository", err
-       }
-       defer gitRepo.Close()
-
-       if len(filter) > 0 {
-               filter = "refs/" + filter
-       }
-       refs, err := gitRepo.GetRefsFiltered(filter)
-       return refs, "GetRefsFiltered", err
-}
-
 func getGitRefsInternal(ctx *context.APIContext, filter string) {
-       refs, lastMethodName, err := getGitRefs(ctx, filter)
+       refs, lastMethodName, err := utils.GetGitRefs(ctx, filter)
        if err != nil {
                ctx.Error(http.StatusInternalServerError, lastMethodName, err)
                return
index 7ab399b57275247dd11d138c78f1d7e02ba3763d..95c3f00a72e4facc95bae17efb2c1a8f1e0352db 100644 (file)
@@ -171,39 +171,14 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
        //   "400":
        //     "$ref": "#/responses/error"
 
-       filter := ctx.Params("ref")
-       if len(filter) == 0 {
-               ctx.Error(http.StatusBadRequest, "ref not given", nil)
+       filter := utils.ResolveRefOrSha(ctx, ctx.Params("ref"))
+       if ctx.Written() {
                return
        }
 
-       for _, reftype := range []string{"heads", "tags"} { //Search branches and tags
-               refSHA, lastMethodName, err := searchRefCommitByType(ctx, reftype, filter)
-               if err != nil {
-                       ctx.Error(http.StatusInternalServerError, lastMethodName, err)
-                       return
-               }
-               if refSHA != "" {
-                       filter = refSHA
-                       break
-               }
-
-       }
-
        getCommitStatuses(ctx, filter) //By default filter is maybe the raw SHA
 }
 
-func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
-       refs, lastMethodName, err := getGitRefs(ctx, refType+"/"+filter) //Search by type
-       if err != nil {
-               return "", lastMethodName, err
-       }
-       if len(refs) > 0 {
-               return refs[0].Object.String(), "", nil //Return found SHA
-       }
-       return "", "", nil
-}
-
 func getCommitStatuses(ctx *context.APIContext, sha string) {
        if len(sha) == 0 {
                ctx.Error(http.StatusBadRequest, "ref/sha not given", nil)
@@ -272,11 +247,11 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
        //   "400":
        //     "$ref": "#/responses/error"
 
-       sha := ctx.Params("ref")
-       if len(sha) == 0 {
-               ctx.Error(http.StatusBadRequest, "ref/sha not given", nil)
+       sha := utils.ResolveRefOrSha(ctx, ctx.Params("ref"))
+       if ctx.Written() {
                return
        }
+
        repo := ctx.Repo.Repository
 
        statuses, err := models.GetLatestCommitStatus(repo.ID, sha, utils.GetListOptions(ctx))
diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go
new file mode 100644 (file)
index 0000000..ac68c36
--- /dev/null
@@ -0,0 +1,61 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package utils
+
+import (
+       "net/http"
+
+       "code.gitea.io/gitea/modules/context"
+       "code.gitea.io/gitea/modules/git"
+)
+
+// ResolveRefOrSha resolve ref to sha if exist
+func ResolveRefOrSha(ctx *context.APIContext, ref string) string {
+       if len(ref) == 0 {
+               ctx.Error(http.StatusBadRequest, "ref not given", nil)
+               return ""
+       }
+
+       // Search branches and tags
+       for _, refType := range []string{"heads", "tags"} {
+               refSHA, lastMethodName, err := searchRefCommitByType(ctx, refType, ref)
+               if err != nil {
+                       ctx.Error(http.StatusInternalServerError, lastMethodName, err)
+                       return ""
+               }
+               if refSHA != "" {
+                       return refSHA
+               }
+       }
+       return ref
+}
+
+// GetGitRefs return git references based on filter
+func GetGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
+       if ctx.Repo.GitRepo == nil {
+               var err error
+               ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
+               if err != nil {
+                       return nil, "OpenRepository", err
+               }
+               defer ctx.Repo.GitRepo.Close()
+       }
+       if len(filter) > 0 {
+               filter = "refs/" + filter
+       }
+       refs, err := ctx.Repo.GitRepo.GetRefsFiltered(filter)
+       return refs, "GetRefsFiltered", err
+}
+
+func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
+       refs, lastMethodName, err := GetGitRefs(ctx, refType+"/"+filter) //Search by type
+       if err != nil {
+               return "", lastMethodName, err
+       }
+       if len(refs) > 0 {
+               return refs[0].Object.String(), "", nil //Return found SHA
+       }
+       return "", "", nil
+}