Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
8d799c2
use the correct context data for PR link template in issue card
badhezi Apr 15, 2025
f2a2acf
Merge branch 'main' into main
badhezi Apr 15, 2025
5cc1bda
Merge branch 'main' into main
GiteaBot Apr 16, 2025
54d37d1
Merge branch 'main' into main
GiteaBot Apr 16, 2025
ac25150
Merge branch 'go-gitea:main' into main
badhezi Apr 16, 2025
e11a339
Merge branch 'go-gitea:main' into main
badhezi Apr 20, 2025
104eecc
Merge branch 'go-gitea:main' into main
badhezi Apr 21, 2025
bcc4ade
Merge branch 'go-gitea:main' into main
badhezi Apr 22, 2025
a7aaa79
Merge branch 'go-gitea:main' into main
badhezi Apr 27, 2025
b46d314
Merge branch 'go-gitea:main' into main
badhezi Apr 28, 2025
4e2434b
Merge branch 'go-gitea:main' into main
badhezi Apr 29, 2025
7f72fe9
Merge branch 'go-gitea:main' into main
badhezi May 2, 2025
c6acfc1
Merge branch 'go-gitea:main' into main
badhezi May 11, 2025
016c2f3
Merge branch 'go-gitea:main' into main
badhezi May 12, 2025
a3c2953
Merge branch 'go-gitea:main' into main
badhezi May 13, 2025
4d7ea0d
Merge branch 'go-gitea:main' into main
badhezi May 20, 2025
8adf028
add skipped commit status and icon indicator
badhezi May 20, 2025
ec76f44
Merge branch 'main' into dev/hezi/fix-skipped-icon
badhezi May 20, 2025
d352cfb
update js CommitStatus type
badhezi May 20, 2025
4479858
add commitStatusPriorities to skipped status
badhezi May 23, 2025
59f9944
Merge branch 'main' into dev/hezi/fix-skipped-icon
badhezi May 23, 2025
a2d0521
Update modules/structs/commit_status.go
wxiaoguang May 27, 2025
40bcd57
Merge branch 'main' into dev/hezi/fix-skipped-icon
wxiaoguang May 27, 2025
8d78184
clean up
wxiaoguang May 27, 2025
e9b8a15
Merge branch 'main' into dev/hezi/fix-skipped-icon
wxiaoguang May 27, 2025
e6dc186
add comment for CalcCommitStatus
wxiaoguang May 27, 2025
ebeed31
fix status check in MergeRequiredContextsCommitStatus
wxiaoguang May 27, 2025
49eef32
improve tests
wxiaoguang May 27, 2025
708b158
improve tests
wxiaoguang May 27, 2025
8c21f01
improve comments
wxiaoguang May 27, 2025
ca6bcf0
improve comments
wxiaoguang May 27, 2025
e843ac5
fix lint
wxiaoguang May 27, 2025
31e8115
fine tune
wxiaoguang May 27, 2025
ae60b24
remove dead code
wxiaoguang May 27, 2025
f4e75b2
Merge branch 'main' into dev/hezi/fix-skipped-icon
wxiaoguang May 28, 2025
747375a
Merge branch 'main' into dev/hezi/fix-skipped-icon
GiteaBot May 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion models/git/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,18 +230,23 @@ func (status *CommitStatus) HideActionsURL(ctx context.Context) {

// CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc
func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus {
// This function is widely used, but it is not quite right.
// Ideally it should return something like "CommitStatusSummary" with properly aggregated state.
// GitHub's behavior: if all statuses are "skipped", GitHub will return "success" as the combined status.
var lastStatus *CommitStatus
state := api.CommitStatusSuccess
for _, status := range statuses {
if status.State.NoBetterThan(state) {
if state == status.State || status.State.HasHigherPriorityThan(state) {
state = status.State
lastStatus = status
}
}
if lastStatus == nil {
if len(statuses) > 0 {
// FIXME: a bad case: Gitea just returns the first commit status, its status is "skipped" in this case.
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.
lastStatus = &CommitStatus{}
}
}
Expand Down
20 changes: 7 additions & 13 deletions modules/structs/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ const (
CommitStatusFailure CommitStatusState = "failure"
// CommitStatusWarning is for when the CommitStatus is Warning
CommitStatusWarning CommitStatusState = "warning"
// CommitStatusSkipped is for when CommitStatus is Skipped
CommitStatusSkipped CommitStatusState = "skipped"
)

var commitStatusPriorities = map[CommitStatusState]int{
Expand All @@ -26,25 +28,17 @@ var commitStatusPriorities = map[CommitStatusState]int{
CommitStatusWarning: 2,
CommitStatusPending: 3,
CommitStatusSuccess: 4,
CommitStatusSkipped: 5,
}

func (css CommitStatusState) String() string {
return string(css)
}

// NoBetterThan returns true if this State is no better than the given State
// This function only handles the states defined in CommitStatusPriorities
func (css CommitStatusState) NoBetterThan(css2 CommitStatusState) bool {
// NoBetterThan only handles the 5 states above
if _, exist := commitStatusPriorities[css]; !exist {
return false
}

if _, exist := commitStatusPriorities[css2]; !exist {
return false
}

return commitStatusPriorities[css] <= commitStatusPriorities[css2]
// HasHigherPriorityThan returns true if this state has higher priority than the other
// Undefined states are considered to have the highest priority like CommitStatusError(0)
func (css CommitStatusState) HasHigherPriorityThan(other CommitStatusState) bool {
return commitStatusPriorities[css] < commitStatusPriorities[other]
}

// IsPending represents if commit status state is pending
Expand Down
168 changes: 12 additions & 156 deletions modules/structs/commit_status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,165 +10,21 @@
)

func TestNoBetterThan(t *testing.T) {
type args struct {
css CommitStatusState
css2 CommitStatusState
}
var unExpectedState CommitStatusState
tests := []struct {
name string
args args
want bool
s1, s2 CommitStatusState
higher bool
}{
{
name: "success is no better than success",
args: args{
css: CommitStatusSuccess,
css2: CommitStatusSuccess,
},
want: true,
},
{
name: "success is no better than pending",
args: args{
css: CommitStatusSuccess,
css2: CommitStatusPending,
},
want: false,
},
{
name: "success is no better than failure",
args: args{
css: CommitStatusSuccess,
css2: CommitStatusFailure,
},
want: false,
},
{
name: "success is no better than error",
args: args{
css: CommitStatusSuccess,
css2: CommitStatusError,
},
want: false,
},
{
name: "pending is no better than success",
args: args{
css: CommitStatusPending,
css2: CommitStatusSuccess,
},
want: true,
},
{
name: "pending is no better than pending",
args: args{
css: CommitStatusPending,
css2: CommitStatusPending,
},
want: true,
},
{
name: "pending is no better than failure",
args: args{
css: CommitStatusPending,
css2: CommitStatusFailure,
},
want: false,
},
{
name: "pending is no better than error",
args: args{
css: CommitStatusPending,
css2: CommitStatusError,
},
want: false,
},
{
name: "failure is no better than success",
args: args{
css: CommitStatusFailure,
css2: CommitStatusSuccess,
},
want: true,
},
{
name: "failure is no better than pending",
args: args{
css: CommitStatusFailure,
css2: CommitStatusPending,
},
want: true,
},
{
name: "failure is no better than failure",
args: args{
css: CommitStatusFailure,
css2: CommitStatusFailure,
},
want: true,
},
{
name: "failure is no better than error",
args: args{
css: CommitStatusFailure,
css2: CommitStatusError,
},
want: false,
},
{
name: "error is no better than success",
args: args{
css: CommitStatusError,
css2: CommitStatusSuccess,
},
want: true,
},
{
name: "error is no better than pending",
args: args{
css: CommitStatusError,
css2: CommitStatusPending,
},
want: true,
},
{
name: "error is no better than failure",
args: args{
css: CommitStatusError,
css2: CommitStatusFailure,
},
want: true,
},
{
name: "error is no better than error",
args: args{
css: CommitStatusError,
css2: CommitStatusError,
},
want: true,
},
{
name: "unExpectedState is no better than success",
args: args{
css: unExpectedState,
css2: CommitStatusSuccess,
},
want: false,
},
{
name: "unExpectedState is no better than unExpectedState",
args: args{
css: unExpectedState,
css2: unExpectedState,
},
want: false,
},
{CommitStatusError, CommitStatusFailure, true},
{CommitStatusFailure, CommitStatusWarning, true},
{CommitStatusWarning, CommitStatusPending, true},
{CommitStatusPending, CommitStatusSuccess, true},
{CommitStatusSuccess, CommitStatusSkipped, true},

{CommitStatusError, "unknown-xxx", false},
{"unknown-xxx", CommitStatusFailure, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := tt.args.css.NoBetterThan(tt.args.css2)
assert.Equal(t, tt.want, result)
})
assert.Equal(t, tt.higher, tt.s1.HasHigherPriorityThan(tt.s2), "s1=%s, s2=%s, expected=%v", tt.s1, tt.s2, tt.higher)
}
assert.Equal(t, false, CommitStatusError.HasHigherPriorityThan(CommitStatusError))

Check failure on line 29 in modules/structs/commit_status_test.go

View workflow job for this annotation

GitHub Actions / lint-backend

bool-compare: use assert.False (testifylint)

Check failure on line 29 in modules/structs/commit_status_test.go

View workflow job for this annotation

GitHub Actions / lint-go-windows

bool-compare: use assert.False (testifylint)

Check failure on line 29 in modules/structs/commit_status_test.go

View workflow job for this annotation

GitHub Actions / lint-go-gogit

bool-compare: use assert.False (testifylint)
}
4 changes: 3 additions & 1 deletion services/actions/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,14 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er

func toCommitStatus(status actions_model.Status) api.CommitStatusState {
switch status {
case actions_model.StatusSuccess, actions_model.StatusSkipped:
case actions_model.StatusSuccess:
return api.CommitStatusSuccess
case actions_model.StatusFailure, actions_model.StatusCancelled:
return api.CommitStatusFailure
case actions_model.StatusWaiting, actions_model.StatusBlocked, actions_model.StatusRunning:
return api.CommitStatusPending
case actions_model.StatusSkipped:
return api.CommitStatusSkipped
default:
return api.CommitStatusError
}
Expand Down
3 changes: 2 additions & 1 deletion services/convert/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,13 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r
TotalCount: len(statuses),
Repository: repo,
URL: "",
State: api.CommitStatusSuccess,
}

retStatus.Statuses = make([]*api.CommitStatus, 0, len(statuses))
for _, status := range statuses {
retStatus.Statuses = append(retStatus.Statuses, ToCommitStatus(ctx, status))
if retStatus.State == "" || status.State.NoBetterThan(retStatus.State) {
if status.State.HasHigherPriorityThan(retStatus.State) {
retStatus.State = status.State
}
}
Expand Down
9 changes: 7 additions & 2 deletions services/pull/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus,

// If required rule not match any action, then it is pending
if targetStatus == "" {
if structs.CommitStatusPending.NoBetterThan(returnedStatus) {
if structs.CommitStatusPending.HasHigherPriorityThan(returnedStatus) {
returnedStatus = structs.CommitStatusPending
}
break
}

if targetStatus.NoBetterThan(returnedStatus) {
if targetStatus.HasHigherPriorityThan(returnedStatus) {
returnedStatus = targetStatus
}
}
Expand All @@ -61,6 +61,11 @@ 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
}
return structs.CommitStatusSuccess
Expand Down
Loading
Loading