0
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-06-04 03:46:53 +02:00

fine tune

This commit is contained in:
wxiaoguang 2025-05-28 05:35:43 +08:00
parent e843ac5711
commit 31e81156c8
5 changed files with 23 additions and 15 deletions

View File

@ -247,6 +247,7 @@ func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
lastStatus = statuses[0]
} else {
// FIXME: another bad case: if the "statuses" slice is empty, the returned value is an invalid CommitStatus, all its fields are empty.
// Frontend code (tmpl&vue) sometimes depend on the empty fields to skip rendering commit status elements (need to double check in the future)
lastStatus = &CommitStatus{}
}
}

View File

@ -59,7 +59,11 @@ func UpdateCommitStatusSummary(ctx context.Context, repoID int64, sha string) er
if err != nil {
return err
}
state := CalcCommitStatus(commitStatuses)
// it guarantees that commitStatuses is not empty because this function is always called after a commit status is created
if len(commitStatuses) == 0 {
setting.PanicInDevOrTesting("no commit statuses found for repo %d and sha %s", repoID, sha)
}
state := CalcCommitStatus(commitStatuses) // non-empty commitStatuses is guaranteed
// 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
if setting.Database.Type.IsMySQL() {

View File

@ -42,7 +42,7 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r
SHA: statuses[0].SHA,
TotalCount: len(statuses),
Repository: repo,
URL: "",
URL: "", // never set or used?
State: api.CommitStatusSuccess,
}
@ -58,9 +58,13 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r
// > failure if any of the contexts report as error or failure
// > pending if there are no statuses or a context is pending
// > success if the latest status for all contexts is success
if retStatus.State.IsError() {
retStatus.State = api.CommitStatusFailure
switch retStatus.State {
case api.CommitStatusSkipped:
retStatus.State = api.CommitStatusSuccess // all skipped means success
case api.CommitStatusPending, api.CommitStatusSuccess:
// use the current state for pending or success
default:
retStatus.State = api.CommitStatusFailure // otherwise, it is a failure
}
return retStatus
}

View File

@ -59,16 +59,15 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,
}
if matchedCount == 0 && returnedStatus == structs.CommitStatusSuccess {
status := git_model.CalcCommitStatus(commitStatuses)
if status != nil {
// FIXME: this check is not right, "status" can never be nil, but its fields can be empty if commitStatuses is empty
// here is just a quick patch to make it overall right.
if status.State == "" || status.State == structs.CommitStatusSkipped {
return structs.CommitStatusSuccess
}
return status.State
if len(commitStatuses) == 0 {
// "no statuses" should mean "pending"
return structs.CommitStatusPending
}
return structs.CommitStatusSuccess
status := git_model.CalcCommitStatus(commitStatuses)
if status.State == structs.CommitStatusSkipped {
return structs.CommitStatusSuccess // if all statuses are skipped, return success
}
return status.State
}
return returnedStatus

View File

@ -22,7 +22,7 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) {
{
commitStatuses: []*git_model.CommitStatus{},
requiredContexts: []string{},
expected: structs.CommitStatusSuccess,
expected: structs.CommitStatusPending,
},
{
commitStatuses: []*git_model.CommitStatus{