mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	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 <lauris@nix.lv> * remove return * Update routers/api/v1/repo/status.go Co-Authored-By: Lauris BH <lauris@nix.lv>
This commit is contained in:
		 Antoine GIRARD
					Antoine GIRARD
				
			
				
					committed by
					
						 Lunny Xiao
						Lunny Xiao
					
				
			
			
				
	
			
			
			 Lunny Xiao
						Lunny Xiao
					
				
			
						parent
						
							c534b7e211
						
					
				
				
					commit
					2b6f45299d
				
			| @@ -5,10 +5,13 @@ | |||||||
| package integrations | package integrations | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"encoding/json" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"net/http/httptest" | ||||||
| 	"path" | 	"path" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| @@ -67,6 +70,29 @@ func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) { | |||||||
| 	for _, class := range classes { | 	for _, class := range classes { | ||||||
| 		assert.True(t, sel.HasClass(class)) | 		assert.True(t, sel.HasClass(class)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	//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) | ||||||
|  | 	//By Ref | ||||||
|  | 	req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/master/statuses") | ||||||
|  | 	testRepoCommitsWithStatus(t, session.MakeRequest(t, req, 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) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func testRepoCommitsWithStatus(t *testing.T, resp *httptest.ResponseRecorder, state string) { | ||||||
|  | 	decoder := json.NewDecoder(resp.Body) | ||||||
|  | 	statuses := []*api.Status{} | ||||||
|  | 	assert.NoError(t, decoder.Decode(&statuses)) | ||||||
|  | 	assert.Len(t, statuses, 1) | ||||||
|  | 	for _, s := range statuses { | ||||||
|  | 		assert.Equal(t, api.StatusState(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) | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestRepoCommitsWithStatusPending(t *testing.T) { | func TestRepoCommitsWithStatusPending(t *testing.T) { | ||||||
|   | |||||||
| @@ -89,7 +89,7 @@ func (status *CommitStatus) loadRepo(e Engine) (err error) { | |||||||
| // APIURL returns the absolute APIURL to this commit-status. | // APIURL returns the absolute APIURL to this commit-status. | ||||||
| func (status *CommitStatus) APIURL() string { | func (status *CommitStatus) APIURL() string { | ||||||
| 	_ = status.loadRepo(x) | 	_ = status.loadRepo(x) | ||||||
| 	return fmt.Sprintf("%sapi/v1/%s/statuses/%s", | 	return fmt.Sprintf("%sapi/v1/repos/%s/statuses/%s", | ||||||
| 		setting.AppURL, status.Repo.FullName(), status.SHA) | 		setting.AppURL, status.Repo.FullName(), status.SHA) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,20 +20,25 @@ func TestGetCommitStatuses(t *testing.T) { | |||||||
| 	statuses, maxResults, err := GetCommitStatuses(repo1, sha1, &CommitStatusOptions{}) | 	statuses, maxResults, err := GetCommitStatuses(repo1, sha1, &CommitStatusOptions{}) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.Equal(t, int(maxResults), 5) | 	assert.Equal(t, int(maxResults), 5) | ||||||
| 	if assert.Len(t, statuses, 5) { | 	assert.Len(t, statuses, 5) | ||||||
| 		assert.Equal(t, statuses[0].Context, "ci/awesomeness") |  | ||||||
| 		assert.Equal(t, statuses[0].State, CommitStatusPending) |  | ||||||
|  |  | ||||||
| 		assert.Equal(t, statuses[1].Context, "cov/awesomeness") | 	assert.Equal(t, "ci/awesomeness", statuses[0].Context) | ||||||
| 		assert.Equal(t, statuses[1].State, CommitStatusWarning) | 	assert.Equal(t, CommitStatusPending, statuses[0].State) | ||||||
|  | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL()) | ||||||
|  |  | ||||||
| 		assert.Equal(t, statuses[2].Context, "cov/awesomeness") | 	assert.Equal(t, "cov/awesomeness", statuses[1].Context) | ||||||
| 		assert.Equal(t, statuses[2].State, CommitStatusSuccess) | 	assert.Equal(t, CommitStatusWarning, statuses[1].State) | ||||||
|  | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL()) | ||||||
|  |  | ||||||
| 		assert.Equal(t, statuses[3].Context, "ci/awesomeness") | 	assert.Equal(t, "cov/awesomeness", statuses[2].Context) | ||||||
| 		assert.Equal(t, statuses[3].State, CommitStatusFailure) | 	assert.Equal(t, CommitStatusSuccess, statuses[2].State) | ||||||
|  | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL()) | ||||||
|  |  | ||||||
| 		assert.Equal(t, statuses[4].Context, "deploy/awesomeness") | 	assert.Equal(t, "ci/awesomeness", statuses[3].Context) | ||||||
| 		assert.Equal(t, statuses[4].State, CommitStatusError) | 	assert.Equal(t, CommitStatusFailure, statuses[3].State) | ||||||
| 	} | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL()) | ||||||
|  |  | ||||||
|  | 	assert.Equal(t, "deploy/awesomeness", statuses[4].Context) | ||||||
|  | 	assert.Equal(t, CommitStatusError, statuses[4].State) | ||||||
|  | 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL()) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -71,19 +71,22 @@ func GetGitRefs(ctx *context.APIContext) { | |||||||
| 	getGitRefsInternal(ctx, ctx.Params("*")) | 	getGitRefsInternal(ctx, ctx.Params("*")) | ||||||
| } | } | ||||||
|  |  | ||||||
| func getGitRefsInternal(ctx *context.APIContext, filter string) { | func getGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) { | ||||||
| 	gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath()) | 	gitRepo, err := git.OpenRepository(ctx.Repo.Repository.RepoPath()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Error(500, "OpenRepository", err) | 		return nil, "OpenRepository", err | ||||||
| 		return |  | ||||||
| 	} | 	} | ||||||
| 	if len(filter) > 0 { | 	if len(filter) > 0 { | ||||||
| 		filter = "refs/" + filter | 		filter = "refs/" + filter | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	refs, err := gitRepo.GetRefsFiltered(filter) | 	refs, err := gitRepo.GetRefsFiltered(filter) | ||||||
|  | 	return refs, "GetRefsFiltered", err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func getGitRefsInternal(ctx *context.APIContext, filter string) { | ||||||
|  | 	refs, lastMethodName, err := getGitRefs(ctx, filter) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Error(500, "GetRefsFiltered", err) | 		ctx.Error(500, lastMethodName, err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,10 +46,7 @@ func NewCommitStatus(ctx *context.APIContext, form api.CreateStatusOption) { | |||||||
| 	//     "$ref": "#/responses/StatusList" | 	//     "$ref": "#/responses/StatusList" | ||||||
| 	sha := ctx.Params("sha") | 	sha := ctx.Params("sha") | ||||||
| 	if len(sha) == 0 { | 	if len(sha) == 0 { | ||||||
| 		sha = ctx.Params("ref") | 		ctx.Error(400, "sha not given", nil) | ||||||
| 	} |  | ||||||
| 	if len(sha) == 0 { |  | ||||||
| 		ctx.Error(400, "ref/sha not given", nil) |  | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	status := &models.CommitStatus{ | 	status := &models.CommitStatus{ | ||||||
| @@ -155,7 +152,38 @@ func GetCommitStatusesByRef(ctx *context.APIContext) { | |||||||
| 	// responses: | 	// responses: | ||||||
| 	//   "200": | 	//   "200": | ||||||
| 	//     "$ref": "#/responses/StatusList" | 	//     "$ref": "#/responses/StatusList" | ||||||
| 	getCommitStatuses(ctx, ctx.Params("ref")) |  | ||||||
|  | 	filter := ctx.Params("ref") | ||||||
|  | 	if len(filter) == 0 { | ||||||
|  | 		ctx.Error(400, "ref not given", nil) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, reftype := range []string{"heads", "tags"} { //Search branches and tags | ||||||
|  | 		refSHA, lastMethodName, err := searchRefCommitByType(ctx, reftype, filter) | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.Error(500, 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) { | func getCommitStatuses(ctx *context.APIContext, sha string) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user