mirror of
https://github.com/go-gitea/gitea
synced 2025-07-08 03:27:19 +00:00
Split GetLatestCommitStatus as two functions (#34535)
Extract from #34531. This will reduce unnecessary count operation in databases. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
@ -7,6 +7,7 @@
|
|||||||
target_url: https://example.com/builds/
|
target_url: https://example.com/builds/
|
||||||
description: My awesome CI-service
|
description: My awesome CI-service
|
||||||
context: ci/awesomeness
|
context: ci/awesomeness
|
||||||
|
context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7
|
||||||
creator_id: 2
|
creator_id: 2
|
||||||
|
|
||||||
-
|
-
|
||||||
@ -18,6 +19,7 @@
|
|||||||
target_url: https://example.com/converage/
|
target_url: https://example.com/converage/
|
||||||
description: My awesome Coverage service
|
description: My awesome Coverage service
|
||||||
context: cov/awesomeness
|
context: cov/awesomeness
|
||||||
|
context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe
|
||||||
creator_id: 2
|
creator_id: 2
|
||||||
|
|
||||||
-
|
-
|
||||||
@ -29,6 +31,7 @@
|
|||||||
target_url: https://example.com/converage/
|
target_url: https://example.com/converage/
|
||||||
description: My awesome Coverage service
|
description: My awesome Coverage service
|
||||||
context: cov/awesomeness
|
context: cov/awesomeness
|
||||||
|
context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe
|
||||||
creator_id: 2
|
creator_id: 2
|
||||||
|
|
||||||
-
|
-
|
||||||
@ -40,6 +43,7 @@
|
|||||||
target_url: https://example.com/builds/
|
target_url: https://example.com/builds/
|
||||||
description: My awesome CI-service
|
description: My awesome CI-service
|
||||||
context: ci/awesomeness
|
context: ci/awesomeness
|
||||||
|
context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7
|
||||||
creator_id: 2
|
creator_id: 2
|
||||||
|
|
||||||
-
|
-
|
||||||
@ -51,4 +55,5 @@
|
|||||||
target_url: https://example.com/builds/
|
target_url: https://example.com/builds/
|
||||||
description: My awesome deploy service
|
description: My awesome deploy service
|
||||||
context: deploy/awesomeness
|
context: deploy/awesomeness
|
||||||
|
context_hash: ae9547713a6665fc4261d0756904932085a41cf2
|
||||||
creator_id: 2
|
creator_id: 2
|
||||||
|
@ -298,27 +298,37 @@ type CommitStatusIndex struct {
|
|||||||
MaxIndex int64 `xorm:"index"`
|
MaxIndex int64 `xorm:"index"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLatestCommitStatus returns all statuses with a unique context for a given commit.
|
func makeRepoCommitQuery(ctx context.Context, repoID int64, sha string) *xorm.Session {
|
||||||
func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, int64, error) {
|
|
||||||
getBase := func() *xorm.Session {
|
|
||||||
return db.GetEngine(ctx).Table(&CommitStatus{}).
|
return db.GetEngine(ctx).Table(&CommitStatus{}).
|
||||||
Where("repo_id = ?", repoID).And("sha = ?", sha)
|
Where("repo_id = ?", repoID).And("sha = ?", sha)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLatestCommitStatus returns all statuses with a unique context for a given commit.
|
||||||
|
func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOptions db.ListOptions) ([]*CommitStatus, error) {
|
||||||
indices := make([]int64, 0, 10)
|
indices := make([]int64, 0, 10)
|
||||||
sess := getBase().Select("max( `index` ) as `index`").
|
sess := makeRepoCommitQuery(ctx, repoID, sha).
|
||||||
GroupBy("context_hash").OrderBy("max( `index` ) desc")
|
Select("max( `index` ) as `index`").
|
||||||
|
GroupBy("context_hash").
|
||||||
|
OrderBy("max( `index` ) desc")
|
||||||
if !listOptions.IsListAll() {
|
if !listOptions.IsListAll() {
|
||||||
sess = db.SetSessionPagination(sess, &listOptions)
|
sess = db.SetSessionPagination(sess, &listOptions)
|
||||||
}
|
}
|
||||||
count, err := sess.FindAndCount(&indices)
|
if err := sess.Find(&indices); err != nil {
|
||||||
if err != nil {
|
return nil, err
|
||||||
return nil, count, err
|
|
||||||
}
|
}
|
||||||
statuses := make([]*CommitStatus, 0, len(indices))
|
statuses := make([]*CommitStatus, 0, len(indices))
|
||||||
if len(indices) == 0 {
|
if len(indices) == 0 {
|
||||||
return statuses, count, nil
|
return statuses, nil
|
||||||
}
|
}
|
||||||
return statuses, count, getBase().And(builder.In("`index`", indices)).Find(&statuses)
|
err := makeRepoCommitQuery(ctx, repoID, sha).And(builder.In("`index`", indices)).Find(&statuses)
|
||||||
|
return statuses, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func CountLatestCommitStatus(ctx context.Context, repoID int64, sha string) (int64, error) {
|
||||||
|
return makeRepoCommitQuery(ctx, repoID, sha).
|
||||||
|
Select("count(context_hash)").
|
||||||
|
GroupBy("context_hash").
|
||||||
|
Count()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs
|
// GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs
|
||||||
|
@ -55,7 +55,7 @@ func GetLatestCommitStatusForRepoAndSHAs(ctx context.Context, repoSHAs []RepoSHA
|
|||||||
}
|
}
|
||||||
|
|
||||||
func UpdateCommitStatusSummary(ctx context.Context, repoID int64, sha string) error {
|
func UpdateCommitStatusSummary(ctx context.Context, repoID int64, sha string) error {
|
||||||
commitStatuses, _, err := GetLatestCommitStatus(ctx, repoID, sha, db.ListOptionsAll)
|
commitStatuses, err := GetLatestCommitStatus(ctx, repoID, sha, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ func TestGetCommitStatuses(t *testing.T) {
|
|||||||
|
|
||||||
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||||
|
|
||||||
sha1 := "1234123412341234123412341234123412341234"
|
sha1 := "1234123412341234123412341234123412341234" // the mocked commit ID in test fixtures
|
||||||
|
|
||||||
statuses, maxResults, err := db.FindAndCount[git_model.CommitStatus](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},
|
ListOptions: db.ListOptions{Page: 1, PageSize: 50},
|
||||||
@ -256,3 +256,26 @@ func TestCommitStatusesHideActionsURL(t *testing.T) {
|
|||||||
assert.Empty(t, statuses[0].TargetURL)
|
assert.Empty(t, statuses[0].TargetURL)
|
||||||
assert.Equal(t, "https://mycicd.org/1", statuses[1].TargetURL)
|
assert.Equal(t, "https://mycicd.org/1", statuses[1].TargetURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetCountLatestCommitStatus(t *testing.T) {
|
||||||
|
assert.NoError(t, unittest.PrepareTestDatabase())
|
||||||
|
|
||||||
|
repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||||
|
|
||||||
|
sha1 := "1234123412341234123412341234123412341234" // the mocked commit ID in test fixtures
|
||||||
|
|
||||||
|
commitStatuses, err := git_model.GetLatestCommitStatus(db.DefaultContext, repo1.ID, sha1, db.ListOptions{
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 2,
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Len(t, commitStatuses, 2)
|
||||||
|
assert.Equal(t, structs.CommitStatusFailure, commitStatuses[0].State)
|
||||||
|
assert.Equal(t, "ci/awesomeness", commitStatuses[0].Context)
|
||||||
|
assert.Equal(t, structs.CommitStatusError, commitStatuses[1].State)
|
||||||
|
assert.Equal(t, "deploy/awesomeness", commitStatuses[1].Context)
|
||||||
|
|
||||||
|
count, err := git_model.CountLatestCommitStatus(db.DefaultContext, repo1.ID, sha1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 3, count)
|
||||||
|
}
|
||||||
|
@ -258,19 +258,24 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) {
|
|||||||
|
|
||||||
repo := ctx.Repo.Repository
|
repo := ctx.Repo.Repository
|
||||||
|
|
||||||
statuses, count, err := git_model.GetLatestCommitStatus(ctx, repo.ID, refCommit.Commit.ID.String(), utils.GetListOptions(ctx))
|
statuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, refCommit.Commit.ID.String(), utils.GetListOptions(ctx))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.APIErrorInternal(fmt.Errorf("GetLatestCommitStatus[%s, %s]: %w", repo.FullName(), refCommit.CommitID, err))
|
ctx.APIErrorInternal(fmt.Errorf("GetLatestCommitStatus[%s, %s]: %w", repo.FullName(), refCommit.CommitID, err))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count, err := git_model.CountLatestCommitStatus(ctx, repo.ID, refCommit.Commit.ID.String())
|
||||||
|
if err != nil {
|
||||||
|
ctx.APIErrorInternal(fmt.Errorf("CountLatestCommitStatus[%s, %s]: %w", repo.FullName(), refCommit.CommitID, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.SetTotalCountHeader(count)
|
||||||
|
|
||||||
if len(statuses) == 0 {
|
if len(statuses) == 0 {
|
||||||
ctx.JSON(http.StatusOK, &api.CombinedStatus{})
|
ctx.JSON(http.StatusOK, &api.CombinedStatus{})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
combiStatus := convert.ToCombinedStatus(ctx, statuses, convert.ToRepo(ctx, repo, ctx.Repo.Permission))
|
combiStatus := convert.ToCombinedStatus(ctx, statuses, convert.ToRepo(ctx, repo, ctx.Repo.Permission))
|
||||||
|
|
||||||
ctx.SetTotalCountHeader(count)
|
|
||||||
ctx.JSON(http.StatusOK, combiStatus)
|
ctx.JSON(http.StatusOK, combiStatus)
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ func Diff(ctx *context.Context) {
|
|||||||
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
|
ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML()
|
||||||
}
|
}
|
||||||
|
|
||||||
statuses, _, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, commitID, db.ListOptionsAll)
|
statuses, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, commitID, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("GetLatestCommitStatus: %v", err)
|
log.Error("GetLatestCommitStatus: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ func prepareMergedViewPullInfo(ctx *context.Context, issue *issues_model.Issue)
|
|||||||
|
|
||||||
if len(compareInfo.Commits) != 0 {
|
if len(compareInfo.Commits) != 0 {
|
||||||
sha := compareInfo.Commits[0].ID.String()
|
sha := compareInfo.Commits[0].ID.String()
|
||||||
commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, sha, db.ListOptionsAll)
|
commitStatuses, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, sha, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetLatestCommitStatus", err)
|
ctx.ServerError("GetLatestCommitStatus", err)
|
||||||
return nil
|
return nil
|
||||||
@ -358,7 +358,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
|
|||||||
ctx.ServerError(fmt.Sprintf("GetRefCommitID(%s)", pull.GetGitRefName()), err)
|
ctx.ServerError(fmt.Sprintf("GetRefCommitID(%s)", pull.GetGitRefName()), err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll)
|
commitStatuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetLatestCommitStatus", err)
|
ctx.ServerError("GetLatestCommitStatus", err)
|
||||||
return nil
|
return nil
|
||||||
@ -454,7 +454,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll)
|
commitStatuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetLatestCommitStatus", err)
|
ctx.ServerError("GetLatestCommitStatus", err)
|
||||||
return nil
|
return nil
|
||||||
|
@ -130,7 +130,7 @@ func getReleaseInfos(ctx *context.Context, opts *repo_model.FindReleasesOptions)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if canReadActions {
|
if canReadActions {
|
||||||
statuses, _, err := git_model.GetLatestCommitStatus(ctx, r.Repo.ID, r.Sha1, db.ListOptionsAll)
|
statuses, err := git_model.GetLatestCommitStatus(ctx, r.Repo.ID, r.Sha1, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ func loadLatestCommitData(ctx *context.Context, latestCommit *git.Commit) bool {
|
|||||||
ctx.Data["LatestCommitVerification"] = verification
|
ctx.Data["LatestCommitVerification"] = verification
|
||||||
ctx.Data["LatestCommitUser"] = user_model.ValidateCommitWithEmail(ctx, latestCommit)
|
ctx.Data["LatestCommitUser"] = user_model.ValidateCommitWithEmail(ctx, latestCommit)
|
||||||
|
|
||||||
statuses, _, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, latestCommit.ID.String(), db.ListOptionsAll)
|
statuses, err := git_model.GetLatestCommitStatus(ctx, ctx.Repo.Repository.ID, latestCommit.ID.String(), db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("GetLatestCommitStatus: %v", err)
|
log.Error("GetLatestCommitStatus: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er
|
|||||||
}
|
}
|
||||||
ctxname := fmt.Sprintf("%s / %s (%s)", runName, job.Name, event)
|
ctxname := fmt.Sprintf("%s / %s (%s)", runName, job.Name, event)
|
||||||
state := toCommitStatus(job.Status)
|
state := toCommitStatus(job.Status)
|
||||||
if statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll); err == nil {
|
if statuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, sha, db.ListOptionsAll); err == nil {
|
||||||
for _, v := range statuses {
|
for _, v := range statuses {
|
||||||
if v.Context == ctxname {
|
if v.Context == ctxname {
|
||||||
if v.State == state {
|
if v.State == state {
|
||||||
|
@ -84,7 +84,7 @@ func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.Sig
|
|||||||
commit := &git_model.SignCommitWithStatuses{
|
commit := &git_model.SignCommitWithStatuses{
|
||||||
SignCommit: c,
|
SignCommit: c,
|
||||||
}
|
}
|
||||||
statuses, _, err := git_model.GetLatestCommitStatus(ctx, repo.ID, commit.ID.String(), db.ListOptions{})
|
statuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, commit.ID.String(), db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR
|
|||||||
return "", errors.Wrap(err, "LoadBaseRepo")
|
return "", errors.Wrap(err, "LoadBaseRepo")
|
||||||
}
|
}
|
||||||
|
|
||||||
commitStatuses, _, err := git_model.GetLatestCommitStatus(ctx, pr.BaseRepo.ID, sha, db.ListOptionsAll)
|
commitStatuses, err := git_model.GetLatestCommitStatus(ctx, pr.BaseRepo.ID, sha, db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "GetLatestCommitStatus")
|
return "", errors.Wrap(err, "GetLatestCommitStatus")
|
||||||
}
|
}
|
||||||
|
@ -1004,7 +1004,7 @@ func getAllCommitStatus(ctx context.Context, gitRepo *git.Repository, pr *issues
|
|||||||
return nil, nil, shaErr
|
return nil, nil, shaErr
|
||||||
}
|
}
|
||||||
|
|
||||||
statuses, _, err = git_model.GetLatestCommitStatus(ctx, pr.BaseRepo.ID, sha, db.ListOptionsAll)
|
statuses, err = git_model.GetLatestCommitStatus(ctx, pr.BaseRepo.ID, sha, db.ListOptionsAll)
|
||||||
lastStatus = git_model.CalcCommitStatus(statuses)
|
lastStatus = git_model.CalcCommitStatus(statuses)
|
||||||
return statuses, lastStatus, err
|
return statuses, lastStatus, err
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ func (graph *Graph) LoadAndProcessCommits(ctx context.Context, repository *repo_
|
|||||||
return repo_model.IsOwnerMemberCollaborator(ctx, repository, user.ID)
|
return repo_model.IsOwnerMemberCollaborator(ctx, repository, user.ID)
|
||||||
}, &keyMap)
|
}, &keyMap)
|
||||||
|
|
||||||
statuses, _, err := git_model.GetLatestCommitStatus(ctx, repository.ID, c.Commit.ID.String(), db.ListOptions{})
|
statuses, err := git_model.GetLatestCommitStatus(ctx, repository.ID, c.Commit.ID.String(), db.ListOptionsAll)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("GetLatestCommitStatus: %v", err)
|
log.Error("GetLatestCommitStatus: %v", err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -633,7 +633,7 @@ jobs:
|
|||||||
assert.NotEmpty(t, addFileResp)
|
assert.NotEmpty(t, addFileResp)
|
||||||
sha = addFileResp.Commit.SHA
|
sha = addFileResp.Commit.SHA
|
||||||
assert.Eventually(t, func() bool {
|
assert.Eventually(t, func() bool {
|
||||||
latestCommitStatuses, _, err := git_model.GetLatestCommitStatus(db.DefaultContext, repo.ID, sha, db.ListOptionsAll)
|
latestCommitStatuses, err := git_model.GetLatestCommitStatus(db.DefaultContext, repo.ID, sha, db.ListOptionsAll)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if len(latestCommitStatuses) == 0 {
|
if len(latestCommitStatuses) == 0 {
|
||||||
return false
|
return false
|
||||||
@ -676,7 +676,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func checkCommitStatusAndInsertFakeStatus(t *testing.T, repo *repo_model.Repository, sha string) {
|
func checkCommitStatusAndInsertFakeStatus(t *testing.T, repo *repo_model.Repository, sha string) {
|
||||||
latestCommitStatuses, _, err := git_model.GetLatestCommitStatus(db.DefaultContext, repo.ID, sha, db.ListOptionsAll)
|
latestCommitStatuses, err := git_model.GetLatestCommitStatus(db.DefaultContext, repo.ID, sha, db.ListOptionsAll)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, latestCommitStatuses, 1)
|
assert.Len(t, latestCommitStatuses, 1)
|
||||||
assert.Equal(t, api.CommitStatusPending, latestCommitStatuses[0].State)
|
assert.Equal(t, api.CommitStatusPending, latestCommitStatuses[0].State)
|
||||||
|
Reference in New Issue
Block a user