Skip to content

Commit 38e7997

Browse files
sapklafriks
andcommitted
api: fix multiple bugs with statuses endpoints (#7785) (#7807)
* fix commit statuses api url * search refs before passing sha * adjust tests * directly search tags and branches names + remove un-needed check in NewCommitStatus * fix comment * de-duplicate code * test: use relative setting.AppURL * Update routers/api/v1/repo/status.go Co-Authored-By: Lauris BH <[email protected]> * remove return * Update routers/api/v1/repo/status.go Co-Authored-By: Lauris BH <[email protected]>
1 parent 4f39e56 commit 38e7997

File tree

5 files changed

+85
-23
lines changed

5 files changed

+85
-23
lines changed

integrations/repo_commits_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
package integrations
66

77
import (
8+
"encoding/json"
89
"net/http"
10+
"net/http/httptest"
911
"path"
1012
"testing"
1113

14+
"code.gitea.io/gitea/modules/setting"
1215
api "code.gitea.io/gitea/modules/structs"
1316

1417
"github.com/stretchr/testify/assert"
@@ -67,6 +70,29 @@ func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) {
6770
for _, class := range classes {
6871
assert.True(t, sel.HasClass(class))
6972
}
73+
74+
//By SHA
75+
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/"+path.Base(commitURL)+"/statuses")
76+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
77+
//By Ref
78+
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/statuses")
79+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
80+
req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/v1.1/statuses")
81+
testRepoCommitsWithStatus(t, session.MakeRequest(t, req, http.StatusOK), state)
82+
}
83+
84+
func testRepoCommitsWithStatus(t *testing.T, resp *httptest.ResponseRecorder, state string) {
85+
decoder := json.NewDecoder(resp.Body)
86+
statuses := []*api.Status{}
87+
assert.NoError(t, decoder.Decode(&statuses))
88+
assert.Len(t, statuses, 1)
89+
for _, s := range statuses {
90+
assert.Equal(t, api.StatusState(state), s.State)
91+
assert.Equal(t, setting.AppURL+"api/v1/repos/user2/repo1/statuses/65f1bf27bc3bf70f64657658635e66094edbcb4d", s.URL)
92+
assert.Equal(t, "http://test.ci/", s.TargetURL)
93+
assert.Equal(t, "", s.Description)
94+
assert.Equal(t, "testci", s.Context)
95+
}
7096
}
7197

7298
func TestRepoCommitsWithStatusPending(t *testing.T) {

models/commit_status.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (status *CommitStatus) loadRepo(e Engine) (err error) {
8787
// APIURL returns the absolute APIURL to this commit-status.
8888
func (status *CommitStatus) APIURL() string {
8989
_ = status.loadRepo(x)
90-
return fmt.Sprintf("%sapi/v1/%s/statuses/%s",
90+
return fmt.Sprintf("%sapi/v1/repos/%s/statuses/%s",
9191
setting.AppURL, status.Repo.FullName(), status.SHA)
9292
}
9393

models/commit_status_test.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,25 @@ func TestGetCommitStatuses(t *testing.T) {
1919

2020
statuses, err := GetCommitStatuses(repo1, sha1, 0)
2121
assert.NoError(t, err)
22-
if assert.Len(t, statuses, 5) {
23-
assert.Equal(t, statuses[0].Context, "ci/awesomeness")
24-
assert.Equal(t, statuses[0].State, CommitStatusPending)
22+
assert.Len(t, statuses, 5)
2523

26-
assert.Equal(t, statuses[1].Context, "cov/awesomeness")
27-
assert.Equal(t, statuses[1].State, CommitStatusWarning)
24+
assert.Equal(t, "ci/awesomeness", statuses[0].Context)
25+
assert.Equal(t, CommitStatusPending, statuses[0].State)
26+
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL())
2827

29-
assert.Equal(t, statuses[2].Context, "cov/awesomeness")
30-
assert.Equal(t, statuses[2].State, CommitStatusSuccess)
28+
assert.Equal(t, "cov/awesomeness", statuses[1].Context)
29+
assert.Equal(t, CommitStatusWarning, statuses[1].State)
30+
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL())
3131

32-
assert.Equal(t, statuses[3].Context, "ci/awesomeness")
33-
assert.Equal(t, statuses[3].State, CommitStatusFailure)
32+
assert.Equal(t, "cov/awesomeness", statuses[2].Context)
33+
assert.Equal(t, CommitStatusSuccess, statuses[2].State)
34+
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL())
3435

35-
assert.Equal(t, statuses[4].Context, "deploy/awesomeness")
36-
assert.Equal(t, statuses[4].State, CommitStatusError)
37-
}
36+
assert.Equal(t, "ci/awesomeness", statuses[3].Context)
37+
assert.Equal(t, CommitStatusFailure, statuses[3].State)
38+
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL())
39+
40+
assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
41+
assert.Equal(t, CommitStatusError, statuses[4].State)
42+
assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL())
3843
}

