mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01: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
 | 
			
		||||
@@ -221,57 +220,42 @@ 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)
 | 
			
		||||
	}
 | 
			
		||||
	return sess
 | 
			
		||||
		cond = cond.And(builder.Eq{
 | 
			
		||||
			"state": opts.State,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
func sortCommitStatusesSession(sess *xorm.Session, sortType string) {
 | 
			
		||||
	switch sortType {
 | 
			
		||||
	return cond
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 := db.FindAndCount[git_model.CommitStatus](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 = db.FindAndCount[git_model.CommitStatus](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)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	git_model "code.gitea.io/gitea/models/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
@@ -194,8 +195,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 := db.FindAndCount[git_model.CommitStatus](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