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.

Merge pull request 'Revert "avoid superfluous synchronized pull_request run when opening a PR"' (#2848) from earl-warren/forgejo:wip-revert-bad-race-fix into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/2848
Reviewed-by: oliverpool <oliverpool@noreply.codeberg.org>

+89 -331
+2 -10
models/issues/issue_index.go
··· 9 9 "code.gitea.io/gitea/models/db" 10 10 ) 11 11 12 - func GetMaxIssueIndexForRepo(ctx context.Context, repoID int64) (int64, error) { 13 - var max int64 14 - if _, err := db.GetEngine(ctx).Select("MAX(`index`)").Table("issue").Where("repo_id=?", repoID).Get(&max); err != nil { 15 - return 0, err 16 - } 17 - return max, nil 18 - } 19 - 20 12 // RecalculateIssueIndexForRepo create issue_index for repo if not exist and 21 13 // update it based on highest index of existing issues assigned to a repo 22 14 func RecalculateIssueIndexForRepo(ctx context.Context, repoID int64) error { ··· 26 18 } 27 19 defer committer.Close() 28 20 29 - max, err := GetMaxIssueIndexForRepo(ctx, repoID) 30 - if err != nil { 21 + var max int64 22 + if _, err = db.GetEngine(ctx).Select(" MAX(`index`)").Table("issue").Where("repo_id=?", repoID).Get(&max); err != nil { 31 23 return err 32 24 } 33 25
-38
models/issues/issue_index_test.go
··· 1 - // Copyright 2024 The Forgejo Authors 2 - // SPDX-License-Identifier: MIT 3 - 4 - package issues_test 5 - 6 - import ( 7 - "testing" 8 - 9 - "code.gitea.io/gitea/models/db" 10 - issues_model "code.gitea.io/gitea/models/issues" 11 - repo_model "code.gitea.io/gitea/models/repo" 12 - "code.gitea.io/gitea/models/unittest" 13 - 14 - "github.com/stretchr/testify/assert" 15 - ) 16 - 17 - func TestGetMaxIssueIndexForRepo(t *testing.T) { 18 - assert.NoError(t, unittest.PrepareTestDatabase()) 19 - 20 - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 21 - 22 - maxPR, err := issues_model.GetMaxIssueIndexForRepo(db.DefaultContext, repo.ID) 23 - assert.NoError(t, err) 24 - 25 - issue := testCreateIssue(t, repo.ID, repo.OwnerID, "title1", "content1", false) 26 - assert.Greater(t, issue.Index, maxPR) 27 - 28 - maxPR, err = issues_model.GetMaxIssueIndexForRepo(db.DefaultContext, repo.ID) 29 - assert.NoError(t, err) 30 - 31 - pull := testCreateIssue(t, repo.ID, repo.OwnerID, "title2", "content2", true) 32 - assert.Greater(t, pull.Index, maxPR) 33 - 34 - maxPR, err = issues_model.GetMaxIssueIndexForRepo(db.DefaultContext, repo.ID) 35 - assert.NoError(t, err) 36 - 37 - assert.Equal(t, maxPR, pull.Index) 38 - }
-8
models/issues/pull_list.go
··· 47 47 return sess, nil 48 48 } 49 49 50 - func GetUnmergedPullRequestsByHeadInfoMax(ctx context.Context, repoID, maxIndex int64, branch string) ([]*PullRequest, error) { 51 - prs := make([]*PullRequest, 0, 2) 52 - sess := db.GetEngine(ctx). 53 - Join("INNER", "issue", "issue.id = `pull_request`.issue_id"). 54 - Where("`pull_request`.head_repo_id = ? AND `pull_request`.head_branch = ? AND `pull_request`.has_merged = ? AND `issue`.is_closed = ? AND `pull_request`.flow = ? AND `issue`.`index` <= ?", repoID, branch, false, false, PullRequestFlowGithub, maxIndex) 55 - return prs, sess.Find(&prs) 56 - } 57 - 58 50 // GetUnmergedPullRequestsByHeadInfo returns all pull requests that are open and has not been merged 59 51 func GetUnmergedPullRequestsByHeadInfo(ctx context.Context, repoID int64, branch string) ([]*PullRequest, error) { 60 52 prs := make([]*PullRequest, 0, 2)
-86
models/issues/pull_test.go
··· 4 4 package issues_test 5 5 6 6 import ( 7 - "fmt" 8 7 "testing" 9 8 10 9 "code.gitea.io/gitea/models/db" ··· 154 153 for _, pr := range prs { 155 154 assert.Equal(t, int64(1), pr.HeadRepoID) 156 155 assert.Equal(t, "branch2", pr.HeadBranch) 157 - } 158 - } 159 - 160 - func TestGetUnmergedPullRequestsByHeadInfoMax(t *testing.T) { 161 - assert.NoError(t, unittest.PrepareTestDatabase()) 162 - 163 - repoID := int64(1) 164 - maxPR := int64(0) 165 - prs, err := issues_model.GetUnmergedPullRequestsByHeadInfoMax(db.DefaultContext, repoID, maxPR, "branch2") 166 - assert.NoError(t, err) 167 - assert.Len(t, prs, 0) 168 - maxPR, err = issues_model.GetMaxIssueIndexForRepo(db.DefaultContext, repoID) 169 - assert.NoError(t, err) 170 - prs, err = issues_model.GetUnmergedPullRequestsByHeadInfoMax(db.DefaultContext, repoID, maxPR, "branch2") 171 - assert.NoError(t, err) 172 - assert.Len(t, prs, 1) 173 - for _, pr := range prs { 174 - assert.Equal(t, int64(1), pr.HeadRepoID) 175 - assert.Equal(t, "branch2", pr.HeadBranch) 176 - } 177 - pr := prs[0] 178 - 179 - for _, testCase := range []struct { 180 - table string 181 - field string 182 - id int64 183 - match any 184 - nomatch any 185 - }{ 186 - { 187 - table: "issue", 188 - field: "is_closed", 189 - id: pr.IssueID, 190 - match: false, 191 - nomatch: true, 192 - }, 193 - { 194 - table: "pull_request", 195 - field: "flow", 196 - id: pr.ID, 197 - match: issues_model.PullRequestFlowGithub, 198 - nomatch: issues_model.PullRequestFlowAGit, 199 - }, 200 - { 201 - table: "pull_request", 202 - field: "head_repo_id", 203 - id: pr.ID, 204 - match: pr.HeadRepoID, 205 - nomatch: 0, 206 - }, 207 - { 208 - table: "pull_request", 209 - field: "head_branch", 210 - id: pr.ID, 211 - match: pr.HeadBranch, 212 - nomatch: "something else", 213 - }, 214 - { 215 - table: "pull_request", 216 - field: "has_merged", 217 - id: pr.ID, 218 - match: false, 219 - nomatch: true, 220 - }, 221 - } { 222 - t.Run(testCase.field, func(t *testing.T) { 223 - update := fmt.Sprintf("UPDATE `%s` SET `%s` = ? WHERE `id` = ?", testCase.table, testCase.field) 224 - 225 - // expect no match 226 - _, err = db.GetEngine(db.DefaultContext).Exec(update, testCase.nomatch, testCase.id) 227 - assert.NoError(t, err) 228 - prs, err = issues_model.GetUnmergedPullRequestsByHeadInfoMax(db.DefaultContext, repoID, maxPR, "branch2") 229 - assert.NoError(t, err) 230 - assert.Len(t, prs, 0) 231 - 232 - // expect one match 233 - _, err = db.GetEngine(db.DefaultContext).Exec(update, testCase.match, testCase.id) 234 - assert.NoError(t, err) 235 - prs, err = issues_model.GetUnmergedPullRequestsByHeadInfoMax(db.DefaultContext, repoID, maxPR, "branch2") 236 - assert.NoError(t, err) 237 - assert.Len(t, prs, 1) 238 - 239 - // identical to the known PR 240 - assert.Equal(t, pr.ID, prs[0].ID) 241 - }) 242 156 } 243 157 } 244 158
+1 -1
services/pull/merge.go
··· 187 187 } 188 188 189 189 defer func() { 190 - AddTestPullRequestTask(ctx, doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "") 190 + go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "") 191 191 }() 192 192 193 193 pr.MergedCommitID, err = doMergeAndPush(ctx, pr, doer, mergeStyle, expectedHeadCommitID, message)
+83 -99
services/pull/pull.go
··· 292 292 293 293 // AddTestPullRequestTask adds new test tasks by given head/base repository and head/base branch, 294 294 // and generate new patch for testing as needed. 295 - func AddTestPullRequestTask(ctx context.Context, doer *user_model.User, repoID int64, branch string, isSync bool, oldCommitID, newCommitID string) { 296 - // When TestPullRequest runs it must ignore any PR with an index > maxPR because they 297 - // would have been created after the goroutine started. They are in the future. 298 - // This guards the following race: 299 - // * commit A is pushed 300 - // * goroutine starts but does not run TestPullRequest yet 301 - // * a pull request with commit A as the head is created 302 - // * goroutine continues and runs TestPullRequest 303 - maxPR, err := issues_model.GetMaxIssueIndexForRepo(ctx, repoID) 304 - if err != nil { 305 - log.Error("AddTestPullRequestTask GetMaxIssueIndexForRepo(%d): %v", repoID, err) 306 - return 307 - } 308 - log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: only pull requests with index <= %d will be considered", repoID, branch, maxPR) 309 - go graceful.GetManager().RunWithShutdownContext(func(ctx context.Context) { 295 + func AddTestPullRequestTask(doer *user_model.User, repoID int64, branch string, isSync bool, oldCommitID, newCommitID string) { 296 + log.Trace("AddTestPullRequestTask [head_repo_id: %d, head_branch: %s]: finding pull requests", repoID, branch) 297 + graceful.GetManager().RunWithShutdownContext(func(ctx context.Context) { 310 298 // There is no sensible way to shut this down ":-(" 311 299 // If you don't let it run all the way then you will lose data 312 - // TODO: graceful: TestPullRequest needs to become a queue! 313 - 314 - TestPullRequest(ctx, doer, repoID, maxPR, branch, isSync, oldCommitID, newCommitID) 315 - }) 316 - } 300 + // TODO: graceful: AddTestPullRequestTask needs to become a queue! 317 301 318 - func TestPullRequest(ctx context.Context, doer *user_model.User, repoID, maxPR int64, branch string, isSync bool, oldCommitID, newCommitID string) { 319 - // GetUnmergedPullRequestsByHeadInfo() only return open and unmerged PR. 320 - prs, err := issues_model.GetUnmergedPullRequestsByHeadInfoMax(ctx, repoID, maxPR, branch) 321 - if err != nil { 322 - log.Error("Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) 323 - return 324 - } 302 + // GetUnmergedPullRequestsByHeadInfo() only return open and unmerged PR. 303 + prs, err := issues_model.GetUnmergedPullRequestsByHeadInfo(ctx, repoID, branch) 304 + if err != nil { 305 + log.Error("Find pull requests [head_repo_id: %d, head_branch: %s]: %v", repoID, branch, err) 306 + return 307 + } 325 308 326 - for _, pr := range prs { 327 - log.Trace("Updating PR[id=%d,index=%d]: composing new test task", pr.ID, pr.Index) 328 - if pr.Flow == issues_model.PullRequestFlowGithub { 329 - if err := PushToBaseRepo(ctx, pr); err != nil { 330 - log.Error("PushToBaseRepo: %v", err) 309 + for _, pr := range prs { 310 + log.Trace("Updating PR[%d]: composing new test task", pr.ID) 311 + if pr.Flow == issues_model.PullRequestFlowGithub { 312 + if err := PushToBaseRepo(ctx, pr); err != nil { 313 + log.Error("PushToBaseRepo: %v", err) 314 + continue 315 + } 316 + } else { 331 317 continue 332 318 } 333 - } else { 334 - continue 335 - } 336 319 337 - AddToTaskQueue(ctx, pr) 338 - comment, err := CreatePushPullComment(ctx, doer, pr, oldCommitID, newCommitID) 339 - if err == nil && comment != nil { 340 - notify_service.PullRequestPushCommits(ctx, doer, pr, comment) 320 + AddToTaskQueue(ctx, pr) 321 + comment, err := CreatePushPullComment(ctx, doer, pr, oldCommitID, newCommitID) 322 + if err == nil && comment != nil { 323 + notify_service.PullRequestPushCommits(ctx, doer, pr, comment) 324 + } 341 325 } 342 - } 343 326 344 - if isSync { 345 - requests := issues_model.PullRequestList(prs) 346 - if err = requests.LoadAttributes(ctx); err != nil { 347 - log.Error("PullRequestList.LoadAttributes: %v", err) 348 - } 349 - if invalidationErr := checkForInvalidation(ctx, requests, repoID, doer, branch); invalidationErr != nil { 350 - log.Error("checkForInvalidation: %v", invalidationErr) 351 - } 352 - if err == nil { 353 - for _, pr := range prs { 354 - objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName) 355 - if newCommitID != "" && newCommitID != objectFormat.EmptyObjectID().String() { 356 - changed, err := checkIfPRContentChanged(ctx, pr, oldCommitID, newCommitID) 357 - if err != nil { 358 - log.Error("checkIfPRContentChanged: %v", err) 359 - } 360 - if changed { 361 - // Mark old reviews as stale if diff to mergebase has changed 362 - if err := issues_model.MarkReviewsAsStale(ctx, pr.IssueID); err != nil { 363 - log.Error("MarkReviewsAsStale: %v", err) 364 - } 365 - 366 - // dismiss all approval reviews if protected branch rule item enabled. 367 - pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch) 327 + if isSync { 328 + requests := issues_model.PullRequestList(prs) 329 + if err = requests.LoadAttributes(ctx); err != nil { 330 + log.Error("PullRequestList.LoadAttributes: %v", err) 331 + } 332 + if invalidationErr := checkForInvalidation(ctx, requests, repoID, doer, branch); invalidationErr != nil { 333 + log.Error("checkForInvalidation: %v", invalidationErr) 334 + } 335 + if err == nil { 336 + for _, pr := range prs { 337 + objectFormat := git.ObjectFormatFromName(pr.BaseRepo.ObjectFormatName) 338 + if newCommitID != "" && newCommitID != objectFormat.EmptyObjectID().String() { 339 + changed, err := checkIfPRContentChanged(ctx, pr, oldCommitID, newCommitID) 368 340 if err != nil { 369 - log.Error("GetFirstMatchProtectedBranchRule: %v", err) 341 + log.Error("checkIfPRContentChanged: %v", err) 370 342 } 371 - if pb != nil && pb.DismissStaleApprovals { 372 - if err := DismissApprovalReviews(ctx, doer, pr); err != nil { 373 - log.Error("DismissApprovalReviews: %v", err) 343 + if changed { 344 + // Mark old reviews as stale if diff to mergebase has changed 345 + if err := issues_model.MarkReviewsAsStale(ctx, pr.IssueID); err != nil { 346 + log.Error("MarkReviewsAsStale: %v", err) 347 + } 348 + 349 + // dismiss all approval reviews if protected branch rule item enabled. 350 + pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch) 351 + if err != nil { 352 + log.Error("GetFirstMatchProtectedBranchRule: %v", err) 353 + } 354 + if pb != nil && pb.DismissStaleApprovals { 355 + if err := DismissApprovalReviews(ctx, doer, pr); err != nil { 356 + log.Error("DismissApprovalReviews: %v", err) 357 + } 374 358 } 375 359 } 376 - } 377 - if err := issues_model.MarkReviewsAsNotStale(ctx, pr.IssueID, newCommitID); err != nil { 378 - log.Error("MarkReviewsAsNotStale: %v", err) 379 - } 380 - divergence, err := GetDiverging(ctx, pr) 381 - if err != nil { 382 - log.Error("GetDiverging: %v", err) 383 - } else { 384 - err = pr.UpdateCommitDivergence(ctx, divergence.Ahead, divergence.Behind) 360 + if err := issues_model.MarkReviewsAsNotStale(ctx, pr.IssueID, newCommitID); err != nil { 361 + log.Error("MarkReviewsAsNotStale: %v", err) 362 + } 363 + divergence, err := GetDiverging(ctx, pr) 385 364 if err != nil { 386 - log.Error("UpdateCommitDivergence: %v", err) 365 + log.Error("GetDiverging: %v", err) 366 + } else { 367 + err = pr.UpdateCommitDivergence(ctx, divergence.Ahead, divergence.Behind) 368 + if err != nil { 369 + log.Error("UpdateCommitDivergence: %v", err) 370 + } 387 371 } 388 372 } 389 - } 390 373 391 - notify_service.PullRequestSynchronized(ctx, doer, pr) 374 + notify_service.PullRequestSynchronized(ctx, doer, pr) 375 + } 392 376 } 393 377 } 394 - } 395 378 396 - log.Trace("TestPullRequest [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch) 397 - prs, err = issues_model.GetUnmergedPullRequestsByBaseInfo(ctx, repoID, branch) 398 - if err != nil { 399 - log.Error("Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) 400 - return 401 - } 402 - for _, pr := range prs { 403 - divergence, err := GetDiverging(ctx, pr) 379 + log.Trace("AddTestPullRequestTask [base_repo_id: %d, base_branch: %s]: finding pull requests", repoID, branch) 380 + prs, err = issues_model.GetUnmergedPullRequestsByBaseInfo(ctx, repoID, branch) 404 381 if err != nil { 405 - if git_model.IsErrBranchNotExist(err) && !git.IsBranchExist(ctx, pr.HeadRepo.RepoPath(), pr.HeadBranch) { 406 - log.Warn("Cannot test PR %s/%d: head_branch %s no longer exists", pr.BaseRepo.Name, pr.IssueID, pr.HeadBranch) 407 - } else { 408 - log.Error("GetDiverging: %v", err) 409 - } 410 - } else { 411 - err = pr.UpdateCommitDivergence(ctx, divergence.Ahead, divergence.Behind) 382 + log.Error("Find pull requests [base_repo_id: %d, base_branch: %s]: %v", repoID, branch, err) 383 + return 384 + } 385 + for _, pr := range prs { 386 + divergence, err := GetDiverging(ctx, pr) 412 387 if err != nil { 413 - log.Error("UpdateCommitDivergence: %v", err) 388 + if git_model.IsErrBranchNotExist(err) && !git.IsBranchExist(ctx, pr.HeadRepo.RepoPath(), pr.HeadBranch) { 389 + log.Warn("Cannot test PR %s/%d: head_branch %s no longer exists", pr.BaseRepo.Name, pr.IssueID, pr.HeadBranch) 390 + } else { 391 + log.Error("GetDiverging: %v", err) 392 + } 393 + } else { 394 + err = pr.UpdateCommitDivergence(ctx, divergence.Ahead, divergence.Behind) 395 + if err != nil { 396 + log.Error("UpdateCommitDivergence: %v", err) 397 + } 414 398 } 399 + AddToTaskQueue(ctx, pr) 415 400 } 416 - AddToTaskQueue(ctx, pr) 417 - } 401 + }) 418 402 } 419 403 420 404 // checkIfPRContentChanged checks if diff to target branch has changed by push
+2 -2
services/pull/update.go
··· 36 36 37 37 if rebase { 38 38 defer func() { 39 - AddTestPullRequestTask(ctx, doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "") 39 + go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "") 40 40 }() 41 41 42 42 return updateHeadByRebaseOnToBase(ctx, pr, doer, message) ··· 75 75 _, err = doMergeAndPush(ctx, reversePR, doer, repo_model.MergeStyleMerge, "", message) 76 76 77 77 defer func() { 78 - AddTestPullRequestTask(ctx, doer, reversePR.HeadRepo.ID, reversePR.HeadBranch, false, "", "") 78 + go AddTestPullRequestTask(doer, reversePR.HeadRepo.ID, reversePR.HeadBranch, false, "", "") 79 79 }() 80 80 81 81 return err
+1 -1
services/repository/push.go
··· 166 166 branch := opts.RefFullName.BranchName() 167 167 if !opts.IsDelRef() { 168 168 log.Trace("TriggerTask '%s/%s' by %s", repo.Name, branch, pusher.Name) 169 - pull_service.AddTestPullRequestTask(ctx, pusher, repo.ID, branch, true, opts.OldCommitID, opts.NewCommitID) 169 + go pull_service.AddTestPullRequestTask(pusher, repo.ID, branch, true, opts.OldCommitID, opts.NewCommitID) 170 170 171 171 newCommit, err := gitRepo.GetCommit(opts.NewCommitID) 172 172 if err != nil {
-86
tests/integration/pull_request_task_test.go
··· 1 - // Copyright 2024 The Forgejo Authors 2 - // SPDX-License-Identifier: MIT 3 - 4 - package integration 5 - 6 - import ( 7 - "context" 8 - "testing" 9 - "time" 10 - 11 - issues_model "code.gitea.io/gitea/models/issues" 12 - repo_model "code.gitea.io/gitea/models/repo" 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/log" 17 - repo_module "code.gitea.io/gitea/modules/repository" 18 - "code.gitea.io/gitea/modules/test" 19 - pull_service "code.gitea.io/gitea/services/pull" 20 - repo_service "code.gitea.io/gitea/services/repository" 21 - "code.gitea.io/gitea/tests" 22 - 23 - "github.com/stretchr/testify/assert" 24 - "github.com/stretchr/testify/require" 25 - ) 26 - 27 - func TestPullRequestSynchronized(t *testing.T) { 28 - defer tests.PrepareTestEnv(t)() 29 - 30 - // unmerged pull request of user2/repo1 from branch2 to master 31 - pull := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) 32 - // tip of tests/gitea-repositories-meta/user2/repo1 branch2 33 - pull.HeadCommitID = "985f0301dba5e7b34be866819cd15ad3d8f508ee" 34 - 35 - require.Equal(t, pull.HeadRepoID, pull.BaseRepoID) 36 - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: pull.HeadRepoID}) 37 - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 38 - 39 - t.Run("AddTestPullRequestTask", func(t *testing.T) { 40 - logChecker, cleanup := test.NewLogChecker(log.DEFAULT, log.TRACE) 41 - logChecker.Filter("Updating PR").StopMark("TestPullRequest ") 42 - defer cleanup() 43 - 44 - opt := &repo_module.PushUpdateOptions{ 45 - PusherID: owner.ID, 46 - PusherName: owner.Name, 47 - RepoUserName: owner.Name, 48 - RepoName: repo.Name, 49 - RefFullName: git.RefName("refs/heads/branch2"), 50 - OldCommitID: pull.HeadCommitID, 51 - NewCommitID: pull.HeadCommitID, 52 - } 53 - require.NoError(t, repo_service.PushUpdate(opt)) 54 - logFiltered, logStopped := logChecker.Check(5 * time.Second) 55 - assert.True(t, logStopped) 56 - assert.True(t, logFiltered[0]) 57 - }) 58 - 59 - for _, testCase := range []struct { 60 - name string 61 - maxPR int64 62 - expected bool 63 - }{ 64 - { 65 - name: "TestPullRequest process PR", 66 - maxPR: pull.Index, 67 - expected: true, 68 - }, 69 - { 70 - name: "TestPullRequest skip PR", 71 - maxPR: pull.Index - 1, 72 - expected: false, 73 - }, 74 - } { 75 - t.Run(testCase.name, func(t *testing.T) { 76 - logChecker, cleanup := test.NewLogChecker(log.DEFAULT, log.TRACE) 77 - logChecker.Filter("Updating PR").StopMark("TestPullRequest ") 78 - defer cleanup() 79 - 80 - pull_service.TestPullRequest(context.Background(), owner, repo.ID, testCase.maxPR, "branch2", true, pull.HeadCommitID, pull.HeadCommitID) 81 - logFiltered, logStopped := logChecker.Check(5 * time.Second) 82 - assert.True(t, logStopped) 83 - assert.Equal(t, testCase.expected, logFiltered[0]) 84 - }) 85 - } 86 - }