mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	| @@ -25,7 +25,6 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/translation" | ||||
|  | ||||
| 	"xorm.io/builder" | ||||
| 	"xorm.io/xorm" | ||||
| ) | ||||
|  | ||||
| // CommitStatus holds a single Status of a single Commit | ||||
| @@ -220,60 +219,58 @@ func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus { | ||||
| // CommitStatusOptions holds the options for query commit statuses | ||||
| type CommitStatusOptions struct { | ||||
| 	db.ListOptions | ||||
| 	RepoID   int64 | ||||
| 	SHA      string | ||||
| 	State    string | ||||
| 	SortType string | ||||
| } | ||||
|  | ||||
| // GetCommitStatuses returns all statuses for a given commit. | ||||
| func GetCommitStatuses(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) { | ||||
| 	if opts.Page <= 0 { | ||||
| 		opts.Page = 1 | ||||
| 	} | ||||
| 	if opts.PageSize <= 0 { | ||||
| 		opts.Page = setting.ItemsPerPage | ||||
| func (opts *CommitStatusOptions) ToConds() builder.Cond { | ||||
| 	var cond builder.Cond = builder.Eq{ | ||||
| 		"repo_id": opts.RepoID, | ||||
| 		"sha":     opts.SHA, | ||||
| 	} | ||||
|  | ||||
| 	countSession := listCommitStatusesStatement(ctx, repo, sha, opts) | ||||
| 	countSession = db.SetSessionPagination(countSession, opts) | ||||
| 	maxResults, err := countSession.Count(new(CommitStatus)) | ||||
| 	if err != nil { | ||||
| 		log.Error("Count PRs: %v", err) | ||||
| 		return nil, maxResults, err | ||||
| 	} | ||||
|  | ||||
| 	statuses := make([]*CommitStatus, 0, opts.PageSize) | ||||
| 	findSession := listCommitStatusesStatement(ctx, repo, sha, opts) | ||||
| 	findSession = db.SetSessionPagination(findSession, opts) | ||||
| 	sortCommitStatusesSession(findSession, opts.SortType) | ||||
| 	return statuses, maxResults, findSession.Find(&statuses) | ||||
| } | ||||
|  | ||||
| func listCommitStatusesStatement(ctx context.Context, repo *repo_model.Repository, sha string, opts *CommitStatusOptions) *xorm.Session { | ||||
| 	sess := db.GetEngine(ctx).Where("repo_id = ?", repo.ID).And("sha = ?", sha) | ||||
| 	switch opts.State { | ||||
| 	case "pending", "success", "error", "failure", "warning": | ||||
| 		sess.And("state = ?", opts.State) | ||||
| 		cond = cond.And(builder.Eq{ | ||||
| 			"state": opts.State, | ||||
| 		}) | ||||
| 	} | ||||
| 	return sess | ||||
|  | ||||
| 	return cond | ||||
| } | ||||
|  | ||||
| func sortCommitStatusesSession(sess *xorm.Session, sortType string) { | ||||
| 	switch sortType { | ||||
| func (opts *CommitStatusOptions) ToOrders() string { | ||||
| 	switch opts.SortType { | ||||
| 	case "oldest": | ||||
| 		sess.Asc("created_unix") | ||||
| 		return "created_unix ASC" | ||||
| 	case "recentupdate": | ||||
| 		sess.Desc("updated_unix") | ||||
| 		return "updated_unix DESC" | ||||
| 	case "leastupdate": | ||||
| 		sess.Asc("updated_unix") | ||||
| 		return "updated_unix ASC" | ||||
| 	case "leastindex": | ||||
| 		sess.Desc("index") | ||||
| 		return "`index` DESC" | ||||
| 	case "highestindex": | ||||
| 		sess.Asc("index") | ||||
| 		return "`index` ASC" | ||||
| 	default: | ||||
| 		sess.Desc("created_unix") | ||||
| 		return "created_unix DESC" | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetCommitStatuses returns all statuses for a given commit. | ||||
| func GetCommitStatuses(ctx context.Context, opts *CommitStatusOptions) ([]*CommitStatus, int64, error) { | ||||
| 	sess := db.GetEngine(ctx). | ||||
| 		Where(opts.ToConds()). | ||||
| 		OrderBy(opts.ToOrders()) | ||||
|  | ||||
| 	db.SetSessionPagination(sess, opts) | ||||
|  | ||||
| 	statuses := make([]*CommitStatus, 0, opts.PageSize) | ||||
| 	count, err := sess.FindAndCount(&statuses) | ||||
| 	return statuses, count, err | ||||
| } | ||||
|  | ||||
| // CommitStatusIndex represents a table for commit status index | ||||
| type CommitStatusIndex struct { | ||||
| 	ID       int64 | ||||
|   | ||||
| @@ -22,7 +22,11 @@ func TestGetCommitStatuses(t *testing.T) { | ||||
|  | ||||
| 	sha1 := "1234123412341234123412341234123412341234" | ||||
|  | ||||
| 	statuses, maxResults, err := git_model.GetCommitStatuses(db.DefaultContext, repo1, sha1, &git_model.CommitStatusOptions{ListOptions: db.ListOptions{Page: 1, PageSize: 50}}) | ||||
| 	statuses, maxResults, err := git_model.GetCommitStatuses(db.DefaultContext, &git_model.CommitStatusOptions{ | ||||
| 		ListOptions: db.ListOptions{Page: 1, PageSize: 50}, | ||||
| 		RepoID:      repo1.ID, | ||||
| 		SHA:         sha1, | ||||
| 	}) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int(maxResults), 5) | ||||
| 	assert.Len(t, statuses, 5) | ||||
| @@ -46,4 +50,13 @@ func TestGetCommitStatuses(t *testing.T) { | ||||
| 	assert.Equal(t, "deploy/awesomeness", statuses[4].Context) | ||||
| 	assert.Equal(t, structs.CommitStatusError, statuses[4].State) | ||||
| 	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(db.DefaultContext)) | ||||
|  | ||||
| 	statuses, maxResults, err = git_model.GetCommitStatuses(db.DefaultContext, &git_model.CommitStatusOptions{ | ||||
| 		ListOptions: db.ListOptions{Page: 2, PageSize: 50}, | ||||
| 		RepoID:      repo1.ID, | ||||
| 		SHA:         sha1, | ||||
| 	}) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, int(maxResults), 5) | ||||
| 	assert.Empty(t, statuses) | ||||
| } | ||||
|   | ||||
| @@ -194,8 +194,10 @@ func getCommitStatuses(ctx *context.APIContext, sha string) { | ||||
|  | ||||
| 	listOptions := utils.GetListOptions(ctx) | ||||
|  | ||||
| 	statuses, maxResults, err := git_model.GetCommitStatuses(ctx, repo, sha, &git_model.CommitStatusOptions{ | ||||
| 	statuses, maxResults, err := git_model.GetCommitStatuses(ctx, &git_model.CommitStatusOptions{ | ||||
| 		ListOptions: listOptions, | ||||
| 		RepoID:      repo.ID, | ||||
| 		SHA:         sha, | ||||
| 		SortType:    ctx.FormTrim("sort"), | ||||
| 		State:       ctx.FormTrim("state"), | ||||
| 	}) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 KN4CK3R
					KN4CK3R