mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 01:34:27 +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:
		
				
					committed by
					
						
						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