From a168f3f3b28d52d6c0b47d9f0972498ddc25d4c2 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Sun, 14 Jan 2024 22:49:29 +0000 Subject: [PATCH 1/2] Use `FindAndCount`. --- models/git/commit_status.go | 67 +++++++++++++++----------------- models/git/commit_status_test.go | 15 ++++++- routers/api/v1/repo/status.go | 4 +- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 488e45de26f3..4c49d96eb033 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -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,60 +220,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 - } - - 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 +func (opts *CommitStatusOptions) ToConds() builder.Cond { + var cond builder.Cond = builder.Eq{ + "repo_id": opts.RepoID, + "sha": opts.SHA, } - 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) configureOrderBy(e db.Engine) { + switch opts.SortType { case "oldest": - sess.Asc("created_unix") + e.Asc("created_unix") case "recentupdate": - sess.Desc("updated_unix") + e.Desc("updated_unix") case "leastupdate": - sess.Asc("updated_unix") + e.Asc("updated_unix") case "leastindex": - sess.Desc("index") + e.Desc("`index`") case "highestindex": - sess.Asc("index") + e.Asc("`index`") default: - sess.Desc("created_unix") + e.Desc("created_unix") } } +// 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()) + + opts.configureOrderBy(sess) + 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 diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index 2197433b3e47..d82c2bc5ea7e 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -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) } diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go index 926d91ca8142..170d765cad23 100644 --- a/routers/api/v1/repo/status.go +++ b/routers/api/v1/repo/status.go @@ -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"), }) From a652a0cc6f172c37e54a4edfa9cc7875fc0f2713 Mon Sep 17 00:00:00 2001 From: KN4CK3R Date: Mon, 15 Jan 2024 11:02:21 +0000 Subject: [PATCH 2/2] Use `db.FindAndCount`. --- models/git/commit_status.go | 27 +++++++-------------------- models/git/commit_status_test.go | 4 ++-- routers/api/v1/repo/status.go | 3 ++- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 4c49d96eb033..c126d17f20ae 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -242,36 +242,23 @@ func (opts *CommitStatusOptions) ToConds() builder.Cond { return cond } -func (opts *CommitStatusOptions) configureOrderBy(e db.Engine) { +func (opts *CommitStatusOptions) ToOrders() string { switch opts.SortType { case "oldest": - e.Asc("created_unix") + return "created_unix ASC" case "recentupdate": - e.Desc("updated_unix") + return "updated_unix DESC" case "leastupdate": - e.Asc("updated_unix") + return "updated_unix ASC" case "leastindex": - e.Desc("`index`") + return "`index` DESC" case "highestindex": - e.Asc("`index`") + return "`index` ASC" default: - e.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()) - - opts.configureOrderBy(sess) - 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 diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index d82c2bc5ea7e..f7dd8597ed84 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -22,7 +22,7 @@ func TestGetCommitStatuses(t *testing.T) { sha1 := "1234123412341234123412341234123412341234" - statuses, maxResults, err := git_model.GetCommitStatuses(db.DefaultContext, &git_model.CommitStatusOptions{ + 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, @@ -51,7 +51,7 @@ func TestGetCommitStatuses(t *testing.T) { 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{ + 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, diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go index 170d765cad23..b4edf0608cf8 100644 --- a/routers/api/v1/repo/status.go +++ b/routers/api/v1/repo/status.go @@ -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,7 +195,7 @@ func getCommitStatuses(ctx *context.APIContext, sha string) { listOptions := utils.GetListOptions(ctx) - statuses, maxResults, err := git_model.GetCommitStatuses(ctx, &git_model.CommitStatusOptions{ + statuses, maxResults, err := db.FindAndCount[git_model.CommitStatus](ctx, &git_model.CommitStatusOptions{ ListOptions: listOptions, RepoID: repo.ID, SHA: sha,