routers/api/v1/repo/git_ref.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,22 @@ func GetGitRefs(ctx *context.APIContext) {
7171
getGitRefsInternal(ctx, ctx.Params("*"))
7272
}
7373

74-
func getGitRefsInternal(ctx *context.APIContext, filter string) {
74+
func getGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
7575
gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath())
7676
if err != nil {
77-
ctx.Error(500, "OpenRepository", err)
78-
return
77+
return nil, "OpenRepository", err
7978
}
8079
if len(filter) > 0 {
8180
filter = "refs/" + filter
8281
}
83-
8482
refs, err := gitRepo.GetRefsFiltered(filter)
83+
return refs, "GetRefsFiltered", err
84+
}
85+
86+
func getGitRefsInternal(ctx *context.APIContext, filter string) {
87+
refs, lastMethodName, err := getGitRefs(ctx, filter)
8588
if err != nil {
86-
ctx.Error(500, "GetRefsFiltered", err)
89+
ctx.Error(500, lastMethodName, err)
8790
return
8891
}
8992

routers/api/v1/repo/status.go

+33-5
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@ func NewCommitStatus(ctx *context.APIContext, form api.CreateStatusOption) {
4646
// "$ref": "#/responses/StatusList"
4747
sha := ctx.Params("sha")
4848
if len(sha) == 0 {
49-
sha = ctx.Params("ref")
50-
}
51-
if len(sha) == 0 {
52-
ctx.Error(400, "ref/sha not given", nil)
49+
ctx.Error(400, "sha not given", nil)
5350
return
5451
}
5552
status := &models.CommitStatus{
@@ -121,7 +118,38 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
121118
// responses:
122119
// "200":
123120
// "$ref": "#/responses/StatusList"
124-
getCommitStatuses(ctx, ctx.Params("ref"))
121+
122+
filter := ctx.Params("ref")
123+
if len(filter) == 0 {
124+
ctx.Error(400, "ref not given", nil)
125+
return
126+
}
127+
128+
for _, reftype := range []string{"heads", "tags"} { //Search branches and tags
129+
refSHA, lastMethodName, err := searchRefCommitByType(ctx, reftype, filter)
130+
if err != nil {
131+
ctx.Error(500, lastMethodName, err)
132+
return
133+
}
134+
if refSHA != "" {
135+
filter = refSHA
136+
break
137+
}
138+
139+
}
140+
141+
getCommitStatuses(ctx, filter) //By default filter is maybe the raw SHA
142+
}
143+
144+
func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
145+
refs, lastMethodName, err := getGitRefs(ctx, refType+"/"+filter) //Search by type
146+
if err != nil {
147+
return "", lastMethodName, err
148+
}
149+
if len(refs) > 0 {
150+
return refs[0].Object.String(), "", nil //Return found SHA
151+
}
152+
return "", "", nil
125153
}
126154

127155
func getCommitStatuses(ctx *context.APIContext, sha string) {

0 commit comments

Comments
 (0)