0
0
mirror of https://github.com/go-gitea/gitea.git synced 2026-05-08 01:34:08 +02:00

Some improvements

This commit is contained in:
Lunny Xiao 2025-05-25 12:39:38 -07:00
parent 43ed136609
commit 083e0ba97a
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
10 changed files with 40 additions and 38 deletions

View File

@ -89,27 +89,27 @@ func GetLatestCombinedStatusForRepoAndSHAs(ctx context.Context, repoSHAs []RepoS
return summaries, nil return summaries, nil
} }
func UpdateCommitStatusSummary(ctx context.Context, repoID int64, sha string) error { func InsertOrUpdateCombinedStatus(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
} }
summary := CalcCombinedStatus(commitStatuses) combinedStatus := CalcCombinedStatus(commitStatuses)
// mysql will return 0 when update a record which state hasn't been changed which behaviour is different from other database, // mysql will return 0 when update a record which state hasn't been changed which behaviour is different from other database,
// so we need to use insert in on duplicate // so we need to use insert in on duplicate
if setting.Database.Type.IsMySQL() { if setting.Database.Type.IsMySQL() {
_, err := db.GetEngine(ctx).Exec("INSERT INTO commit_status_summary (repo_id,sha,state,target_url) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE state=?", _, err := db.GetEngine(ctx).Exec("INSERT INTO commit_status_summary (repo_id,sha,state,target_url) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE state=?",
repoID, sha, summary.State, summary.TargetURL, summary.State) repoID, sha, combinedStatus.State, combinedStatus.TargetURL, combinedStatus.State)
return err return err
} }
if cnt, err := db.GetEngine(ctx).Where("repo_id=? AND sha=?", repoID, sha). if cnt, err := db.GetEngine(ctx).Where("repo_id=? AND sha=?", repoID, sha).
Cols("state, target_url"). Cols("state, target_url").
Update(summary); err != nil { Update(combinedStatus); err != nil {
return err return err
} else if cnt == 0 { } else if cnt == 0 {
_, err = db.GetEngine(ctx).Insert(summary) _, err = db.GetEngine(ctx).Insert(combinedStatus)
return err return err
} }
return nil return nil

View File

@ -232,7 +232,7 @@ func CalcCombinedStatusState(statuses []*CommitStatus) commitstatus.CombinedStat
for _, status := range statuses { for _, status := range statuses {
states = append(states, status.State) states = append(states, status.State)
} }
return states.Merge() return states.CalcAsCombinedStatusState()
} }
// CalcCombinedStatus returns combined status struct, the commit statuses should order by id desc // CalcCombinedStatus returns combined status struct, the commit statuses should order by id desc
@ -252,7 +252,7 @@ func CalcCombinedStatus(statuses []*CommitStatus) *CombinedStatus {
return &CombinedStatus{ return &CombinedStatus{
RepoID: statuses[0].RepoID, RepoID: statuses[0].RepoID,
SHA: statuses[0].SHA, SHA: statuses[0].SHA,
State: states.Merge(), State: states.CalcAsCombinedStatusState(),
TargetURL: targetURL, TargetURL: targetURL,
} }
} }

View File

