From bcee9d20a765b6814d108ddf75fd3f1eac769ad8 Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 10:32:27 +0800 Subject: [PATCH 01/11] Remove commit status running and warning --- models/git/commit_status_test.go | 4 ---- modules/structs/commit_status.go | 26 ++++++-------------------- services/actions/commit_status.go | 10 +++------- services/convert/status.go | 4 ++++ tests/integration/pull_status_test.go | 2 -- 5 files changed, 13 insertions(+), 33 deletions(-) diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index 2197433b3e475..a86941a0fec8c 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -31,10 +31,6 @@ func TestGetCommitStatuses(t *testing.T) { assert.Equal(t, structs.CommitStatusPending, statuses[0].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL(db.DefaultContext)) - assert.Equal(t, "cov/awesomeness", statuses[1].Context) - assert.Equal(t, structs.CommitStatusWarning, statuses[1].State) - assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL(db.DefaultContext)) - assert.Equal(t, "cov/awesomeness", statuses[2].Context) assert.Equal(t, structs.CommitStatusSuccess, statuses[2].State) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL(db.DefaultContext)) diff --git a/modules/structs/commit_status.go b/modules/structs/commit_status.go index 7e3b629b7ae20..ff31f2d2ac3de 100644 --- a/modules/structs/commit_status.go +++ b/modules/structs/commit_status.go @@ -16,26 +16,17 @@ const ( CommitStatusError CommitStatusState = "error" // CommitStatusFailure is for when the CommitStatus is Failure CommitStatusFailure CommitStatusState = "failure" - // CommitStatusWarning is for when the CommitStatus is Warning - CommitStatusWarning CommitStatusState = "warning" - // CommitStatusRunning is for when the CommitStatus is Running - CommitStatusRunning CommitStatusState = "running" ) // NoBetterThan returns true if this State is no better than the given State func (css CommitStatusState) NoBetterThan(css2 CommitStatusState) bool { - switch css { - case CommitStatusError: - return true - case CommitStatusFailure: - return css2 != CommitStatusError - case CommitStatusWarning: - return css2 != CommitStatusError && css2 != CommitStatusFailure - case CommitStatusPending: - return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning - default: - return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning && css2 != CommitStatusPending + commitStatusPriorities := map[CommitStatusState]int{ + CommitStatusError: 0, + CommitStatusFailure: 1, + CommitStatusPending: 2, + CommitStatusSuccess: 3, } + return commitStatusPriorities[css] <= commitStatusPriorities[css2] } // IsPending represents if commit status state is pending @@ -57,8 +48,3 @@ func (css CommitStatusState) IsError() bool { func (css CommitStatusState) IsFailure() bool { return css == CommitStatusFailure } - -// IsWarning represents if commit status state is warning -func (css CommitStatusState) IsWarning() bool { - return css == CommitStatusWarning -} diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index 6114f2b443c2c..d33599117ccb4 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -137,16 +137,12 @@ func toCommitStatus(status actions_model.Status) api.CommitStatusState { switch status { case actions_model.StatusSuccess, actions_model.StatusSkipped: return api.CommitStatusSuccess - case actions_model.StatusFailure: + case actions_model.StatusFailure, actions_model.StatusCancelled: return api.CommitStatusFailure - case actions_model.StatusCancelled: - return api.CommitStatusWarning - case actions_model.StatusWaiting, actions_model.StatusBlocked: + case actions_model.StatusWaiting, actions_model.StatusBlocked, actions_model.StatusRunning: return api.CommitStatusPending - case actions_model.StatusRunning: - return api.CommitStatusRunning default: - return api.CommitStatusError + return api.CommitStatusFailure } } diff --git a/services/convert/status.go b/services/convert/status.go index b8c11ab630947..2fd702bf46036 100644 --- a/services/convert/status.go +++ b/services/convert/status.go @@ -52,6 +52,10 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r retStatus.State = status.State } } + // to align with GitHub, failure if any of the contexts report as error or failure + if retStatus.State.IsError() { + retStatus.State = api.CommitStatusFailure + } return retStatus } diff --git a/tests/integration/pull_status_test.go b/tests/integration/pull_status_test.go index 6a6fd2e859f91..7c1f8c701e7a4 100644 --- a/tests/integration/pull_status_test.go +++ b/tests/integration/pull_status_test.go @@ -52,7 +52,6 @@ func TestPullCreate_CommitStatus(t *testing.T) { api.CommitStatusPending, api.CommitStatusError, api.CommitStatusFailure, - api.CommitStatusWarning, api.CommitStatusSuccess, } @@ -61,7 +60,6 @@ func TestPullCreate_CommitStatus(t *testing.T) { api.CommitStatusSuccess: "octicon-check", api.CommitStatusError: "gitea-exclamation", api.CommitStatusFailure: "octicon-x", - api.CommitStatusWarning: "gitea-exclamation", } testCtx := NewAPITestContext(t, "user1", "repo1", auth_model.AccessTokenScopeWriteRepository) From 5905217f5666a84de41b5457613abd29644bd2a5 Mon Sep 17 00:00:00 2001 From: caicandong <50507092+CaiCandong@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:10:57 +0800 Subject: [PATCH 02/11] Update services/convert/status.go Co-authored-by: Jason Song --- services/convert/status.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/convert/status.go b/services/convert/status.go index 2fd702bf46036..c7b6450e272d3 100644 --- a/services/convert/status.go +++ b/services/convert/status.go @@ -52,7 +52,11 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r retStatus.State = status.State } } - // to align with GitHub, failure if any of the contexts report as error or failure + // According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference + // > Additionally, a combined state is returned. The state is one of: + // > 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 } From 1207a46d217334d31c69869ba8b6f4d58a7cb209 Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 12:18:43 +0800 Subject: [PATCH 03/11] Remove useless front-end template code --- services/actions/commit_status.go | 2 +- templates/repo/commit_status.tmpl | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index d33599117ccb4..925d0a33968aa 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -142,7 +142,7 @@ func toCommitStatus(status actions_model.Status) api.CommitStatusState { case actions_model.StatusWaiting, actions_model.StatusBlocked, actions_model.StatusRunning: return api.CommitStatusPending default: - return api.CommitStatusFailure + return api.CommitStatusError } } diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index d52e151247afa..bb25ba99bdfaf 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -1,9 +1,6 @@ {{if eq .State "pending"}} {{svg "octicon-dot-fill" 18 "commit-status icon text grey"}} {{end}} -{{if eq .State "running"}} - {{svg "octicon-dot-fill" 18 "commit-status icon text yellow"}} -{{end}} {{if eq .State "success"}} {{svg "octicon-check" 18 "commit-status icon text green"}} {{end}} @@ -12,7 +9,4 @@ {{end}} {{if eq .State "failure"}} {{svg "octicon-x" 18 "commit-status icon text red"}} -{{end}} -{{if eq .State "warning"}} - {{svg "gitea-exclamation" 18 "commit-status icon text yellow"}} -{{end}} +{{end}} \ No newline at end of file From 27beba30522e94f33694a2e8147a0c3d79b1ed6a Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 15:07:57 +0800 Subject: [PATCH 04/11] fix compatible with old version status --- models/git/commit_status.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index c418cd23eb63c..1616c6f5c0f3c 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -218,6 +218,18 @@ type CommitStatusOptions struct { SortType string } +// compatibleCommitStatus compatible with old version status +// and convert old version status to new version status +func compatibleCommitStatus(statuses []*CommitStatus) { + for i := range statuses { + if statuses[i].State == "warning" { + statuses[i].State = api.CommitStatusFailure + } else if statuses[i].State == "running" { + statuses[i].State = api.CommitStatusPending + } + } +} + // 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 { @@ -239,13 +251,16 @@ func GetCommitStatuses(ctx context.Context, repo *repo_model.Repository, sha str findSession := listCommitStatusesStatement(ctx, repo, sha, opts) findSession = db.SetSessionPagination(findSession, opts) sortCommitStatusesSession(findSession, opts.SortType) - return statuses, maxResults, findSession.Find(&statuses) + err = findSession.Find(&statuses) + // TODO: compatible with old version status,it will be removed in the future + compatibleCommitStatus(statuses) + return statuses, maxResults, err } 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": + case "pending", "success", "error", "failure": sess.And("state = ?", opts.State) } return sess @@ -294,7 +309,10 @@ func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOp if len(ids) == 0 { return statuses, count, nil } - return statuses, count, db.GetEngine(ctx).In("id", ids).Find(&statuses) + err = db.GetEngine(ctx).In("id", ids).Find(&statuses) + // TODO: compatible with old version status,it will be removed in the future + compatibleCommitStatus(statuses) + return statuses, count, err } // GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs @@ -333,6 +351,8 @@ func GetLatestCommitStatusForPairs(ctx context.Context, repoIDsToLatestCommitSHA statuses := make([]*CommitStatus, 0, len(ids)) if len(ids) > 0 { err = db.GetEngine(ctx).In("id", ids).Find(&statuses) + // TODO: compatible with old version status,it will be removed in the future + compatibleCommitStatus(statuses) if err != nil { return nil, err } @@ -380,6 +400,8 @@ func GetLatestCommitStatusForRepoCommitIDs(ctx context.Context, repoID int64, co statuses := make([]*CommitStatus, 0, len(ids)) if len(ids) > 0 { err = db.GetEngine(ctx).In("id", ids).Find(&statuses) + // TODO: compatible with old version status,it will be removed in the future + compatibleCommitStatus(statuses) if err != nil { return nil, err } From e008032665102336f65c92da334d3920e24d10e1 Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 15:08:34 +0800 Subject: [PATCH 05/11] fix lint --- templates/repo/commit_status.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index bb25ba99bdfaf..8733fe6f5895e 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -9,4 +9,4 @@ {{end}} {{if eq .State "failure"}} {{svg "octicon-x" 18 "commit-status icon text red"}} -{{end}} \ No newline at end of file +{{end}} From ba86521a644c44ece73bb479efbc0908e514fb62 Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 15:09:33 +0800 Subject: [PATCH 06/11] test remove commit status running and warning --- tests/integration/repo_commits_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/repo_commits_test.go b/tests/integration/repo_commits_test.go index 5f580a0268d57..4e3c50fa2f3b2 100644 --- a/tests/integration/repo_commits_test.go +++ b/tests/integration/repo_commits_test.go @@ -126,11 +126,11 @@ func TestRepoCommitsWithStatusFailure(t *testing.T) { } func TestRepoCommitsWithStatusWarning(t *testing.T) { - doTestRepoCommitWithStatus(t, "warning", "gitea-exclamation", "yellow") + doTestRepoCommitWithStatus(t, "warning", "octicon-x", "red") } func TestRepoCommitsWithStatusRunning(t *testing.T) { - doTestRepoCommitWithStatus(t, "running", "octicon-dot-fill", "yellow") + doTestRepoCommitWithStatus(t, "running", "octicon-dot-fill", "grey") } func TestRepoCommitsStatusParallel(t *testing.T) { From 5c7b4ff466963e3563166be0b07538b2b3cfb87a Mon Sep 17 00:00:00 2001 From: caicandong Date: Wed, 12 Jul 2023 15:47:26 +0800 Subject: [PATCH 07/11] fix remove test --- tests/integration/repo_commits_test.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/integration/repo_commits_test.go b/tests/integration/repo_commits_test.go index 4e3c50fa2f3b2..d24a2b5ff8896 100644 --- a/tests/integration/repo_commits_test.go +++ b/tests/integration/repo_commits_test.go @@ -125,14 +125,6 @@ func TestRepoCommitsWithStatusFailure(t *testing.T) { doTestRepoCommitWithStatus(t, "failure", "octicon-x", "red") } -func TestRepoCommitsWithStatusWarning(t *testing.T) { - doTestRepoCommitWithStatus(t, "warning", "octicon-x", "red") -} - -func TestRepoCommitsWithStatusRunning(t *testing.T) { - doTestRepoCommitWithStatus(t, "running", "octicon-dot-fill", "grey") -} - func TestRepoCommitsStatusParallel(t *testing.T) { defer tests.PrepareTestEnv(t)() From ee67badf7e26ff3386be1703510a138ce390b017 Mon Sep 17 00:00:00 2001 From: caicandong <50507092+CaiCandong@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:21:10 +0800 Subject: [PATCH 08/11] Deprecated: it will be removed after v1.22.0 Co-authored-by: Jason Song --- models/git/commit_status.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 1616c6f5c0f3c..fd2ac7120d83e 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -218,6 +218,7 @@ type CommitStatusOptions struct { SortType string } +// Deprecated: it will be removed after v1.22.0 // compatibleCommitStatus compatible with old version status // and convert old version status to new version status func compatibleCommitStatus(statuses []*CommitStatus) { From fdd2ff9fefa79f00873fa420a3deed086d791a8b Mon Sep 17 00:00:00 2001 From: Jason Song Date: Fri, 21 Jul 2023 11:20:54 +0800 Subject: [PATCH 09/11] Revert "Deprecated: it will be removed after v1.22.0" This reverts commit ee67badf7e26ff3386be1703510a138ce390b017. --- models/git/commit_status.go | 1 - 1 file changed, 1 deletion(-) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index fd2ac7120d83e..1616c6f5c0f3c 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -218,7 +218,6 @@ type CommitStatusOptions struct { SortType string } -// Deprecated: it will be removed after v1.22.0 // compatibleCommitStatus compatible with old version status // and convert old version status to new version status func compatibleCommitStatus(statuses []*CommitStatus) { From 514f1a1d0a8f3252a015d71d62c2ca8a692e7b0e Mon Sep 17 00:00:00 2001 From: Jason Song Date: Fri, 21 Jul 2023 11:21:15 +0800 Subject: [PATCH 10/11] Revert "fix compatible with old version status" This reverts commit 27beba30522e94f33694a2e8147a0c3d79b1ed6a. --- models/git/commit_status.go | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 1616c6f5c0f3c..c418cd23eb63c 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -218,18 +218,6 @@ type CommitStatusOptions struct { SortType string } -// compatibleCommitStatus compatible with old version status -// and convert old version status to new version status -func compatibleCommitStatus(statuses []*CommitStatus) { - for i := range statuses { - if statuses[i].State == "warning" { - statuses[i].State = api.CommitStatusFailure - } else if statuses[i].State == "running" { - statuses[i].State = api.CommitStatusPending - } - } -} - // 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 { @@ -251,16 +239,13 @@ func GetCommitStatuses(ctx context.Context, repo *repo_model.Repository, sha str findSession := listCommitStatusesStatement(ctx, repo, sha, opts) findSession = db.SetSessionPagination(findSession, opts) sortCommitStatusesSession(findSession, opts.SortType) - err = findSession.Find(&statuses) - // TODO: compatible with old version status,it will be removed in the future - compatibleCommitStatus(statuses) - return statuses, maxResults, err + 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": + case "pending", "success", "error", "failure", "warning": sess.And("state = ?", opts.State) } return sess @@ -309,10 +294,7 @@ func GetLatestCommitStatus(ctx context.Context, repoID int64, sha string, listOp if len(ids) == 0 { return statuses, count, nil } - err = db.GetEngine(ctx).In("id", ids).Find(&statuses) - // TODO: compatible with old version status,it will be removed in the future - compatibleCommitStatus(statuses) - return statuses, count, err + return statuses, count, db.GetEngine(ctx).In("id", ids).Find(&statuses) } // GetLatestCommitStatusForPairs returns all statuses with a unique context for a given list of repo-sha pairs @@ -351,8 +333,6 @@ func GetLatestCommitStatusForPairs(ctx context.Context, repoIDsToLatestCommitSHA statuses := make([]*CommitStatus, 0, len(ids)) if len(ids) > 0 { err = db.GetEngine(ctx).In("id", ids).Find(&statuses) - // TODO: compatible with old version status,it will be removed in the future - compatibleCommitStatus(statuses) if err != nil { return nil, err } @@ -400,8 +380,6 @@ func GetLatestCommitStatusForRepoCommitIDs(ctx context.Context, repoID int64, co statuses := make([]*CommitStatus, 0, len(ids)) if len(ids) > 0 { err = db.GetEngine(ctx).In("id", ids).Find(&statuses) - // TODO: compatible with old version status,it will be removed in the future - compatibleCommitStatus(statuses) if err != nil { return nil, err } From 66697172c25bdc4b9d24e11c27f080d58a8c8ff9 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Fri, 21 Jul 2023 11:31:16 +0800 Subject: [PATCH 11/11] fix: migrate status --- models/migrations/migrations.go | 2 ++ models/migrations/v1_21/v266.go | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 models/migrations/v1_21/v266.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 9596b99c123fa..6599cb9cda3eb 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -513,6 +513,8 @@ var migrations = []Migration{ NewMigration("Add branch table", v1_21.AddBranchTable), // v265 -> v266 NewMigration("Alter Actions Artifact table", v1_21.AlterActionArtifactTable), + // v266 -> v267 + NewMigration("Reduce commit status", v1_21.ReduceCommitStatus), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v1_21/v266.go b/models/migrations/v1_21/v266.go new file mode 100644 index 0000000000000..df85286c89b01 --- /dev/null +++ b/models/migrations/v1_21/v266.go @@ -0,0 +1,26 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package v1_21 //nolint + +import ( + "xorm.io/xorm" +) + +func ReduceCommitStatus(x *xorm.Engine) error { + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + if _, err := sess.Exec(`UPDATE commit_status SET state='pending' WHERE state='running'`); err != nil { + return err + } + if _, err := sess.Exec(`UPDATE commit_status SET state='failure' WHERE state='warning'`); err != nil { + return err + } + + return sess.Commit() +}