loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix duplicate status check contexts (#30660)

Caused by #30076.

There may be some duplicate status check contexts when setting status
checks for a branch protection rule. The duplicate contexts should be
removed.

Before:
<img
src="https://github.com/go-gitea/gitea/assets/15528715/97f4de2d-4868-47a3-8a99-5a180f9ac0a3"
width="600px" />

After:
<img
src="https://github.com/go-gitea/gitea/assets/15528715/ff7289c5-9793-4090-ba31-e8cb3c85f8a3"
width="600px" />

(cherry picked from commit 7ad50313284db7eec565ad1750108de1444c5a84)

authored by

Zettat123 and committed by
Earl Warren
60e58255 c504461b

+61 -25
+5 -25
models/git/commit_status.go
··· 362 362 363 363 // FindRepoRecentCommitStatusContexts returns repository's recent commit status contexts 364 364 func FindRepoRecentCommitStatusContexts(ctx context.Context, repoID int64, before time.Duration) ([]string, error) { 365 - type result struct { 366 - Index int64 367 - SHA string 368 - } 369 - getBase := func() *xorm.Session { 370 - return db.GetEngine(ctx).Table(&CommitStatus{}).Where("repo_id = ?", repoID) 371 - } 372 - 373 365 start := timeutil.TimeStampNow().AddDuration(-before) 374 - results := make([]result, 0, 10) 375 366 376 - sess := getBase().And("updated_unix >= ?", start). 377 - Select("max( `index` ) as `index`, sha"). 378 - GroupBy("context_hash, sha").OrderBy("max( `index` ) desc") 379 - 380 - err := sess.Find(&results) 381 - if err != nil { 367 + var contexts []string 368 + if err := db.GetEngine(ctx).Table("commit_status"). 369 + Where("repo_id = ?", repoID).And("updated_unix >= ?", start). 370 + Cols("context").Distinct().Find(&contexts); err != nil { 382 371 return nil, err 383 372 } 384 373 385 - contexts := make([]string, 0, len(results)) 386 - if len(results) == 0 { 387 - return contexts, nil 388 - } 389 - 390 - conds := make([]builder.Cond, 0, len(results)) 391 - for _, result := range results { 392 - conds = append(conds, builder.Eq{"`index`": result.Index, "sha": result.SHA}) 393 - } 394 - return contexts, getBase().And(builder.Or(conds...)).Select("context").Find(&contexts) 374 + return contexts, nil 395 375 } 396 376 397 377 // NewCommitStatusOptions holds options for creating a CommitStatus
+56
models/git/commit_status_test.go
··· 5 5 6 6 import ( 7 7 "testing" 8 + "time" 8 9 9 10 "code.gitea.io/gitea/models/db" 10 11 git_model "code.gitea.io/gitea/models/git" 11 12 repo_model "code.gitea.io/gitea/models/repo" 12 13 "code.gitea.io/gitea/models/unittest" 14 + user_model "code.gitea.io/gitea/models/user" 15 + "code.gitea.io/gitea/modules/git" 16 + "code.gitea.io/gitea/modules/gitrepo" 13 17 "code.gitea.io/gitea/modules/structs" 14 18 15 19 "github.com/stretchr/testify/assert" ··· 183 187 assert.Equal(t, kase.expected, git_model.CalcCommitStatus(kase.statuses)) 184 188 } 185 189 } 190 + 191 + func TestFindRepoRecentCommitStatusContexts(t *testing.T) { 192 + assert.NoError(t, unittest.PrepareTestDatabase()) 193 + 194 + repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) 195 + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 196 + gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo2) 197 + assert.NoError(t, err) 198 + defer gitRepo.Close() 199 + 200 + commit, err := gitRepo.GetBranchCommit(repo2.DefaultBranch) 201 + assert.NoError(t, err) 202 + 203 + defer func() { 204 + _, err := db.DeleteByBean(db.DefaultContext, &git_model.CommitStatus{ 205 + RepoID: repo2.ID, 206 + CreatorID: user2.ID, 207 + SHA: commit.ID.String(), 208 + }) 209 + assert.NoError(t, err) 210 + }() 211 + 212 + err = git_model.NewCommitStatus(db.DefaultContext, git_model.NewCommitStatusOptions{ 213 + Repo: repo2, 214 + Creator: user2, 215 + SHA: commit.ID, 216 + CommitStatus: &git_model.CommitStatus{ 217 + State: structs.CommitStatusFailure, 218 + TargetURL: "https://example.com/tests/", 219 + Context: "compliance/lint-backend", 220 + }, 221 + }) 222 + assert.NoError(t, err) 223 + 224 + err = git_model.NewCommitStatus(db.DefaultContext, git_model.NewCommitStatusOptions{ 225 + Repo: repo2, 226 + Creator: user2, 227 + SHA: commit.ID, 228 + CommitStatus: &git_model.CommitStatus{ 229 + State: structs.CommitStatusSuccess, 230 + TargetURL: "https://example.com/tests/", 231 + Context: "compliance/lint-backend", 232 + }, 233 + }) 234 + assert.NoError(t, err) 235 + 236 + contexts, err := git_model.FindRepoRecentCommitStatusContexts(db.DefaultContext, repo2.ID, time.Hour) 237 + assert.NoError(t, err) 238 + if assert.Len(t, contexts, 1) { 239 + assert.Equal(t, "compliance/lint-backend", contexts[0]) 240 + } 241 + }