@ -78,7 +78,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusPending, State: commitstatus.CommitStatusPending,
}, },
}, },
expected: commitstatus.CombinedStatusStatePending, expected: commitstatus.CombinedStatusPending,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -89,7 +89,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusPending, State: commitstatus.CommitStatusPending,
}, },
}, },
expected: commitstatus.CombinedStatusStatePending, expected: commitstatus.CombinedStatusPending,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -103,7 +103,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusSuccess, State: commitstatus.CommitStatusSuccess,
}, },
}, },
expected: commitstatus.CombinedStatusStatePending, expected: commitstatus.CombinedStatusPending,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -117,7 +117,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusSuccess, State: commitstatus.CommitStatusSuccess,
}, },
}, },
expected: commitstatus.CombinedStatusStateFailure, expected: commitstatus.CombinedStatusFailure,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -131,7 +131,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusSuccess, State: commitstatus.CommitStatusSuccess,
}, },
}, },
expected: commitstatus.CombinedStatusStatePending, expected: commitstatus.CombinedStatusPending,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -145,7 +145,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusSuccess, State: commitstatus.CommitStatusSuccess,
}, },
}, },
expected: commitstatus.CombinedStatusStateSuccess, expected: commitstatus.CombinedStatusSuccess,
}, },
{ {
statuses: []*git_model.CommitStatus{ statuses: []*git_model.CommitStatus{
@ -159,7 +159,7 @@ func Test_CalcCommitStatus(t *testing.T) {
State: commitstatus.CommitStatusWarning, State: commitstatus.CommitStatusWarning,
}, },
}, },
expected: commitstatus.CombinedStatusStateFailure, expected: commitstatus.CombinedStatusFailure,
}, },
} }

View File

@ -7,12 +7,12 @@ package commitstatus
type CombinedStatusState string type CombinedStatusState string
const ( const (
// CombinedStatusStatePending is for when the CombinedStatus is Pending // CombinedStatusPending is for when the CombinedStatus is Pending
CombinedStatusStatePending CombinedStatusState = "pending" CombinedStatusPending CombinedStatusState = "pending"
// CombinedStatusStateSuccess is for when the CombinedStatus is Success // CombinedStatusSuccess is for when the CombinedStatus is Success
CombinedStatusStateSuccess CombinedStatusState = "success" CombinedStatusSuccess CombinedStatusState = "success"
// CombinedStatusStateFailure is for when the CombinedStatus is Failure // CombinedStatusFailure is for when the CombinedStatus is Failure
CombinedStatusStateFailure CombinedStatusState = "failure" CombinedStatusFailure CombinedStatusState = "failure"
) )
func (cs CombinedStatusState) String() string { func (cs CombinedStatusState) String() string {
@ -21,15 +21,15 @@ func (cs CombinedStatusState) String() string {
// IsPending represents if commit status state is pending // IsPending represents if commit status state is pending
func (cs CombinedStatusState) IsPending() bool { func (cs CombinedStatusState) IsPending() bool {
return cs == CombinedStatusStatePending return cs == CombinedStatusPending
} }
// IsSuccess represents if commit status state is success // IsSuccess represents if commit status state is success
func (cs CombinedStatusState) IsSuccess() bool { func (cs CombinedStatusState) IsSuccess() bool {
return cs == CombinedStatusStateSuccess return cs == CombinedStatusSuccess
} }
// IsFailure represents if commit status state is failure // IsFailure represents if commit status state is failure
func (cs CombinedStatusState) IsFailure() bool { func (cs CombinedStatusState) IsFailure() bool {
return cs == CombinedStatusStateFailure return cs == CombinedStatusFailure
} }

View File

@ -57,19 +57,19 @@ type CommitStatusStates []CommitStatusState //nolint
// > pending if there are no statuses or a context is pending // > pending if there are no statuses or a context is pending
// > success if the latest status for all contexts is success // > success if the latest status for all contexts is success
func (css CommitStatusStates) Merge() CombinedStatusState { func (css CommitStatusStates) CalcAsCombinedStatusState() CombinedStatusState {
successCnt := 0 successCnt := 0
for _, state := range css { for _, state := range css {
switch { switch {
case state.IsError() || state.IsFailure(): case state.IsError() || state.IsFailure():
return CombinedStatusStateFailure return CombinedStatusFailure
case state.IsPending(): case state.IsPending():
case state.IsSuccess() || state.IsWarning(): case state.IsSuccess() || state.IsWarning():
successCnt++ successCnt++
} }
} }
if successCnt > 0 && successCnt == len(css) { if successCnt > 0 && successCnt == len(css) {
return CombinedStatusStateSuccess return CombinedStatusSuccess
} }
return CombinedStatusStatePending return CombinedStatusPending
} }

View File

@ -75,14 +75,14 @@ func Branches(ctx *context.Context) {
} }
} }
commitStatus := make(map[string]*git_model.CombinedStatus, len(commitStatuses)) combinedStatuses := make(map[string]*git_model.CombinedStatus, len(commitStatuses))
for commitID, cs := range commitStatuses { for commitID, cs := range commitStatuses {
commitStatus[commitID] = git_model.CalcCombinedStatus(cs) combinedStatuses[commitID] = git_model.CalcCombinedStatus(cs)
} }
ctx.Data["Keyword"] = kw ctx.Data["Keyword"] = kw
ctx.Data["Branches"] = branches ctx.Data["Branches"] = branches
ctx.Data["CommitStatus"] = commitStatus ctx.Data["CommitStatus"] = combinedStatuses
ctx.Data["CommitStatuses"] = commitStatuses ctx.Data["CommitStatuses"] = commitStatuses
ctx.Data["DefaultBranchBranch"] = defaultBranch ctx.Data["DefaultBranchBranch"] = defaultBranch
pager := context.NewPagination(int(branchesCount), pageSize, page, 5) pager := context.NewPagination(int(branchesCount), pageSize, page, 5)

