Skip to content

Commit b81106b

Browse files
authored
Let branch/tag name be a valid ref to get CI status (#16400)
* fix #16384# * refactor: move shared helper func to utils package * extend Tests * use ctx.Repo.GitRepo if not nil
1 parent 4ce32c9 commit b81106b

File tree

4 files changed

+92
-60
lines changed

4 files changed

+92
-60
lines changed

Diff for: integrations/repo_commits_test.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -73,26 +73,36 @@ func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) {
7373

7474
//By SHA
7575
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/statuses")
76-
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
76+
reqOne := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/status")
77+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
78+
7779
//By Ref
7880
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/statuses")
79-
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
81+
reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/status")
82+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
8083
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/v1.1/statuses")
81-
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
84+
reqOne = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/v1.1/status")
85+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), session.MakeRequest(t, reqOne, http.StatusOK), state)
8286
}
8387

84-
func testRepoCommitsWithStatus(t *testing.T, resp *httptest.ResponseRecorder, state string) {
88+
func testRepoCommitsWithStatus(t *testing.T, resp, respOne *httptest.ResponseRecorder, state string) {
8589
json := jsoniter.ConfigCompatibleWithStandardLibrary
86-
decoder := json.NewDecoder(resp.Body)
87-
statuses := []*api.CommitStatus{}
88-
assert.NoError(t, decoder.Decode(&statuses))
89-
assert.Len(t, statuses, 1)
90-
for _, s := range statuses {
91-
assert.Equal(t, api.CommitStatusState(state), s.State)
92-
assert.Equal(t, setting.AppURL+"api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d", s.URL)
93-
assert.Equal(t, "http://test.ci/", s.TargetURL)
94-
assert.Equal(t, "", s.Description)
95-
assert.Equal(t, "testci", s.Context)
90+
var statuses []*api.CommitStatus
91+
assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), &statuses))
92+
var status api.CombinedStatus
93+
assert.NoError(t, json.Unmarshal(respOne.Body.Bytes(), &status))
94+
assert.NotNil(t, status)
95+
96+
if assert.Len(t, statuses, 1) {
97+
assert.Equal(t, api.CommitStatusState(state), statuses[0].State)
98+
assert.Equal(t, setting.AppURL+"api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d", statuses[0].URL)
99+
assert.Equal(t, "http://test.ci/", statuses[0].TargetURL)
100+
assert.Equal(t, "", statuses[0].Description)
101+
assert.Equal(t, "testci", statuses[0].Context)
102+
103+
assert.Len(t, status.Statuses, 1)
104+
assert.Equal(t, statuses[0], status.Statuses[0])
105+
assert.Equal(t, "65f1bf27bc3bf70f64657658635e66094edbcb4d", status.SHA)
96106
}
97107
}
98108

Diff for: routers/api/v1/repo/git_ref.go

+2-16
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
"net/http"
99

1010
"code.gitea.io/gitea/modules/context"
11-
"code.gitea.io/gitea/modules/git"
1211
api "code.gitea.io/gitea/modules/structs"
12+
"code.gitea.io/gitea/routers/api/v1/utils"
1313
)
1414

1515
// GetGitAllRefs get ref or an list all the refs of a repository
@@ -73,22 +73,8 @@ func GetGitRefs(ctx *context.APIContext) {
7373
getGitRefsInternal(ctx, ctx.Params("*"))
7474
}
7575

