Skip to content

Commit 2b6f452

Browse files
sapklafriks
authored andcommitted
api: fix multiple bugs with statuses endpoints (#7785)
* 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 c534b7e commit 2b6f452

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
@@ -89,7 +89,7 @@ func (status *CommitStatus) loadRepo(e Engine) (err error) {
8989
// APIURL returns the absolute APIURL to this commit-status.
9090
func (status *CommitStatus) APIURL() string {
9191
_ = status.loadRepo(x)
92-
return fmt.Sprintf("%sapi/v1/%s/statuses/%s",
92+
return fmt.Sprintf("%sapi/v1/repos/%s/statuses/%s",
9393
setting.AppURL, status.Repo.FullName(), status.SHA)
9494
}
9595

models/commit_status_test.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,25 @@ func TestGetCommitStatuses(t *testing.T) {
2020
statuses, maxResults, err := GetCommitStatuses(repo1, sha1, &CommitStatusOptions{})
2121
assert.NoError(t, err)
2222
assert.Equal(t, int(maxResults), 5)
23-
if assert.Len(t, statuses, 5) {
24-
assert.Equal(t, statuses[0].Context, "ci/awesomeness")
25-
assert.Equal(t, statuses[0].State, CommitStatusPending)
23+
assert.Len(t, statuses, 5)
2624

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

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

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

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

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{
@@ -155,7 +152,38 @@ func GetCommitStatusesByRef(ctx *context.APIContext) {
155152
// responses:
156153
// "200":
157154
// "$ref": "#/responses/StatusList"
158-
getCommitStatuses(ctx, ctx.Params("ref"))
155+
156+
filter := ctx.Params("ref")
157+
if len(filter) == 0 {
158+
ctx.Error(400, "ref not given", nil)
159+
return
160+
}
161+
162+
for _, reftype := range []string{"heads", "tags"} { //Search branches and tags
163+
refSHA, lastMethodName, err := searchRefCommitByType(ctx, reftype, filter)
164+
if err != nil {
165+
ctx.Error(500, lastMethodName, err)
166+
return
167+
}
168+
if refSHA != "" {
169+
filter = refSHA
170+
break
171+
}
172+
173+
}
174+
175+
getCommitStatuses(ctx, filter) //By default filter is maybe the raw SHA
176+
}
177+
178+
func searchRefCommitByType(ctx *context.APIContext, refType, filter string) (string, string, error) {
179+
refs, lastMethodName, err := getGitRefs(ctx, refType+"/"+filter) //Search by type
180+
if err != nil {
181+
return "", lastMethodName, err
182+
}
183+
if len(refs) > 0 {
184+
return refs[0].Object.String(), "", nil //Return found SHA
185+
}
186+
return "", "", nil
159187
}
160188

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

0 commit comments

Comments
 (0)