View File

@ -5,6 +5,7 @@ package convert
import ( import (
"context" "context"
"net/url"
git_model "code.gitea.io/gitea/models/git" git_model "code.gitea.io/gitea/models/git"
user_model "code.gitea.io/gitea/models/user" user_model "code.gitea.io/gitea/models/user"
@ -44,6 +45,7 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r
SHA: combinedStatus.SHA, SHA: combinedStatus.SHA,
TotalCount: len(statuses), TotalCount: len(statuses),
Repository: repo, Repository: repo,
URL: combinedStatus.TargetURL, CommitURL: repo.URL + "/commits/" + url.PathEscape(combinedStatus.SHA),
URL: repo.URL + "/commits/" + url.PathEscape(combinedStatus.SHA) + "/status",
} }
} }

View File

@ -51,7 +51,7 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,
func IsCommitStatusContextSuccess(commitStatuses []*git_model.CommitStatus, requiredContexts []string) bool { func IsCommitStatusContextSuccess(commitStatuses []*git_model.CommitStatus, requiredContexts []string) bool {
// If no specific context is required, require that last commit status is a success // If no specific context is required, require that last commit status is a success
if len(requiredContexts) == 0 { if len(requiredContexts) == 0 {
return git_model.CalcCombinedStatusState(commitStatuses) == commitstatus.CombinedStatusStateSuccess return git_model.CalcCombinedStatusState(commitStatuses) == commitstatus.CombinedStatusSuccess
} }
for _, ctx := range requiredContexts { for _, ctx := range requiredContexts {

View File

@ -50,11 +50,11 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) {
} }
testCasesExpected := []commitstatus.CombinedStatusState{ testCasesExpected := []commitstatus.CombinedStatusState{
commitstatus.CombinedStatusStateSuccess, commitstatus.CombinedStatusSuccess,
commitstatus.CombinedStatusStatePending, commitstatus.CombinedStatusPending,
commitstatus.CombinedStatusStateFailure, commitstatus.CombinedStatusFailure,
commitstatus.CombinedStatusStatePending, commitstatus.CombinedStatusPending,
commitstatus.CombinedStatusStateSuccess, commitstatus.CombinedStatusSuccess,
} }
for i, commitStatuses := range testCases { for i, commitStatuses := range testCases {

View File

@ -99,7 +99,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err) return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err)
} }
return git_model.UpdateCommitStatusSummary(ctx, repo.ID, commit.ID.String()) return git_model.InsertOrUpdateCombinedStatus(ctx, repo.ID, commit.ID.String())
}); err != nil { }); err != nil {
return err return err
} }