76-
func getGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
77-
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
78-
if err != nil {
79-
return nil, "OpenRepository", err
80-
}
81-
defer gitRepo.Close()
82-
83-
if len(filter) > 0 {
84-
filter = "refs/" + filter
85-
}
86-
refs, err := gitRepo.GetRefsFiltered(filter)
87-
return refs, "GetRefsFiltered", err
88-
}
89-
9076
func getGitRefsInternal(ctx *context.APIContext, filter string) {
91-
refs, lastMethodName, err := getGitRefs(ctx, filter)
77+
refs, lastMethodName, err := utils.GetGitRefs(ctx, filter)
9278
if err != nil {
9379
ctx.Error(http.StatusInternalServerError, lastMethodName, err)
9480
return

Diff for: routers/api/v1/repo/status.go

+5-30
Original file line numberDiff line numberDiff line change
@@ -171,39 +171,14 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
171171
// "400":
172172
// "$ref": "#/responses/error"
173173

174-
filter := ctx.Params("ref")
175-
if len(filter) == 0 {
176-
ctx.Error(http.StatusBadRequest, "ref not given", nil)
174+
filter := utils.ResolveRefOrSha(ctx, ctx.Params("ref"))
175+
if ctx.Written() {
177176
return
178177
}
179178

180-
for _, reftype := range []string{"heads", "tags"} { //Search branches and tags
181-
refSHA, lastMethodName, err := searchRefCommitByType(ctx, reftype, filter)
182-
if err != nil {
183-
ctx.Error(http.StatusInternalServerError, lastMethodName, err)
184-
return
185-
}
186-
if refSHA != "" {
187-
filter = refSHA
188-
break
189-
}
190-
191-
}
192-
193179
getCommitStatuses(ctx, filter) //By default filter is maybe the raw SHA
194180
}
195181

196-
func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
197-
refs, lastMethodName, err := getGitRefs(ctx, refType+"/"+filter) //Search by type
198-
if err != nil {
199-
return "", lastMethodName, err
200-
}
201-
if len(refs) > 0 {
202-
return refs[0].Object.String(), "", nil //Return found SHA
203-
}
204-
return "", "", nil
205-
}
206-
207182
func getCommitStatuses(ctx *context.APIContext, sha string) {
208183
if len(sha) == 0 {
209184
ctx.Error(http.StatusBadRequest, "ref/sha not given", nil)
@@ -272,11 +247,11 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
272247
// "400":
273248
// "$ref": "#/responses/error"
274249

275-
sha := ctx.Params("ref")
276-
if len(sha) == 0 {
277-
ctx.Error(http.StatusBadRequest, "ref/sha not given", nil)
250+
sha := utils.ResolveRefOrSha(ctx, ctx.Params("ref"))
251+
if ctx.Written() {
278252
return
279253
}
254+
280255
repo := ctx.Repo.Repository
281256

282257
statuses, err := models.GetLatestCommitStatus(repo.ID, sha, utils.GetListOptions(ctx))

Diff for: routers/api/v1/utils/git.go

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package utils
6+
7+
import (
8+
"net/http"
9+
10+
"code.gitea.io/gitea/modules/context"
11+
"code.gitea.io/gitea/modules/git"
12+
)
13+
14+
// ResolveRefOrSha resolve ref to sha if exist
15+
func ResolveRefOrSha(ctx *context.APIContext, ref string) string {
16+
if len(ref) == 0 {
17+
ctx.Error(http.StatusBadRequest, "ref not given", nil)
18+
return ""
19+
}
20+
21+
// Search branches and tags
22+
for _, refType := range []string{"heads", "tags"} {
23+
refSHA, lastMethodName, err := searchRefCommitByType(ctx, refType, ref)
24+
if err != nil {
25+
ctx.Error(http.StatusInternalServerError, lastMethodName, err)
26+
return ""
27+
}
28+
if refSHA != "" {
29+
return refSHA
30+
}
31+
}
32+
return ref
33+
}
34+
35+
// GetGitRefs return git references based on filter
36+
func GetGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
37+
if ctx.Repo.GitRepo == nil {
38+
var err error
39+
ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
40+
if err != nil {
41+
return nil, "OpenRepository", err
42+
}
43+
defer ctx.Repo.GitRepo.Close()
44+
}
45+
if len(filter) > 0 {
46+
filter = "refs/" + filter
47+
}
48+
refs, err := ctx.Repo.GitRepo.GetRefsFiltered(filter)
49+
return refs, "GetRefsFiltered", err
50+
}
51+
52+
func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
53+
refs, lastMethodName, err := GetGitRefs(ctx, refType+"/"+filter) //Search by type
54+
if err != nil {
55+
return "", lastMethodName, err
56+
}
57+
if len(refs) > 0 {
58+
return refs[0].Object.String(), "", nil //Return found SHA
59+
}
60+
return "", "", nil
61+
}

0 commit comments

Comments
 (0)