From 5e20f4d27a663e29e7d5a0b4d848be3df4eabb0d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 7 Oct 2025 14:59:07 -0700 Subject: [PATCH 1/2] Remove ctx in the git repository struct --- cmd/admin.go | 2 +- models/activities/repo_activity.go | 4 +- models/git/commit_status_test.go | 4 +- models/migrations/v1_14/v156.go | 6 +- models/migrations/v1_9/v82.go | 4 +- models/renderhelper/commit_checker.go | 2 +- modules/actions/workflows.go | 46 ++--- modules/actions/workflows_test.go | 2 +- modules/cache/cache.go | 5 +- modules/cache/cache_test.go | 11 +- modules/fileicon/entry.go | 10 +- modules/git/attribute/batch.go | 22 ++- modules/git/attribute/batch_test.go | 16 +- modules/git/attribute/checker.go | 6 +- modules/git/attribute/checker_test.go | 4 +- modules/git/blame.go | 8 +- modules/git/blame_sha256_test.go | 10 +- modules/git/blame_test.go | 10 +- modules/git/blob.go | 21 +-- modules/git/blob_nogogit.go | 9 +- modules/git/blob_test.go | 8 +- modules/git/commit.go | 74 ++++---- modules/git/commit_info.go | 6 +- modules/git/commit_info_nogogit.go | 10 +- modules/git/commit_info_test.go | 22 +-- modules/git/commit_sha256_test.go | 14 +- modules/git/commit_submodule.go | 12 +- modules/git/commit_test.go | 20 +-- modules/git/diff.go | 20 +-- modules/git/grep_test.go | 2 +- .../languagestats/language_stats_nogogit.go | 25 +-- .../git/languagestats/language_stats_test.go | 4 +- modules/git/last_commit_cache.go | 11 +- modules/git/last_commit_cache_nogogit.go | 4 +- modules/git/log_name_status.go | 4 +- modules/git/notes_nogogit.go | 8 +- modules/git/notes_test.go | 6 +- modules/git/pipeline/lfs_nogogit.go | 9 +- modules/git/ref.go | 5 +- modules/git/repo.go | 14 +- modules/git/repo_base_nogogit.go | 4 +- modules/git/repo_blob_test.go | 8 +- modules/git/repo_branch.go | 6 +- modules/git/repo_branch_nogogit.go | 24 +-- modules/git/repo_branch_test.go | 40 ++--- modules/git/repo_commit.go | 165 +++++++++--------- modules/git/repo_commit_nogogit.go | 25 +-- modules/git/repo_commit_test.go | 34 ++-- modules/git/repo_compare.go | 31 ++-- modules/git/repo_compare_test.go | 18 +- modules/git/repo_gpg.go | 13 +- modules/git/repo_index.go | 42 ++--- modules/git/repo_object.go | 13 +- modules/git/repo_ref.go | 14 +- modules/git/repo_ref_nogogit.go | 5 +- modules/git/repo_ref_test.go | 8 +- modules/git/repo_stats.go | 6 +- modules/git/repo_stats_test.go | 4 +- modules/git/repo_tag.go | 39 +++-- modules/git/repo_tag_nogogit.go | 19 +- modules/git/repo_tag_test.go | 38 ++-- modules/git/repo_test.go | 4 +- modules/git/repo_tree.go | 5 +- modules/git/repo_tree_nogogit.go | 15 +- modules/git/tree.go | 17 +- modules/git/tree_blob.go | 6 +- modules/git/tree_blob_nogogit.go | 7 +- modules/git/tree_entry.go | 25 +-- modules/git/tree_entry_common_test.go | 24 +-- modules/git/tree_entry_nogogit.go | 10 +- modules/git/tree_nogogit.go | 19 +- modules/git/tree_test.go | 12 +- modules/gitrepo/branch.go | 8 +- modules/gitrepo/gitrepo.go | 8 +- modules/indexer/code/git.go | 8 +- modules/indexer/code/gitgrep/gitgrep.go | 2 +- modules/indexer/stats/db.go | 6 +- modules/issue/template/unmarshal.go | 23 +-- modules/repository/branch.go | 8 +- modules/repository/repo.go | 4 +- routers/api/v1/repo/blob.go | 2 +- routers/api/v1/repo/branch.go | 12 +- routers/api/v1/repo/commits.go | 13 +- routers/api/v1/repo/download.go | 2 +- routers/api/v1/repo/file.go | 14 +- routers/api/v1/repo/notes.go | 2 +- routers/api/v1/repo/pull.go | 10 +- routers/api/v1/repo/pull_review.go | 4 +- routers/api/v1/repo/release.go | 2 +- routers/api/v1/repo/repo.go | 6 +- routers/api/v1/repo/tag.go | 12 +- routers/api/v1/repo/wiki.go | 28 +-- routers/api/v1/utils/git.go | 4 +- routers/common/serve.go | 4 +- routers/private/hook_post_receive.go | 2 +- routers/private/hook_pre_receive.go | 6 +- routers/private/hook_verification.go | 16 +- routers/private/hook_verification_test.go | 6 +- routers/web/feed/branch.go | 2 +- routers/web/feed/file.go | 1 + routers/web/org/home.go | 2 +- routers/web/repo/actions/actions.go | 10 +- routers/web/repo/actions/view.go | 4 +- routers/web/repo/blame.go | 8 +- routers/web/repo/commit.go | 20 ++- routers/web/repo/compare.go | 36 ++-- routers/web/repo/download.go | 6 +- routers/web/repo/editor.go | 4 +- routers/web/repo/editor_cherry_pick.go | 4 +- routers/web/repo/editor_preview.go | 2 +- routers/web/repo/editor_test.go | 6 +- routers/web/repo/editor_util.go | 10 +- routers/web/repo/issue_list.go | 2 +- routers/web/repo/issue_new.go | 22 +-- routers/web/repo/issue_view.go | 2 +- routers/web/repo/middlewares.go | 2 +- routers/web/repo/milestone.go | 2 +- routers/web/repo/pull.go | 32 ++-- routers/web/repo/pull_review.go | 4 +- routers/web/repo/release.go | 13 +- routers/web/repo/release_test.go | 2 +- routers/web/repo/render.go | 4 +- routers/web/repo/repo.go | 8 +- routers/web/repo/setting/lfs.go | 10 +- routers/web/repo/treelist.go | 4 +- routers/web/repo/view.go | 14 +- routers/web/repo/view_file.go | 10 +- routers/web/repo/view_home.go | 18 +- routers/web/repo/view_readme.go | 8 +- routers/web/repo/wiki.go | 36 ++-- routers/web/repo/wiki_test.go | 8 +- routers/web/shared/user/header.go | 4 +- routers/web/user/profile.go | 2 +- services/actions/notifier.go | 2 +- services/actions/notifier_helper.go | 20 +-- services/actions/workflow.go | 10 +- services/agit/agit.go | 4 +- services/asymkey/commit.go | 2 +- services/asymkey/sign.go | 26 +-- services/automerge/automerge.go | 10 +- services/automergequeue/automergequeue.go | 4 +- services/context/api.go | 6 +- services/context/repo.go | 52 +++--- services/contexttest/context_tests.go | 6 +- services/convert/convert.go | 8 +- services/convert/git_commit.go | 2 +- services/convert/pull.go | 22 +-- services/gitdiff/git_diff_tree.go | 12 +- services/gitdiff/git_diff_tree_test.go | 4 +- services/gitdiff/gitdiff.go | 36 ++-- services/gitdiff/gitdiff_test.go | 2 +- services/gitdiff/submodule.go | 4 +- services/issue/comments.go | 2 +- services/issue/pull.go | 12 +- services/issue/template.go | 35 ++-- services/markup/renderhelper_codepreview.go | 10 +- services/migrations/dump.go | 10 +- services/migrations/gitea_uploader.go | 22 +-- services/migrations/gitea_uploader_test.go | 10 +- services/mirror/mirror_pull.go | 16 +- services/mirror/mirror_push.go | 2 +- services/packages/cargo/index.go | 2 +- services/pull/check.go | 4 +- services/pull/comment.go | 6 +- services/pull/commit_status.go | 4 +- services/pull/compare.go | 4 +- services/pull/merge.go | 10 +- services/pull/merge_rebase.go | 2 +- services/pull/merge_squash.go | 4 +- services/pull/patch.go | 32 ++-- services/pull/pull.go | 32 ++-- services/pull/pull_test.go | 4 +- services/pull/review.go | 8 +- services/release/release.go | 28 +-- services/release/release_test.go | 26 +-- services/repository/adopt.go | 2 +- services/repository/archiver/archiver.go | 4 +- services/repository/archiver/archiver_test.go | 24 +-- services/repository/branch.go | 16 +- services/repository/cache.go | 4 +- .../repository/commitstatus/commitstatus.go | 4 +- services/repository/contributors_graph.go | 8 +- services/repository/files/cherry_pick.go | 10 +- services/repository/files/content.go | 42 ++--- services/repository/files/content_test.go | 2 +- services/repository/files/file.go | 6 +- services/repository/files/patch.go | 8 +- services/repository/files/temp_repo.go | 14 +- services/repository/files/tree.go | 20 +-- services/repository/files/update.go | 26 +-- services/repository/fork.go | 2 +- services/repository/gitgraph/graph.go | 4 +- services/repository/gitgraph/graph_models.go | 2 +- services/repository/gitgraph/graph_test.go | 4 +- services/repository/hooks.go | 4 +- services/repository/lfs.go | 4 +- services/repository/license.go | 8 +- services/repository/migrate.go | 4 +- services/repository/push.go | 24 +-- services/webhook/notifier.go | 2 +- services/wiki/wiki.go | 38 ++-- services/wiki/wiki_test.go | 28 +-- tests/integration/actions_trigger_test.go | 22 +-- tests/integration/api_packages_cargo_test.go | 8 +- tests/integration/api_releases_test.go | 14 +- .../integration/api_repo_file_create_test.go | 12 +- .../integration/api_repo_file_update_test.go | 6 +- .../integration/api_repo_files_change_test.go | 8 +- tests/integration/api_repo_files_get_test.go | 4 +- .../api_repo_get_contents_list_test.go | 16 +- .../integration/api_repo_get_contents_test.go | 16 +- tests/integration/api_repo_git_tags_test.go | 10 +- tests/integration/editor_test.go | 8 +- tests/integration/git_general_test.go | 6 +- tests/integration/git_misc_test.go | 18 +- tests/integration/git_push_test.go | 4 +- tests/integration/mirror_pull_test.go | 4 +- tests/integration/mirror_push_test.go | 8 +- tests/integration/pull_merge_test.go | 32 ++-- tests/integration/repo_webhook_test.go | 40 ++--- tests/integration/repofiles_change_test.go | 34 ++-- 221 files changed, 1431 insertions(+), 1384 deletions(-) diff --git a/cmd/admin.go b/cmd/admin.go index a01274b90e932..0d9589ebf5a91 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -122,7 +122,7 @@ func runRepoSyncReleases(ctx context.Context, _ *cli.Command) error { log.Trace("Processing next %d repos of %d", len(repos), count) for _, repo := range repos { log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RelativePath()) - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Warn("OpenRepository: %v", err) continue diff --git a/models/activities/repo_activity.go b/models/activities/repo_activity.go index aeaa452c9e905..47824f3595fb8 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -74,7 +74,7 @@ func GetActivityStats(ctx context.Context, repo *repo_model.Repository, timeFrom } defer closer.Close() - code, err := gitRepo.GetCodeActivityStats(timeFrom, repo.DefaultBranch) + code, err := gitRepo.GetCodeActivityStats(ctx, timeFrom, repo.DefaultBranch) if err != nil { return nil, fmt.Errorf("FillFromGit: %w", err) } @@ -91,7 +91,7 @@ func GetActivityStatsTopAuthors(ctx context.Context, repo *repo_model.Repository } defer closer.Close() - code, err := gitRepo.GetCodeActivityStats(timeFrom, "") + code, err := gitRepo.GetCodeActivityStats(ctx, timeFrom, "") if err != nil { return nil, fmt.Errorf("FillFromGit: %w", err) } diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index d1b9dfc3bf9f5..3795f459e9d46 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -186,11 +186,11 @@ func TestFindRepoRecentCommitStatusContexts(t *testing.T) { repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo2) + gitRepo, err := gitrepo.OpenRepository(repo2) assert.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(repo2.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(t.Context(), repo2.DefaultBranch) assert.NoError(t, err) defer func() { diff --git a/models/migrations/v1_14/v156.go b/models/migrations/v1_14/v156.go index 593d3f9c70ca3..a13f888dcd4ae 100644 --- a/models/migrations/v1_14/v156.go +++ b/models/migrations/v1_14/v156.go @@ -109,14 +109,14 @@ func FixPublisherIDforTagReleases(ctx context.Context, x *xorm.Engine) error { return err } } - gitRepo, err = git.OpenRepository(ctx, repoPath(repo.OwnerName, repo.Name)) + gitRepo, err = git.OpenRepository(repoPath(repo.OwnerName, repo.Name)) if err != nil { log.Error("Error whilst opening git repo for [%d]%s/%s. Error: %v", repo.ID, repo.OwnerName, repo.Name, err) return err } } - commit, err := gitRepo.GetTagCommit(release.TagName) + commit, err := gitRepo.GetTagCommit(ctx, release.TagName) if err != nil { if git.IsErrNotExist(err) { log.Warn("Unable to find commit %s for Tag: %s in [%d]%s/%s. Cannot update publisher ID.", err.(git.ErrNotExist).ID, release.TagName, repo.ID, repo.OwnerName, repo.Name) @@ -128,7 +128,7 @@ func FixPublisherIDforTagReleases(ctx context.Context, x *xorm.Engine) error { if commit.Author.Email == "" { log.Warn("Tag: %s in Repo[%d]%s/%s does not have a tagger.", release.TagName, repo.ID, repo.OwnerName, repo.Name) - commit, err = gitRepo.GetCommit(commit.ID.String()) + commit, err = gitRepo.GetCommit(ctx, commit.ID.String()) if err != nil { if git.IsErrNotExist(err) { log.Warn("Unable to find commit %s for Tag: %s in [%d]%s/%s. Cannot update publisher ID.", err.(git.ErrNotExist).ID, release.TagName, repo.ID, repo.OwnerName, repo.Name) diff --git a/models/migrations/v1_9/v82.go b/models/migrations/v1_9/v82.go index f0307bf07aa33..42e0badb04ab9 100644 --- a/models/migrations/v1_9/v82.go +++ b/models/migrations/v1_9/v82.go @@ -99,7 +99,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x *xorm.Engine) error { userCache[repo.OwnerID] = user } - gitRepo, err = git.OpenRepository(ctx, RepoPath(user.Name, repo.Name)) + gitRepo, err = git.OpenRepository(RepoPath(user.Name, repo.Name)) if err != nil { return err } @@ -107,7 +107,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x *xorm.Engine) error { gitRepoCache[release.RepoID] = gitRepo } - release.Sha1, err = gitRepo.GetTagCommitID(release.TagName) + release.Sha1, err = gitRepo.GetTagCommitID(ctx, release.TagName) if err != nil && !git.IsErrNotExist(err) { return err } diff --git a/models/renderhelper/commit_checker.go b/models/renderhelper/commit_checker.go index 407e45fb543ac..8ee8dd84df0aa 100644 --- a/models/renderhelper/commit_checker.go +++ b/models/renderhelper/commit_checker.go @@ -47,7 +47,7 @@ func (c *commitChecker) IsCommitIDExisting(commitID string) bool { c.gitRepo, c.gitRepoCloser = r, closer } - exist = c.gitRepo.IsReferenceExist(commitID) // Don't use IsObjectExist since it doesn't support short hashes with gogit edition. + exist = c.gitRepo.IsReferenceExist(c.ctx, commitID) // Don't use IsObjectExist since it doesn't support short hashes with gogit edition. c.commitCache[commitID] = exist return exist } diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index 69f71bf6519df..4be867adb94f6 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -5,6 +5,7 @@ package actions import ( "bytes" + "context" "io" "slices" "strings" @@ -44,12 +45,12 @@ func IsWorkflow(path string) bool { return strings.HasPrefix(path, ".gitea/workflows") || strings.HasPrefix(path, ".github/workflows") } -func ListWorkflows(commit *git.Commit) (string, git.Entries, error) { +func ListWorkflows(ctx context.Context, commit *git.Commit) (string, git.Entries, error) { rpath := ".gitea/workflows" - tree, err := commit.SubTree(rpath) + tree, err := commit.SubTree(ctx, rpath) if _, ok := err.(git.ErrNotExist); ok { rpath = ".github/workflows" - tree, err = commit.SubTree(rpath) + tree, err = commit.SubTree(ctx, rpath) } if _, ok := err.(git.ErrNotExist); ok { return "", nil, nil @@ -58,7 +59,7 @@ func ListWorkflows(commit *git.Commit) (string, git.Entries, error) { return "", nil, err } - entries, err := tree.ListEntriesRecursiveFast() + entries, err := tree.ListEntriesRecursiveFast(ctx) if err != nil { return "", nil, err } @@ -72,8 +73,8 @@ func ListWorkflows(commit *git.Commit) (string, git.Entries, error) { return rpath, ret, nil } -func GetContentFromEntry(entry *git.TreeEntry) ([]byte, error) { - f, err := entry.Blob().DataAsync() +func GetContentFromEntry(ctx context.Context, entry *git.TreeEntry) ([]byte, error) { + f, err := entry.Blob().DataAsync(ctx) if err != nil { return nil, err } @@ -99,13 +100,14 @@ func GetEventsFromContent(content []byte) ([]*jobparser.Event, error) { } func DetectWorkflows( + ctx context.Context, gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, detectSchedule bool, ) ([]*DetectedWorkflow, []*DetectedWorkflow, error) { - _, entries, err := ListWorkflows(commit) + _, entries, err := ListWorkflows(ctx, commit) if err != nil { return nil, nil, err } @@ -113,7 +115,7 @@ func DetectWorkflows( workflows := make([]*DetectedWorkflow, 0, len(entries)) schedules := make([]*DetectedWorkflow, 0, len(entries)) for _, entry := range entries { - content, err := GetContentFromEntry(entry) + content, err := GetContentFromEntry(ctx, entry) if err != nil { return nil, nil, err } @@ -135,7 +137,7 @@ func DetectWorkflows( } schedules = append(schedules, dwf) } - } else if detectMatched(gitRepo, commit, triggedEvent, payload, evt) { + } else if detectMatched(ctx, gitRepo, commit, triggedEvent, payload, evt) { dwf := &DetectedWorkflow{ EntryName: entry.Name(), TriggerEvent: evt, @@ -149,15 +151,15 @@ func DetectWorkflows( return workflows, schedules, nil } -func DetectScheduledWorkflows(gitRepo *git.Repository, commit *git.Commit) ([]*DetectedWorkflow, error) { - _, entries, err := ListWorkflows(commit) +func DetectScheduledWorkflows(ctx context.Context, gitRepo *git.Repository, commit *git.Commit) ([]*DetectedWorkflow, error) { + _, entries, err := ListWorkflows(ctx, commit) if err != nil { return nil, err } wfs := make([]*DetectedWorkflow, 0, len(entries)) for _, entry := range entries { - content, err := GetContentFromEntry(entry) + content, err := GetContentFromEntry(ctx, entry) if err != nil { return nil, err } @@ -184,7 +186,7 @@ func DetectScheduledWorkflows(gitRepo *git.Repository, commit *git.Commit) ([]*D return wfs, nil } -func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool { +func detectMatched(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) bool { if !canGithubEventMatch(evt.Name, triggedEvent) { return false } @@ -204,7 +206,7 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web case // push webhook_module.HookEventPush: - return matchPushEvent(commit, payload.(*api.PushPayload), evt) + return matchPushEvent(ctx, commit, payload.(*api.PushPayload), evt) case // issues webhook_module.HookEventIssues, @@ -227,7 +229,7 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web webhook_module.HookEventPullRequestLabel, webhook_module.HookEventPullRequestReviewRequest, webhook_module.HookEventPullRequestMilestone: - return matchPullRequestEvent(gitRepo, commit, payload.(*api.PullRequestPayload), evt) + return matchPullRequestEvent(ctx, gitRepo, commit, payload.(*api.PullRequestPayload), evt) case // pull_request_review webhook_module.HookEventPullRequestReviewApproved, @@ -256,7 +258,7 @@ func detectMatched(gitRepo *git.Repository, commit *git.Commit, triggedEvent web } } -func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobparser.Event) bool { +func matchPushEvent(ctx context.Context, commit *git.Commit, pushPayload *api.PushPayload, evt *jobparser.Event) bool { // with no special filter parameters if len(evt.Acts()) == 0 { return true @@ -322,7 +324,7 @@ func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobpa matchTimes++ break } - filesChanged, err := commit.GetFilesChangedSinceCommit(pushPayload.Before) + filesChanged, err := commit.GetFilesChangedSinceCommit(ctx, pushPayload.Before) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err) } else { @@ -339,7 +341,7 @@ func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobpa matchTimes++ break } - filesChanged, err := commit.GetFilesChangedSinceCommit(pushPayload.Before) + filesChanged, err := commit.GetFilesChangedSinceCommit(ctx, pushPayload.Before) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err) } else { @@ -410,7 +412,7 @@ func matchIssuesEvent(issuePayload *api.IssuePayload, evt *jobparser.Event) bool return matchTimes == len(evt.Acts()) } -func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { +func matchPullRequestEvent(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) bool { acts := evt.Acts() activityTypeMatched := false matchTimes := 0 @@ -454,7 +456,7 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa err error ) if evt.Name == GithubEventPullRequestTarget && (len(acts["paths"]) > 0 || len(acts["paths-ignore"]) > 0) { - headCommit, err = gitRepo.GetCommit(prPayload.PullRequest.Head.Sha) + headCommit, err = gitRepo.GetCommit(ctx, prPayload.PullRequest.Head.Sha) if err != nil { log.Error("GetCommit [ref: %s]: %v", prPayload.PullRequest.Head.Sha, err) return false @@ -486,7 +488,7 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa matchTimes++ } case "paths": - filesChanged, err := headCommit.GetFilesChangedSinceCommit(prPayload.PullRequest.MergeBase) + filesChanged, err := headCommit.GetFilesChangedSinceCommit(ctx, prPayload.PullRequest.MergeBase) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", headCommit.ID.String(), err) } else { @@ -499,7 +501,7 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa } } case "paths-ignore": - filesChanged, err := headCommit.GetFilesChangedSinceCommit(prPayload.PullRequest.MergeBase) + filesChanged, err := headCommit.GetFilesChangedSinceCommit(ctx, prPayload.PullRequest.MergeBase) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", headCommit.ID.String(), err) } else { diff --git a/modules/actions/workflows_test.go b/modules/actions/workflows_test.go index 89620fb698861..14ee157f63b5f 100644 --- a/modules/actions/workflows_test.go +++ b/modules/actions/workflows_test.go @@ -150,7 +150,7 @@ func TestDetectMatched(t *testing.T) { evts, err := GetEventsFromContent([]byte(tc.yamlOn)) assert.NoError(t, err) assert.Len(t, evts, 1) - assert.Equal(t, tc.expected, detectMatched(nil, tc.commit, tc.triggedEvent, tc.payload, evts[0])) + assert.Equal(t, tc.expected, detectMatched(t.Context(), nil, tc.commit, tc.triggedEvent, tc.payload, evts[0])) }) } } diff --git a/modules/cache/cache.go b/modules/cache/cache.go index 039caa9fbc8b9..7bfdc00a275b4 100644 --- a/modules/cache/cache.go +++ b/modules/cache/cache.go @@ -4,6 +4,7 @@ package cache import ( + "context" "encoding/hex" "errors" "fmt" @@ -96,9 +97,9 @@ func GetString(key string, getFunc func() (string, error)) (string, error) { } // GetInt64 returns key value from cache with callback when no key exists in cache -func GetInt64(key string, getFunc func() (int64, error)) (int64, error) { +func GetInt64(ctx context.Context, key string, getFunc func(ctx context.Context) (int64, error)) (int64, error) { s, err := GetString(key, func() (string, error) { - v, err := getFunc() + v, err := getFunc(ctx) return strconv.FormatInt(v, 10), err }) if err != nil { diff --git a/modules/cache/cache_test.go b/modules/cache/cache_test.go index d6ea2032eeef2..8bd9bc1d53421 100644 --- a/modules/cache/cache_test.go +++ b/modules/cache/cache_test.go @@ -4,6 +4,7 @@ package cache import ( + "context" "errors" "testing" "time" @@ -92,32 +93,32 @@ func TestGetString(t *testing.T) { func TestGetInt64(t *testing.T) { createTestCache() - data, err := GetInt64("key", func() (int64, error) { + data, err := GetInt64(t.Context(), "key", func(_ context.Context) (int64, error) { return 0, errors.New("some error") }) assert.Error(t, err) assert.EqualValues(t, 0, data) - data, err = GetInt64("key", func() (int64, error) { + data, err = GetInt64(t.Context(), "key", func(_ context.Context) (int64, error) { return 0, nil }) assert.NoError(t, err) assert.EqualValues(t, 0, data) - data, err = GetInt64("key", func() (int64, error) { + data, err = GetInt64(t.Context(), "key", func(_ context.Context) (int64, error) { return 100, nil }) assert.NoError(t, err) assert.EqualValues(t, 0, data) Remove("key") - data, err = GetInt64("key", func() (int64, error) { + data, err = GetInt64(t.Context(), "key", func(_ context.Context) (int64, error) { return 100, nil }) assert.NoError(t, err) assert.EqualValues(t, 100, data) - data, err = GetInt64("key", func() (int64, error) { + data, err = GetInt64(t.Context(), "key", func(_ context.Context) (int64, error) { return 0, errors.New("some error") }) assert.NoError(t, err) diff --git a/modules/fileicon/entry.go b/modules/fileicon/entry.go index 0326c2bfa8ab9..eefb05e8555f3 100644 --- a/modules/fileicon/entry.go +++ b/modules/fileicon/entry.go @@ -3,7 +3,11 @@ package fileicon -import "code.gitea.io/gitea/modules/git" +import ( + "context" + + "code.gitea.io/gitea/modules/git" +) type EntryInfo struct { BaseName string @@ -12,10 +16,10 @@ type EntryInfo struct { IsOpen bool } -func EntryInfoFromGitTreeEntry(commit *git.Commit, fullPath string, gitEntry *git.TreeEntry) *EntryInfo { +func EntryInfoFromGitTreeEntry(ctx context.Context, commit *git.Commit, fullPath string, gitEntry *git.TreeEntry) *EntryInfo { ret := &EntryInfo{BaseName: gitEntry.Name(), EntryMode: gitEntry.Mode()} if gitEntry.IsLink() { - if res, err := git.EntryFollowLink(commit, fullPath, gitEntry); err == nil && res.TargetEntry.IsDir() { + if res, err := git.EntryFollowLink(ctx, commit, fullPath, gitEntry); err == nil && res.TargetEntry.IsDir() { ret.SymlinkToMode = res.TargetEntry.Mode() } } diff --git a/modules/git/attribute/batch.go b/modules/git/attribute/batch.go index 27befdfa25af1..50f235d5a312b 100644 --- a/modules/git/attribute/batch.go +++ b/modules/git/attribute/batch.go @@ -22,22 +22,21 @@ type BatchChecker struct { repo *git.Repository stdinWriter *os.File stdOut *nulSeparatedAttributeWriter - ctx context.Context cancel context.CancelFunc cmd *gitcmd.Command } // NewBatchChecker creates a check attribute reader for the current repository and provided commit ID // If treeish is empty, then it will use current working directory, otherwise it will use the provided treeish on the bare repo -func NewBatchChecker(repo *git.Repository, treeish string, attributes []string) (checker *BatchChecker, returnedErr error) { - ctx, cancel := context.WithCancel(repo.Ctx) +func NewBatchChecker(ctx context.Context, repo *git.Repository, treeish string, attributes []string) (checker *BatchChecker, returnedErr error) { + ctx, cancel := context.WithCancel(ctx) defer func() { if returnedErr != nil { cancel() } }() - cmd, envs, cleanup, err := checkAttrCommand(repo, treeish, nil, attributes) + cmd, envs, cleanup, err := checkAttrCommand(ctx, repo, treeish, nil, attributes) if err != nil { return nil, err } @@ -52,7 +51,6 @@ func NewBatchChecker(repo *git.Repository, treeish string, attributes []string) checker = &BatchChecker{ attributesNum: len(attributes), repo: repo, - ctx: ctx, cmd: cmd, cancel: func() { cancel() @@ -94,16 +92,16 @@ func NewBatchChecker(repo *git.Repository, treeish string, attributes []string) } // CheckPath check attr for given path -func (c *BatchChecker) CheckPath(path string) (rs *Attributes, err error) { +func (c *BatchChecker) CheckPath(ctx context.Context, path string) (rs *Attributes, err error) { defer func() { - if err != nil && err != c.ctx.Err() { + if err != nil && err != ctx.Err() { log.Error("Unexpected error when checking path %s in %s, error: %v", path, filepath.Base(c.repo.Path), err) } }() select { - case <-c.ctx.Done(): - return nil, c.ctx.Err() + case <-ctx.Done(): + return nil, ctx.Err() default: } @@ -136,11 +134,11 @@ func (c *BatchChecker) CheckPath(path string) (rs *Attributes, err error) { return nil, reportTimeout() case attr, ok := <-c.stdOut.ReadAttribute(): if !ok { - return nil, c.ctx.Err() + return nil, ctx.Err() } rs.m[attr.Attribute] = Attribute(attr.Value) - case <-c.ctx.Done(): - return nil, c.ctx.Err() + case <-ctx.Done(): + return nil, ctx.Err() } } return rs, nil diff --git a/modules/git/attribute/batch_test.go b/modules/git/attribute/batch_test.go index 30a3d805fe983..aeb2ea25df8ba 100644 --- a/modules/git/attribute/batch_test.go +++ b/modules/git/attribute/batch_test.go @@ -118,7 +118,7 @@ func expectedAttrs() *Attributes { func Test_BatchChecker(t *testing.T) { setting.AppDataPath = t.TempDir() repoPath := "../tests/repos/language_stats_repo" - gitRepo, err := git.OpenRepository(t.Context(), repoPath) + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() @@ -126,10 +126,10 @@ func Test_BatchChecker(t *testing.T) { t.Run("Create index file to run git check-attr", func(t *testing.T) { defer test.MockVariableValue(&git.DefaultFeatures().SupportCheckAttrOnBare, false)() - checker, err := NewBatchChecker(gitRepo, commitID, LinguistAttributes) + checker, err := NewBatchChecker(t.Context(), gitRepo, commitID, LinguistAttributes) assert.NoError(t, err) defer checker.Close() - attributes, err := checker.CheckPath("i-am-a-python.p") + attributes, err := checker.CheckPath(t.Context(), "i-am-a-python.p") assert.NoError(t, err) assert.Equal(t, expectedAttrs(), attributes) }) @@ -143,14 +143,14 @@ func Test_BatchChecker(t *testing.T) { }) assert.NoError(t, err) - tempRepo, err := git.OpenRepository(t.Context(), dir) + tempRepo, err := git.OpenRepository(dir) assert.NoError(t, err) defer tempRepo.Close() - checker, err := NewBatchChecker(tempRepo, "", LinguistAttributes) + checker, err := NewBatchChecker(t.Context(), tempRepo, "", LinguistAttributes) assert.NoError(t, err) defer checker.Close() - attributes, err := checker.CheckPath("i-am-a-python.p") + attributes, err := checker.CheckPath(t.Context(), "i-am-a-python.p") assert.NoError(t, err) assert.Equal(t, expectedAttrs(), attributes) }) @@ -161,11 +161,11 @@ func Test_BatchChecker(t *testing.T) { } t.Run("Run git check-attr in bare repository", func(t *testing.T) { - checker, err := NewBatchChecker(gitRepo, commitID, LinguistAttributes) + checker, err := NewBatchChecker(t.Context(), gitRepo, commitID, LinguistAttributes) assert.NoError(t, err) defer checker.Close() - attributes, err := checker.CheckPath("i-am-a-python.p") + attributes, err := checker.CheckPath(t.Context(), "i-am-a-python.p") assert.NoError(t, err) assert.Equal(t, expectedAttrs(), attributes) }) diff --git a/modules/git/attribute/checker.go b/modules/git/attribute/checker.go index 49c0eb90ef26f..da5eecfd3abdc 100644 --- a/modules/git/attribute/checker.go +++ b/modules/git/attribute/checker.go @@ -14,7 +14,7 @@ import ( "code.gitea.io/gitea/modules/git/gitcmd" ) -func checkAttrCommand(gitRepo *git.Repository, treeish string, filenames, attributes []string) (*gitcmd.Command, []string, func(), error) { +func checkAttrCommand(ctx context.Context, gitRepo *git.Repository, treeish string, filenames, attributes []string) (*gitcmd.Command, []string, func(), error) { cancel := func() {} envs := []string{"GIT_FLUSH=1"} cmd := gitcmd.NewCommand("check-attr", "-z") @@ -28,7 +28,7 @@ func checkAttrCommand(gitRepo *git.Repository, treeish string, filenames, attrib cmd.AddArguments("--source") cmd.AddDynamicArguments(treeish) } else { - indexFilename, worktree, deleteTemporaryFile, err := gitRepo.ReadTreeToTemporaryIndex(treeish) + indexFilename, worktree, deleteTemporaryFile, err := gitRepo.ReadTreeToTemporaryIndex(ctx, treeish) if err != nil { return nil, nil, nil, err } @@ -62,7 +62,7 @@ type CheckAttributeOpts struct { // CheckAttributes return the attributes of the given filenames and attributes in the given treeish. // If treeish is empty, then it will use current working directory, otherwise it will use the provided treeish on the bare repo func CheckAttributes(ctx context.Context, gitRepo *git.Repository, treeish string, opts CheckAttributeOpts) (map[string]*Attributes, error) { - cmd, envs, cancel, err := checkAttrCommand(gitRepo, treeish, opts.Filenames, opts.Attributes) + cmd, envs, cancel, err := checkAttrCommand(ctx, gitRepo, treeish, opts.Filenames, opts.Attributes) if err != nil { return nil, err } diff --git a/modules/git/attribute/checker_test.go b/modules/git/attribute/checker_test.go index 67fbda8918800..9a471816e4e95 100644 --- a/modules/git/attribute/checker_test.go +++ b/modules/git/attribute/checker_test.go @@ -18,7 +18,7 @@ import ( func Test_Checker(t *testing.T) { setting.AppDataPath = t.TempDir() repoPath := "../tests/repos/language_stats_repo" - gitRepo, err := git.OpenRepository(t.Context(), repoPath) + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() @@ -44,7 +44,7 @@ func Test_Checker(t *testing.T) { }) assert.NoError(t, err) - tempRepo, err := git.OpenRepository(t.Context(), dir) + tempRepo, err := git.OpenRepository(dir) assert.NoError(t, err) defer tempRepo.Close() diff --git a/modules/git/blame.go b/modules/git/blame.go index 601be96f05efb..66cdfb3fad9b9 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -145,7 +145,7 @@ func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath cmd := gitcmd.NewCommand("blame", "--porcelain") if DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore { - ignoreRevsFileName, ignoreRevsFileCleanup, err = tryCreateBlameIgnoreRevsFile(commit) + ignoreRevsFileName, ignoreRevsFileCleanup, err = tryCreateBlameIgnoreRevsFile(ctx, commit) if err != nil && !IsErrNotExist(err) { return nil, err } @@ -190,13 +190,13 @@ func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath }, nil } -func tryCreateBlameIgnoreRevsFile(commit *Commit) (string, func(), error) { - entry, err := commit.GetTreeEntryByPath(".git-blame-ignore-revs") +func tryCreateBlameIgnoreRevsFile(ctx context.Context, commit *Commit) (string, func(), error) { + entry, err := commit.GetTreeEntryByPath(ctx, ".git-blame-ignore-revs") if err != nil { return "", nil, err } - r, err := entry.Blob().DataAsync() + r, err := entry.Blob().DataAsync(ctx) if err != nil { return "", nil, err } diff --git a/modules/git/blame_sha256_test.go b/modules/git/blame_sha256_test.go index c0a97bed3bd35..79ce387188d43 100644 --- a/modules/git/blame_sha256_test.go +++ b/modules/git/blame_sha256_test.go @@ -23,11 +23,11 @@ func TestReadingBlameOutputSha256(t *testing.T) { } t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { - repo, err := OpenRepository(ctx, "./tests/repos/repo5_pulls_sha256") + repo, err := OpenRepository("./tests/repos/repo5_pulls_sha256") assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("0b69b7bb649b5d46e14cabb6468685e5dd721290acc7ffe604d37cde57927345") + commit, err := repo.GetCommit(ctx, "0b69b7bb649b5d46e14cabb6468685e5dd721290acc7ffe604d37cde57927345") assert.NoError(t, err) parts := []*BlamePart{ @@ -68,7 +68,7 @@ func TestReadingBlameOutputSha256(t *testing.T) { }) t.Run("With .git-blame-ignore-revs", func(t *testing.T) { - repo, err := OpenRepository(ctx, "./tests/repos/repo6_blame_sha256") + repo, err := OpenRepository("./tests/repos/repo6_blame_sha256") assert.NoError(t, err) defer repo.Close() @@ -126,10 +126,10 @@ func TestReadingBlameOutputSha256(t *testing.T) { }, } - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) assert.NoError(t, err) for _, c := range cases { - commit, err := repo.GetCommit(c.CommitID) + commit, err := repo.GetCommit(ctx, c.CommitID) assert.NoError(t, err) blameReader, err := CreateBlameReader(ctx, objectFormat, "./tests/repos/repo6_blame_sha256", commit, "blame.txt", c.Bypass) assert.NoError(t, err) diff --git a/modules/git/blame_test.go b/modules/git/blame_test.go index 809d6fbcf7381..3390f606d8891 100644 --- a/modules/git/blame_test.go +++ b/modules/git/blame_test.go @@ -18,11 +18,11 @@ func TestReadingBlameOutput(t *testing.T) { defer cancel() t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { - repo, err := OpenRepository(ctx, "./tests/repos/repo5_pulls") + repo, err := OpenRepository("./tests/repos/repo5_pulls") assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("f32b0a9dfd09a60f616f29158f772cedd89942d2") + commit, err := repo.GetCommit(ctx, "f32b0a9dfd09a60f616f29158f772cedd89942d2") assert.NoError(t, err) parts := []*BlamePart{ @@ -63,7 +63,7 @@ func TestReadingBlameOutput(t *testing.T) { }) t.Run("With .git-blame-ignore-revs", func(t *testing.T) { - repo, err := OpenRepository(ctx, "./tests/repos/repo6_blame") + repo, err := OpenRepository("./tests/repos/repo6_blame") assert.NoError(t, err) defer repo.Close() @@ -121,10 +121,10 @@ func TestReadingBlameOutput(t *testing.T) { }, } - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) assert.NoError(t, err) for _, c := range cases { - commit, err := repo.GetCommit(c.CommitID) + commit, err := repo.GetCommit(ctx, c.CommitID) assert.NoError(t, err) blameReader, err := CreateBlameReader(ctx, objectFormat, "./tests/repos/repo6_blame", commit, "blame.txt", c.Bypass) diff --git a/modules/git/blob.go b/modules/git/blob.go index 40d8f44e799d6..e22003a9c4226 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "encoding/base64" "errors" "io" @@ -23,11 +24,11 @@ func (b *Blob) Name() string { } // GetBlobBytes Gets the limited content of the blob -func (b *Blob) GetBlobBytes(limit int64) ([]byte, error) { +func (b *Blob) GetBlobBytes(ctx context.Context, limit int64) ([]byte, error) { if limit <= 0 { return nil, nil } - dataRc, err := b.DataAsync() + dataRc, err := b.DataAsync(ctx) if err != nil { return nil, err } @@ -36,15 +37,15 @@ func (b *Blob) GetBlobBytes(limit int64) ([]byte, error) { } // GetBlobContent Gets the limited content of the blob as raw text -func (b *Blob) GetBlobContent(limit int64) (string, error) { - buf, err := b.GetBlobBytes(limit) +func (b *Blob) GetBlobContent(ctx context.Context, limit int64) (string, error) { + buf, err := b.GetBlobBytes(ctx, limit) return string(buf), err } // GetBlobLineCount gets line count of the blob. // It will also try to write the content to w if it's not nil, then we could pre-fetch the content without reading it again. -func (b *Blob) GetBlobLineCount(w io.Writer) (int, error) { - reader, err := b.DataAsync() +func (b *Blob) GetBlobLineCount(ctx context.Context, w io.Writer) (int, error) { + reader, err := b.DataAsync(ctx) if err != nil { return 0, err } @@ -70,8 +71,8 @@ func (b *Blob) GetBlobLineCount(w io.Writer) (int, error) { } // GetBlobContentBase64 Reads the content of the blob with a base64 encoding and returns the encoded string -func (b *Blob) GetBlobContentBase64(originContent *strings.Builder) (string, error) { - dataRc, err := b.DataAsync() +func (b *Blob) GetBlobContentBase64(ctx context.Context, originContent *strings.Builder) (string, error) { + dataRc, err := b.DataAsync(ctx) if err != nil { return "", err } @@ -103,8 +104,8 @@ loop: } // GuessContentType guesses the content type of the blob. -func (b *Blob) GuessContentType() (typesniffer.SniffedType, error) { - buf, err := b.GetBlobBytes(typesniffer.SniffContentSize) +func (b *Blob) GuessContentType(ctx context.Context) (typesniffer.SniffedType, error) { + buf, err := b.GetBlobBytes(ctx, typesniffer.SniffContentSize) if err != nil { return typesniffer.SniffedType{}, err } diff --git a/modules/git/blob_nogogit.go b/modules/git/blob_nogogit.go index af3ce376d6a46..642a3725cf8bd 100644 --- a/modules/git/blob_nogogit.go +++ b/modules/git/blob_nogogit.go @@ -8,6 +8,7 @@ package git import ( "bufio" "bytes" + "context" "io" "code.gitea.io/gitea/modules/log" @@ -25,8 +26,8 @@ type Blob struct { // DataAsync gets a ReadCloser for the contents of a blob without reading it all. // Calling the Close function on the result will discard all unread output. -func (b *Blob) DataAsync() (io.ReadCloser, error) { - wr, rd, cancel, err := b.repo.CatFileBatch(b.repo.Ctx) +func (b *Blob) DataAsync(ctx context.Context) (io.ReadCloser, error) { + wr, rd, cancel, err := b.repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -62,12 +63,12 @@ func (b *Blob) DataAsync() (io.ReadCloser, error) { } // Size returns the uncompressed size of the blob -func (b *Blob) Size() int64 { +func (b *Blob) Size(ctx context.Context) int64 { if b.gotSize { return b.size } - wr, rd, cancel, err := b.repo.CatFileBatchCheck(b.repo.Ctx) + wr, rd, cancel, err := b.repo.CatFileBatchCheck(ctx) if err != nil { log.Debug("error whilst reading size for %s in %s. Error: %v", b.ID.String(), b.repo.Path, err) return 0 diff --git a/modules/git/blob_test.go b/modules/git/blob_test.go index 4c86aa70ba79a..17afd46ff1f07 100644 --- a/modules/git/blob_test.go +++ b/modules/git/blob_test.go @@ -16,14 +16,14 @@ import ( func TestBlob_Data(t *testing.T) { output := "file2\n" bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) require.NoError(t, err) defer repo.Close() testBlob, err := repo.GetBlob("6c493ff740f9380390d5c9ddef4af18697ac9375") assert.NoError(t, err) - r, err := testBlob.DataAsync() + r, err := testBlob.DataAsync(t.Context()) assert.NoError(t, err) require.NotNil(t, r) @@ -36,7 +36,7 @@ func TestBlob_Data(t *testing.T) { func Benchmark_Blob_Data(b *testing.B) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(b.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) if err != nil { b.Fatal(err) } @@ -48,7 +48,7 @@ func Benchmark_Blob_Data(b *testing.B) { } for b.Loop() { - r, err := testBlob.DataAsync() + r, err := testBlob.DataAsync(b.Context()) if err != nil { b.Fatal(err) } diff --git a/modules/git/commit.go b/modules/git/commit.go index 260b81b59022e..dc067945789a7 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -60,12 +60,12 @@ func (c *Commit) ParentID(n int) (ObjectID, error) { } // Parent returns n-th parent (0-based index) of the commit. -func (c *Commit) Parent(n int) (*Commit, error) { +func (c *Commit) Parent(ctx context.Context, n int) (*Commit, error) { id, err := c.ParentID(n) if err != nil { return nil, err } - parent, err := c.repo.getCommit(id) + parent, err := c.repo.getCommit(ctx, id) if err != nil { return nil, err } @@ -79,11 +79,11 @@ func (c *Commit) ParentCount() int { } // GetCommitByPath return the commit of relative path object. -func (c *Commit) GetCommitByPath(relpath string) (*Commit, error) { +func (c *Commit) GetCommitByPath(ctx context.Context, relpath string) (*Commit, error) { if c.repo.LastCommitCache != nil { - return c.repo.LastCommitCache.GetCommitByPath(c.ID.String(), relpath) + return c.repo.LastCommitCache.GetCommitByPath(ctx, c.ID.String(), relpath) } - return c.repo.getCommitByPathWithID(c.ID, relpath) + return c.repo.getCommitByPathWithID(ctx, c.ID, relpath) } // AddChanges marks local changes to be ready for commit. @@ -182,25 +182,25 @@ func CommitsCount(ctx context.Context, opts CommitsCountOptions) (int64, error) } // CommitsCount returns number of total commits of until current revision. -func (c *Commit) CommitsCount() (int64, error) { - return CommitsCount(c.repo.Ctx, CommitsCountOptions{ +func (c *Commit) CommitsCount(ctx context.Context) (int64, error) { + return CommitsCount(ctx, CommitsCountOptions{ RepoPath: c.repo.Path, Revision: []string{c.ID.String()}, }) } // CommitsByRange returns the specific page commits before current revision, every page's number default by CommitsRangeSize -func (c *Commit) CommitsByRange(page, pageSize int, not, since, until string) ([]*Commit, error) { - return c.repo.commitsByRangeWithTime(c.ID, page, pageSize, not, since, until) +func (c *Commit) CommitsByRange(ctx context.Context, page, pageSize int, not, since, until string) ([]*Commit, error) { + return c.repo.commitsByRangeWithTime(ctx, c.ID, page, pageSize, not, since, until) } // CommitsBefore returns all the commits before current revision -func (c *Commit) CommitsBefore() ([]*Commit, error) { - return c.repo.getCommitsBefore(c.ID) +func (c *Commit) CommitsBefore(ctx context.Context) ([]*Commit, error) { + return c.repo.getCommitsBefore(ctx, c.ID) } // HasPreviousCommit returns true if a given commitHash is contained in commit's parents -func (c *Commit) HasPreviousCommit(objectID ObjectID) (bool, error) { +func (c *Commit) HasPreviousCommit(ctx context.Context, objectID ObjectID) (bool, error) { this := c.ID.String() that := objectID.String() @@ -211,7 +211,7 @@ func (c *Commit) HasPreviousCommit(objectID ObjectID) (bool, error) { _, _, err := gitcmd.NewCommand("merge-base", "--is-ancestor"). AddDynamicArguments(that, this). WithDir(c.repo.Path). - RunStdString(c.repo.Ctx) + RunStdString(ctx) if err == nil { return true, nil } @@ -225,8 +225,8 @@ func (c *Commit) HasPreviousCommit(objectID ObjectID) (bool, error) { } // IsForcePush returns true if a push from oldCommitHash to this is a force push -func (c *Commit) IsForcePush(oldCommitID string) (bool, error) { - objectFormat, err := c.repo.GetObjectFormat() +func (c *Commit) IsForcePush(ctx context.Context, oldCommitID string) (bool, error) { + objectFormat, err := c.repo.GetObjectFormat(ctx) if err != nil { return false, err } @@ -234,26 +234,26 @@ func (c *Commit) IsForcePush(oldCommitID string) (bool, error) { return false, nil } - oldCommit, err := c.repo.GetCommit(oldCommitID) + oldCommit, err := c.repo.GetCommit(ctx, oldCommitID) if err != nil { return false, err } - hasPreviousCommit, err := c.HasPreviousCommit(oldCommit.ID) + hasPreviousCommit, err := c.HasPreviousCommit(ctx, oldCommit.ID) return !hasPreviousCommit, err } // CommitsBeforeLimit returns num commits before current revision -func (c *Commit) CommitsBeforeLimit(num int) ([]*Commit, error) { - return c.repo.getCommitsBeforeLimit(c.ID, num) +func (c *Commit) CommitsBeforeLimit(ctx context.Context, num int) ([]*Commit, error) { + return c.repo.getCommitsBeforeLimit(ctx, c.ID, num) } // CommitsBeforeUntil returns the commits between commitID to current revision -func (c *Commit) CommitsBeforeUntil(commitID string) ([]*Commit, error) { - endCommit, err := c.repo.GetCommit(commitID) +func (c *Commit) CommitsBeforeUntil(ctx context.Context, commitID string) ([]*Commit, error) { + endCommit, err := c.repo.GetCommit(ctx, commitID) if err != nil { return nil, err } - return c.repo.CommitsBetween(c, endCommit) + return c.repo.CommitsBetween(ctx, c, endCommit) } // SearchCommitsOptions specify the parameters for SearchCommits @@ -296,25 +296,25 @@ func NewSearchCommitsOptions(searchString string, forAllRefs bool) SearchCommits } // SearchCommits returns the commits match the keyword before current revision -func (c *Commit) SearchCommits(opts SearchCommitsOptions) ([]*Commit, error) { - return c.repo.searchCommits(c.ID, opts) +func (c *Commit) SearchCommits(ctx context.Context, opts SearchCommitsOptions) ([]*Commit, error) { + return c.repo.searchCommits(ctx, c.ID, opts) } // GetFilesChangedSinceCommit get all changed file names between pastCommit to current revision -func (c *Commit) GetFilesChangedSinceCommit(pastCommit string) ([]string, error) { - return c.repo.GetFilesChangedBetween(pastCommit, c.ID.String()) +func (c *Commit) GetFilesChangedSinceCommit(ctx context.Context, pastCommit string) ([]string, error) { + return c.repo.GetFilesChangedBetween(ctx, pastCommit, c.ID.String()) } // FileChangedSinceCommit Returns true if the file given has changed since the past commit // YOU MUST ENSURE THAT pastCommit is a valid commit ID. -func (c *Commit) FileChangedSinceCommit(filename, pastCommit string) (bool, error) { - return c.repo.FileChangedBetweenCommits(filename, pastCommit, c.ID.String()) +func (c *Commit) FileChangedSinceCommit(ctx context.Context, filename, pastCommit string) (bool, error) { + return c.repo.FileChangedBetweenCommits(ctx, filename, pastCommit, c.ID.String()) } // HasFile returns true if the file given exists on this commit // This does only mean it's there - it does not mean the file was changed during the commit. -func (c *Commit) HasFile(filename string) (bool, error) { - _, err := c.GetBlobByPath(filename) +func (c *Commit) HasFile(ctx context.Context, filename string) (bool, error) { + _, err := c.GetBlobByPath(ctx, filename) if err != nil { return false, err } @@ -322,13 +322,13 @@ func (c *Commit) HasFile(filename string) (bool, error) { } // GetFileContent reads a file content as a string or returns false if this was not possible -func (c *Commit) GetFileContent(filename string, limit int) (string, error) { - entry, err := c.GetTreeEntryByPath(filename) +func (c *Commit) GetFileContent(ctx context.Context, filename string, limit int) (string, error) { + entry, err := c.GetTreeEntryByPath(ctx, filename) if err != nil { return "", err } - r, err := entry.Blob().DataAsync() + r, err := entry.Blob().DataAsync(ctx) if err != nil { return "", err } @@ -351,13 +351,13 @@ func (c *Commit) GetFileContent(filename string, limit int) (string, error) { } // GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only') -func (c *Commit) GetBranchName() (string, error) { +func (c *Commit) GetBranchName(ctx context.Context) (string, error) { cmd := gitcmd.NewCommand("name-rev") if DefaultFeatures().CheckVersionAtLeast("2.13.0") { cmd.AddArguments("--exclude", "refs/tags/*") } cmd.AddArguments("--name-only", "--no-undefined").AddDynamicArguments(c.ID.String()) - data, _, err := cmd.WithDir(c.repo.Path).RunStdString(c.repo.Ctx) + data, _, err := cmd.WithDir(c.repo.Path).RunStdString(ctx) if err != nil { // handle special case where git can not describe commit if strings.Contains(err.Error(), "cannot describe") { @@ -466,11 +466,11 @@ func GetFullCommitID(ctx context.Context, repoPath, shortID string) (string, err } // GetRepositoryDefaultPublicGPGKey returns the default public key for this commit -func (c *Commit) GetRepositoryDefaultPublicGPGKey(forceUpdate bool) (*GPGSettings, error) { +func (c *Commit) GetRepositoryDefaultPublicGPGKey(ctx context.Context, forceUpdate bool) (*GPGSettings, error) { if c.repo == nil { return nil, nil } - return c.repo.GetDefaultPublicGPGKey(forceUpdate) + return c.repo.GetDefaultPublicGPGKey(ctx, forceUpdate) } func IsStringLikelyCommitID(objFmt ObjectFormat, s string, minLength ...int) bool { diff --git a/modules/git/commit_info.go b/modules/git/commit_info.go index 4f76a28f31c0b..4fd1051920a67 100644 --- a/modules/git/commit_info.go +++ b/modules/git/commit_info.go @@ -3,6 +3,8 @@ package git +import "context" + // CommitInfo describes the first commit with the provided entry type CommitInfo struct { Entry *TreeEntry @@ -10,8 +12,8 @@ type CommitInfo struct { SubmoduleFile *CommitSubmoduleFile } -func GetCommitInfoSubmoduleFile(repoLink, fullPath string, commit *Commit, refCommitID ObjectID) (*CommitSubmoduleFile, error) { - submodule, err := commit.GetSubModule(fullPath) +func GetCommitInfoSubmoduleFile(ctx context.Context, repoLink, fullPath string, commit *Commit, refCommitID ObjectID) (*CommitSubmoduleFile, error) { + submodule, err := commit.GetSubModule(ctx, fullPath) if err != nil { return nil, err } diff --git a/modules/git/commit_info_nogogit.go b/modules/git/commit_info_nogogit.go index ed775332a92db..d9224ac9b8317 100644 --- a/modules/git/commit_info_nogogit.go +++ b/modules/git/commit_info_nogogit.go @@ -28,7 +28,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, commit * var revs map[string]*Commit if commit.repo.LastCommitCache != nil { var unHitPaths []string - revs, unHitPaths, err = getLastCommitForPathsByCache(commit.ID.String(), treePath, entryPaths, commit.repo.LastCommitCache) + revs, unHitPaths, err = getLastCommitForPathsByCache(ctx, commit.ID.String(), treePath, entryPaths, commit.repo.LastCommitCache) if err != nil { return nil, nil, err } @@ -64,7 +64,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, commit * // If the entry is a submodule, add a submodule file for this if entry.IsSubModule() { - commitsInfo[i].SubmoduleFile, err = GetCommitInfoSubmoduleFile(repoLink, path.Join(treePath, entry.Name()), commit, entry.ID) + commitsInfo[i].SubmoduleFile, err = GetCommitInfoSubmoduleFile(ctx, repoLink, path.Join(treePath, entry.Name()), commit, entry.ID) if err != nil { return nil, nil, err } @@ -84,11 +84,11 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, commit * return commitsInfo, treeCommit, nil } -func getLastCommitForPathsByCache(commitID, treePath string, paths []string, cache *LastCommitCache) (map[string]*Commit, []string, error) { +func getLastCommitForPathsByCache(ctx context.Context, commitID, treePath string, paths []string, cache *LastCommitCache) (map[string]*Commit, []string, error) { var unHitEntryPaths []string results := make(map[string]*Commit) for _, p := range paths { - lastCommit, err := cache.Get(commitID, path.Join(treePath, p)) + lastCommit, err := cache.Get(ctx, commitID, path.Join(treePath, p)) if err != nil { return nil, nil, err } @@ -126,7 +126,7 @@ func GetLastCommitForPaths(ctx context.Context, commit *Commit, treePath string, continue } - c, err := commit.repo.GetCommit(commitID) // Ensure the commit exists in the repository + c, err := commit.repo.GetCommit(ctx, commitID) // Ensure the commit exists in the repository if err != nil { return nil, err } diff --git a/modules/git/commit_info_test.go b/modules/git/commit_info_test.go index 51e1551d2d32c..ba170e84288d9 100644 --- a/modules/git/commit_info_test.go +++ b/modules/git/commit_info_test.go @@ -55,7 +55,7 @@ func testGetCommitsInfo(t *testing.T, repo1 *Repository) { }, "feaf4ba6bc635fec442f46ddd4512416ec43c2c2"}, } for _, testCase := range testCases { - commit, err := repo1.GetCommit(testCase.CommitID) + commit, err := repo1.GetCommit(t.Context(), testCase.CommitID) if err != nil { assert.NoError(t, err, "Unable to get commit: %s from testcase due to error: %v", testCase.CommitID, err) // no point trying to do anything else for this test. @@ -65,7 +65,7 @@ func testGetCommitsInfo(t *testing.T, repo1 *Repository) { assert.NotNil(t, commit.Tree) assert.NotNil(t, commit.Tree.repo) - tree, err := commit.Tree.SubTree(testCase.Path) + tree, err := commit.Tree.SubTree(t.Context(), testCase.Path) if err != nil { assert.NoError(t, err, "Unable to get subtree: %s of commit: %s from testcase due to error: %v", testCase.Path, testCase.CommitID, err) // no point trying to do anything else for this test. @@ -75,7 +75,7 @@ func testGetCommitsInfo(t *testing.T, repo1 *Repository) { assert.NotNil(t, tree, "tree is nil for testCase CommitID %s in Path %s", testCase.CommitID, testCase.Path) assert.NotNil(t, tree.repo, "repo is nil for testCase CommitID %s in Path %s", testCase.CommitID, testCase.Path) - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(t.Context()) if err != nil { assert.NoError(t, err, "Unable to get entries of subtree: %s in commit: %s from testcase due to error: %v", testCase.Path, testCase.CommitID, err) // no point trying to do anything else for this test. @@ -104,7 +104,7 @@ func testGetCommitsInfo(t *testing.T, repo1 *Repository) { func TestEntries_GetCommitsInfo(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() @@ -114,7 +114,7 @@ func TestEntries_GetCommitsInfo(t *testing.T) { if err != nil { assert.NoError(t, err) } - clonedRepo1, err := OpenRepository(t.Context(), clonedPath) + clonedRepo1, err := OpenRepository(clonedPath) if err != nil { assert.NoError(t, err) } @@ -123,11 +123,11 @@ func TestEntries_GetCommitsInfo(t *testing.T) { testGetCommitsInfo(t, clonedRepo1) t.Run("NonExistingSubmoduleAsNil", func(t *testing.T) { - commit, err := bareRepo1.GetCommit("HEAD") + commit, err := bareRepo1.GetCommit(t.Context(), "HEAD") require.NoError(t, err) - treeEntry, err := commit.GetTreeEntryByPath("file1.txt") + treeEntry, err := commit.GetTreeEntryByPath(t.Context(), "file1.txt") require.NoError(t, err) - cisf, err := GetCommitInfoSubmoduleFile("/any/repo-link", "file1.txt", commit, treeEntry.ID) + cisf, err := GetCommitInfoSubmoduleFile(t.Context(), "/any/repo-link", "file1.txt", commit, treeEntry.ID) require.NoError(t, err) assert.Equal(t, &CommitSubmoduleFile{ repoLink: "/any/repo-link", @@ -163,14 +163,14 @@ func BenchmarkEntries_GetCommitsInfo(b *testing.B) { b.Fatal(err) } - if repo, err = OpenRepository(b.Context(), repoPath); err != nil { + if repo, err = OpenRepository(repoPath); err != nil { b.Fatal(err) } defer repo.Close() - if commit, err = repo.GetBranchCommit("master"); err != nil { + if commit, err = repo.GetBranchCommit(b.Context(), "master"); err != nil { b.Fatal(err) - } else if entries, err = commit.Tree.ListEntries(); err != nil { + } else if entries, err = commit.Tree.ListEntries(b.Context()); err != nil { b.Fatal(err) } entries.Sort() diff --git a/modules/git/commit_sha256_test.go b/modules/git/commit_sha256_test.go index 772f5eedb2798..ac493639af1c8 100644 --- a/modules/git/commit_sha256_test.go +++ b/modules/git/commit_sha256_test.go @@ -87,7 +87,7 @@ signed commit` 0x94, 0x33, 0xb2, 0xa6, 0x2b, 0x96, 0x4c, 0x17, 0xa4, 0x48, 0x5a, 0xe1, 0x80, 0xf4, 0x5f, 0x59, 0x5d, 0x3e, 0x69, 0xd3, 0x1b, 0x78, 0x60, 0x87, 0x77, 0x5e, 0x28, 0xc6, 0xb6, 0x39, 0x9d, 0xf0, } - gitRepo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare_sha256")) + gitRepo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare_sha256")) assert.NoError(t, err) assert.NotNil(t, gitRepo) defer gitRepo.Close() @@ -130,14 +130,14 @@ signed commit`, commitFromReader.Signature.Payload) func TestHasPreviousCommitSha256(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare_sha256") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc") + commit, err := repo.GetCommit(t.Context(), "f004f41359117d319dedd0eaab8c5259ee2263da839dcba33637997458627fdc") assert.NoError(t, err) - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(t.Context()) assert.NoError(t, err) parentSHA := MustIDFromString("b0ec7af4547047f12d5093e37ef8f1b3b5415ed8ee17894d43a34d7d34212e9c") @@ -145,15 +145,15 @@ func TestHasPreviousCommitSha256(t *testing.T) { assert.Equal(t, objectFormat, parentSHA.Type()) assert.Equal(t, "sha256", objectFormat.Name()) - haz, err := commit.HasPreviousCommit(parentSHA) + haz, err := commit.HasPreviousCommit(t.Context(), parentSHA) assert.NoError(t, err) assert.True(t, haz) - hazNot, err := commit.HasPreviousCommit(notParentSHA) + hazNot, err := commit.HasPreviousCommit(t.Context(), notParentSHA) assert.NoError(t, err) assert.False(t, hazNot) - selfNot, err := commit.HasPreviousCommit(commit.ID) + selfNot, err := commit.HasPreviousCommit(t.Context(), commit.ID) assert.NoError(t, err) assert.False(t, selfNot) } diff --git a/modules/git/commit_submodule.go b/modules/git/commit_submodule.go index ff253b7ecab22..834225c1c2cd4 100644 --- a/modules/git/commit_submodule.go +++ b/modules/git/commit_submodule.go @@ -3,17 +3,19 @@ package git +import "context" + type SubmoduleWebLink struct { RepoWebLink, CommitWebLink string } // GetSubModules get all the submodules of current revision git tree -func (c *Commit) GetSubModules() (*ObjectCache[*SubModule], error) { +func (c *Commit) GetSubModules(ctx context.Context) (*ObjectCache[*SubModule], error) { if c.submoduleCache != nil { return c.submoduleCache, nil } - entry, err := c.GetTreeEntryByPath(".gitmodules") + entry, err := c.GetTreeEntryByPath(ctx, ".gitmodules") if err != nil { if _, ok := err.(ErrNotExist); ok { return nil, nil @@ -21,7 +23,7 @@ func (c *Commit) GetSubModules() (*ObjectCache[*SubModule], error) { return nil, err } - rd, err := entry.Blob().DataAsync() + rd, err := entry.Blob().DataAsync(ctx) if err != nil { return nil, err } @@ -37,8 +39,8 @@ func (c *Commit) GetSubModules() (*ObjectCache[*SubModule], error) { // GetSubModule gets the submodule by the entry name. // It returns "nil, nil" if the submodule does not exist, caller should always remember to check the "nil" -func (c *Commit) GetSubModule(entryName string) (*SubModule, error) { - modules, err := c.GetSubModules() +func (c *Commit) GetSubModule(ctx context.Context, entryName string) (*SubModule, error) { + modules, err := c.GetSubModules(ctx) if err != nil { return nil, err } diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index 688b4e294f5bb..2614fa28a1c30 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -83,7 +83,7 @@ gpgsig -----BEGIN PGP SIGNATURE----- empty commit` sha := &Sha1Hash{0xfe, 0xaf, 0x4b, 0xa6, 0xbc, 0x63, 0x5f, 0xec, 0x44, 0x2f, 0x46, 0xdd, 0xd4, 0x51, 0x24, 0x16, 0xec, 0x43, 0xc2, 0xc2} - gitRepo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + gitRepo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) assert.NoError(t, err) assert.NotNil(t, gitRepo) defer gitRepo.Close() @@ -147,7 +147,7 @@ gpgsig -----BEGIN PGP SIGNATURE----- ISO-8859-1` commitString = strings.ReplaceAll(commitString, "", " ") sha := &Sha1Hash{0xfe, 0xaf, 0x4b, 0xa6, 0xbc, 0x63, 0x5f, 0xec, 0x44, 0x2f, 0x46, 0xdd, 0xd4, 0x51, 0x24, 0x16, 0xec, 0x43, 0xc2, 0xc2} - gitRepo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + gitRepo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) assert.NoError(t, err) assert.NotNil(t, gitRepo) defer gitRepo.Close() @@ -189,25 +189,25 @@ ISO-8859-1`, commitFromReader.Signature.Payload) func TestHasPreviousCommit(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0") + commit, err := repo.GetCommit(t.Context(), "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0") assert.NoError(t, err) parentSHA := MustIDFromString("8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2") notParentSHA := MustIDFromString("2839944139e0de9737a044f78b0e4b40d989a9e3") - haz, err := commit.HasPreviousCommit(parentSHA) + haz, err := commit.HasPreviousCommit(t.Context(), parentSHA) assert.NoError(t, err) assert.True(t, haz) - hazNot, err := commit.HasPreviousCommit(notParentSHA) + hazNot, err := commit.HasPreviousCommit(t.Context(), notParentSHA) assert.NoError(t, err) assert.False(t, hazNot) - selfNot, err := commit.HasPreviousCommit(commit.ID) + selfNot, err := commit.HasPreviousCommit(t.Context(), commit.ID) assert.NoError(t, err) assert.False(t, selfNot) } @@ -342,14 +342,14 @@ func TestGetCommitFileStatusMerges(t *testing.T) { func Test_GetCommitBranchStart(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetBranchCommit("branch1") + commit, err := repo.GetBranchCommit(t.Context(), "branch1") assert.NoError(t, err) assert.Equal(t, "2839944139e0de9737a044f78b0e4b40d989a9e3", commit.ID.String()) - startCommitID, err := repo.GetCommitBranchStart(os.Environ(), "branch1", commit.ID.String()) + startCommitID, err := repo.GetCommitBranchStart(t.Context(), os.Environ(), "branch1", commit.ID.String()) assert.NoError(t, err) assert.NotEmpty(t, startCommitID) assert.Equal(t, "95bb4d39648ee7e325106df01a621c530863a653", startCommitID) diff --git a/modules/git/diff.go b/modules/git/diff.go index 437b26eb05158..ffb2fded0f262 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -28,8 +28,8 @@ const ( ) // GetRawDiff dumps diff results of repository in given commit ID to io.Writer. -func GetRawDiff(repo *Repository, commitID string, diffType RawDiffType, writer io.Writer) error { - return GetRepoRawDiffForFile(repo, "", commitID, diffType, "", writer) +func GetRawDiff(ctx context.Context, repo *Repository, commitID string, diffType RawDiffType, writer io.Writer) error { + return GetRepoRawDiffForFile(ctx, repo, "", commitID, diffType, "", writer) } // GetReverseRawDiff dumps the reverse diff results of repository in given commit ID to io.Writer. @@ -47,8 +47,8 @@ func GetReverseRawDiff(ctx context.Context, repoPath, commitID string, writer io } // GetRepoRawDiffForFile dumps diff results of file in given commit ID to io.Writer according given repository -func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diffType RawDiffType, file string, writer io.Writer) error { - commit, err := repo.GetCommit(endCommit) +func GetRepoRawDiffForFile(ctx context.Context, repo *Repository, startCommit, endCommit string, diffType RawDiffType, file string, writer io.Writer) error { + commit, err := repo.GetCommit(ctx, endCommit) if err != nil { return err } @@ -65,7 +65,7 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff } else if commit.ParentCount() == 0 { cmd.AddArguments("show").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, err := commit.Parent(0) + c, err := commit.Parent(ctx, 0) if err != nil { return err } @@ -78,7 +78,7 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff } else if commit.ParentCount() == 0 { cmd.AddArguments("format-patch", "--no-signature", "--stdout", "--root").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, err := commit.Parent(0) + c, err := commit.Parent(ctx, 0) if err != nil { return err } @@ -93,7 +93,7 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff if err = cmd.WithDir(repo.Path). WithStdout(writer). WithStderr(stderr). - Run(repo.Ctx); err != nil { + Run(ctx); err != nil { return fmt.Errorf("Run: %w - %s", err, stderr) } return nil @@ -288,9 +288,9 @@ func CutDiffAroundLine(originalDiff io.Reader, line int64, old bool, numbersOfLi } // GetAffectedFiles returns the affected files between two commits -func GetAffectedFiles(repo *Repository, branchName, oldCommitID, newCommitID string, env []string) ([]string, error) { +func GetAffectedFiles(ctx context.Context, repo *Repository, branchName, oldCommitID, newCommitID string, env []string) ([]string, error) { if oldCommitID == emptySha1ObjectID.String() || oldCommitID == emptySha256ObjectID.String() { - startCommitID, err := repo.GetCommitBranchStart(env, branchName, newCommitID) + startCommitID, err := repo.GetCommitBranchStart(ctx, env, branchName, newCommitID) if err != nil { return nil, err } @@ -334,7 +334,7 @@ func GetAffectedFiles(repo *Repository, branchName, oldCommitID, newCommitID str } return scanner.Err() }). - Run(repo.Ctx) + Run(ctx) if err != nil { log.Error("Unable to get affected files for commits from %s to %s in %s: %v", oldCommitID, newCommitID, repo.Path, err) } diff --git a/modules/git/grep_test.go b/modules/git/grep_test.go index b87ac4bea73a8..d78a0acf04e3c 100644 --- a/modules/git/grep_test.go +++ b/modules/git/grep_test.go @@ -11,7 +11,7 @@ import ( ) func TestGrepSearch(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "language_stats_repo")) + repo, err := OpenRepository(filepath.Join(testReposDir, "language_stats_repo")) assert.NoError(t, err) defer repo.Close() diff --git a/modules/git/languagestats/language_stats_nogogit.go b/modules/git/languagestats/language_stats_nogogit.go index 94cf9fff8c129..a8ae726a59b56 100644 --- a/modules/git/languagestats/language_stats_nogogit.go +++ b/modules/git/languagestats/language_stats_nogogit.go @@ -7,6 +7,7 @@ package languagestats import ( "bytes" + "context" "io" "code.gitea.io/gitea/modules/analyze" @@ -19,10 +20,10 @@ import ( ) // GetLanguageStats calculates language stats for git repository at specified commit -func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, error) { +func GetLanguageStats(ctx context.Context, repo *git.Repository, commitID string) (map[string]int64, error) { // We will feed the commit IDs in order into cat-file --batch, followed by blobs as necessary. // so let's create a batch stdin and stdout - batchStdinWriter, batchReader, cancel, err := repo.CatFileBatch(repo.Ctx) + batchStdinWriter, batchReader, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -59,12 +60,12 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, tree := commit.Tree - entries, err := tree.ListEntriesRecursiveWithSize() + entries, err := tree.ListEntriesRecursiveWithSize(ctx) if err != nil { return nil, err } - checker, err := attribute.NewBatchChecker(repo, commitID, attribute.LinguistAttributes) + checker, err := attribute.NewBatchChecker(ctx, repo, commitID, attribute.LinguistAttributes) if err != nil { return nil, err } @@ -84,15 +85,15 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, for _, f := range entries { select { - case <-repo.Ctx.Done(): - return sizes, repo.Ctx.Err() + case <-ctx.Done(): + return sizes, ctx.Err() default: } contentBuf.Reset() content = contentBuf.Bytes() - if f.Size() == 0 { + if f.Size(ctx) == 0 { continue } @@ -100,7 +101,7 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, isDocumentation := optional.None[bool]() isDetectable := optional.None[bool]() - attrs, err := checker.CheckPath(f.Name()) + attrs, err := checker.CheckPath(ctx, f.Name()) attrLinguistGenerated := optional.None[bool]() if err == nil { if isVendored = attrs.GetVendored(); isVendored.ValueOrDefault(false) { @@ -129,7 +130,7 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, } // this language will always be added to the size - sizes[language] += f.Size() + sizes[language] += f.Size(ctx) continue } } @@ -143,7 +144,7 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, // If content can not be read or file is too big just do detection by filename - if f.Size() <= bigFileSize { + if f.Size(ctx) <= bigFileSize { if err := writeID(f.ID.String()); err != nil { return nil, err } @@ -201,10 +202,10 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64, includedLanguage[language] = included } if included || isDetectable.ValueOrDefault(false) { - sizes[language] += f.Size() + sizes[language] += f.Size(ctx) } else if len(sizes) == 0 && (firstExcludedLanguage == "" || firstExcludedLanguage == language) { firstExcludedLanguage = language - firstExcludedLanguageSize += f.Size() + firstExcludedLanguageSize += f.Size(ctx) } } diff --git a/modules/git/languagestats/language_stats_test.go b/modules/git/languagestats/language_stats_test.go index b908ae6413d72..42fc43100b9fe 100644 --- a/modules/git/languagestats/language_stats_test.go +++ b/modules/git/languagestats/language_stats_test.go @@ -18,11 +18,11 @@ import ( func TestRepository_GetLanguageStats(t *testing.T) { setting.AppDataPath = t.TempDir() repoPath := "../tests/repos/language_stats_repo" - gitRepo, err := git.OpenRepository(t.Context(), repoPath) + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() - stats, err := GetLanguageStats(gitRepo, "8fee858da5796dfb37704761701bb8e800ad9ef3") + stats, err := GetLanguageStats(t.Context(), gitRepo, "8fee858da5796dfb37704761701bb8e800ad9ef3") require.NoError(t, err) assert.Equal(t, map[string]int64{ diff --git a/modules/git/last_commit_cache.go b/modules/git/last_commit_cache.go index cff2556083d74..1432ef65086fb 100644 --- a/modules/git/last_commit_cache.go +++ b/modules/git/last_commit_cache.go @@ -4,6 +4,7 @@ package git import ( + "context" "crypto/sha256" "fmt" @@ -53,7 +54,7 @@ func (c *LastCommitCache) Put(ref, entryPath, commitID string) error { } // Get gets the last commit information by commit id and entry path -func (c *LastCommitCache) Get(ref, entryPath string) (*Commit, error) { +func (c *LastCommitCache) Get(ctx context.Context, ref, entryPath string) (*Commit, error) { if c == nil || c.cache == nil { return nil, nil } @@ -71,7 +72,7 @@ func (c *LastCommitCache) Get(ref, entryPath string) (*Commit, error) { } } - commit, err := c.repo.GetCommit(commitID) + commit, err := c.repo.GetCommit(ctx, commitID) if err != nil { return nil, err } @@ -83,18 +84,18 @@ func (c *LastCommitCache) Get(ref, entryPath string) (*Commit, error) { } // GetCommitByPath gets the last commit for the entry in the provided commit -func (c *LastCommitCache) GetCommitByPath(commitID, entryPath string) (*Commit, error) { +func (c *LastCommitCache) GetCommitByPath(ctx context.Context, commitID, entryPath string) (*Commit, error) { sha, err := NewIDFromString(commitID) if err != nil { return nil, err } - lastCommit, err := c.Get(sha.String(), entryPath) + lastCommit, err := c.Get(ctx, sha.String(), entryPath) if err != nil || lastCommit != nil { return lastCommit, err } - lastCommit, err = c.repo.getCommitByPathWithID(sha, entryPath) + lastCommit, err = c.repo.getCommitByPathWithID(ctx, sha, entryPath) if err != nil { return nil, err } diff --git a/modules/git/last_commit_cache_nogogit.go b/modules/git/last_commit_cache_nogogit.go index 155cb3cb7c85c..2f73e1a04d6f1 100644 --- a/modules/git/last_commit_cache_nogogit.go +++ b/modules/git/last_commit_cache_nogogit.go @@ -22,7 +22,7 @@ func (c *Commit) recursiveCache(ctx context.Context, tree *Tree, treePath string return nil } - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { return err } @@ -40,7 +40,7 @@ func (c *Commit) recursiveCache(ctx context.Context, tree *Tree, treePath string for _, treeEntry := range entries { // entryMap won't contain "" therefore skip this. if treeEntry.IsDir() { - subTree, err := tree.SubTree(treeEntry.Name()) + subTree, err := tree.SubTree(ctx, treeEntry.Name()) if err != nil { return err } diff --git a/modules/git/log_name_status.go b/modules/git/log_name_status.go index 72e513000b396..794dc0ea9d269 100644 --- a/modules/git/log_name_status.go +++ b/modules/git/log_name_status.go @@ -298,12 +298,12 @@ func (g *LogNameStatusRepoParser) Close() { func WalkGitLog(ctx context.Context, repo *Repository, head *Commit, treepath string, paths ...string) (map[string]string, error) { headRef := head.ID.String() - tree, err := head.SubTree(treepath) + tree, err := head.SubTree(ctx, treepath) if err != nil { return nil, err } - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { return nil, err } diff --git a/modules/git/notes_nogogit.go b/modules/git/notes_nogogit.go index 4da375c3211a3..4bffa617dc214 100644 --- a/modules/git/notes_nogogit.go +++ b/modules/git/notes_nogogit.go @@ -17,7 +17,7 @@ import ( // FIXME: Add LastCommitCache support func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) error { log.Trace("Searching for git note corresponding to the commit %q in the repository %q", commitID, repo.Path) - notes, err := repo.GetCommit(NotesRef) + notes, err := repo.GetCommit(ctx, NotesRef) if err != nil { if IsErrNotExist(err) { return err @@ -34,13 +34,13 @@ func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) var entry *TreeEntry originalCommitID := commitID for len(commitID) > 2 { - entry, err = tree.GetTreeEntryByPath(commitID) + entry, err = tree.GetTreeEntryByPath(ctx, commitID) if err == nil { path += commitID break } if IsErrNotExist(err) { - tree, err = tree.SubTree(commitID[0:2]) + tree, err = tree.SubTree(ctx, commitID[0:2]) path += commitID[0:2] + "/" commitID = commitID[2:] } @@ -54,7 +54,7 @@ func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) } blob := entry.Blob() - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { log.Error("Unable to read blob with ID %q. Error: %v", blob.ID, err) return err diff --git a/modules/git/notes_test.go b/modules/git/notes_test.go index 7db2dbc0b9e3b..e464f5b3d75c9 100644 --- a/modules/git/notes_test.go +++ b/modules/git/notes_test.go @@ -12,7 +12,7 @@ import ( func TestGetNotes(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() @@ -25,7 +25,7 @@ func TestGetNotes(t *testing.T) { func TestGetNestedNotes(t *testing.T) { repoPath := filepath.Join(testReposDir, "repo3_notes") - repo, err := OpenRepository(t.Context(), repoPath) + repo, err := OpenRepository(repoPath) assert.NoError(t, err) defer repo.Close() @@ -40,7 +40,7 @@ func TestGetNestedNotes(t *testing.T) { func TestGetNonExistentNotes(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() diff --git a/modules/git/pipeline/lfs_nogogit.go b/modules/git/pipeline/lfs_nogogit.go index 4881a2be64870..7d02308a4b67a 100644 --- a/modules/git/pipeline/lfs_nogogit.go +++ b/modules/git/pipeline/lfs_nogogit.go @@ -8,6 +8,7 @@ package pipeline import ( "bufio" "bytes" + "context" "io" "sort" "strings" @@ -18,7 +19,7 @@ import ( ) // FindLFSFile finds commits that contain a provided pointer file hash -func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { +func FindLFSFile(ctx context.Context, repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { resultsMap := map[string]*LFSResult{} results := make([]*LFSResult, 0) @@ -37,7 +38,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err WithDir(repo.Path). WithStdout(revListWriter). WithStderr(&stderr). - Run(repo.Ctx) + Run(ctx) if err != nil { _ = revListWriter.CloseWithError(gitcmd.ConcatenateError(err, (&stderr).String())) } else { @@ -47,7 +48,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err // Next feed the commits in order into cat-file --batch, followed by their trees and sub trees as necessary. // so let's create a batch stdin and stdout - batchStdinWriter, batchReader, cancel, err := repo.CatFileBatch(repo.Ctx) + batchStdinWriter, batchReader, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -202,7 +203,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err i++ } }() - go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath) + go NameRevStdin(ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath) go func() { defer wg.Done() defer shasToNameWriter.Close() diff --git a/modules/git/ref.go b/modules/git/ref.go index 56b2db858ad63..db69395b869af 100644 --- a/modules/git/ref.go +++ b/modules/git/ref.go @@ -4,6 +4,7 @@ package git import ( + "context" "regexp" "strings" @@ -49,8 +50,8 @@ type Reference struct { } // Commit return the commit of the reference -func (ref *Reference) Commit() (*Commit, error) { - return ref.repo.getCommit(ref.Object) +func (ref *Reference) Commit(ctx context.Context) (*Commit, error) { + return ref.repo.getCommit(ctx, ref.Object) } // ShortName returns the short name of the reference diff --git a/modules/git/repo.go b/modules/git/repo.go index 29e70d94c86f6..5a50725da8afe 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -33,8 +33,8 @@ type GPGSettings struct { const prettyLogFormat = `--pretty=format:%H` // GetAllCommitsCount returns count of all commits in repository -func (repo *Repository) GetAllCommitsCount() (int64, error) { - return AllCommitsCount(repo.Ctx, repo.Path, false) +func (repo *Repository) GetAllCommitsCount(ctx context.Context) (int64, error) { + return AllCommitsCount(ctx, repo.Path, false) } func (repo *Repository) ShowPrettyFormatLogToList(ctx context.Context, revisionRange string) ([]*Commit, error) { @@ -45,10 +45,10 @@ func (repo *Repository) ShowPrettyFormatLogToList(ctx context.Context, revisionR if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(logs) + return repo.parsePrettyFormatLogToList(ctx, logs) } -func (repo *Repository) parsePrettyFormatLogToList(logs []byte) ([]*Commit, error) { +func (repo *Repository) parsePrettyFormatLogToList(ctx context.Context, logs []byte) ([]*Commit, error) { var commits []*Commit if len(logs) == 0 { return commits, nil @@ -57,7 +57,7 @@ func (repo *Repository) parsePrettyFormatLogToList(logs []byte) ([]*Commit, erro parts := bytes.SplitSeq(logs, []byte{'\n'}) for commitID := range parts { - commit, err := repo.GetCommit(string(commitID)) + commit, err := repo.GetCommit(ctx, string(commitID)) if err != nil { return nil, err } @@ -97,7 +97,7 @@ func InitRepository(ctx context.Context, repoPath string, bare bool, objectForma } // IsEmpty Check if repository is empty. -func (repo *Repository) IsEmpty() (bool, error) { +func (repo *Repository) IsEmpty(ctx context.Context) (bool, error) { var errbuf, output strings.Builder if err := gitcmd.NewCommand(). AddOptionFormat("--git-dir=%s", repo.Path). @@ -105,7 +105,7 @@ func (repo *Repository) IsEmpty() (bool, error) { WithDir(repo.Path). WithStdout(&output). WithStderr(&errbuf). - Run(repo.Ctx); err != nil { + Run(ctx); err != nil { if (err.Error() == "exit status 1" && strings.TrimSpace(errbuf.String()) == "") || err.Error() == "exit status 129" { // git 2.11 exits with 129 if the repo is empty return true, nil diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index 4091e70846529..4919843d9e67b 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -31,14 +31,13 @@ type Repository struct { checkInUse bool check *Batch - Ctx context.Context LastCommitCache *LastCommitCache objectFormat ObjectFormat } // OpenRepository opens the repository at the given path with the provided context. -func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { +func OpenRepository(repoPath string) (*Repository, error) { repoPath, err := filepath.Abs(repoPath) if err != nil { return nil, err @@ -54,7 +53,6 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { return &Repository{ Path: repoPath, tagCache: newObjectCache[*Tag](), - Ctx: ctx, }, nil } diff --git a/modules/git/repo_blob_test.go b/modules/git/repo_blob_test.go index f07b31d236fa3..4af3de7143693 100644 --- a/modules/git/repo_blob_test.go +++ b/modules/git/repo_blob_test.go @@ -14,7 +14,7 @@ import ( func TestRepository_GetBlob_Found(t *testing.T) { repoPath := filepath.Join(testReposDir, "repo1_bare") - r, err := OpenRepository(t.Context(), repoPath) + r, err := OpenRepository(repoPath) assert.NoError(t, err) defer r.Close() @@ -30,7 +30,7 @@ func TestRepository_GetBlob_Found(t *testing.T) { blob, err := r.GetBlob(testCase.OID) assert.NoError(t, err) - dataReader, err := blob.DataAsync() + dataReader, err := blob.DataAsync(t.Context()) assert.NoError(t, err) data, err := io.ReadAll(dataReader) @@ -42,7 +42,7 @@ func TestRepository_GetBlob_Found(t *testing.T) { func TestRepository_GetBlob_NotExist(t *testing.T) { repoPath := filepath.Join(testReposDir, "repo1_bare") - r, err := OpenRepository(t.Context(), repoPath) + r, err := OpenRepository(repoPath) assert.NoError(t, err) defer r.Close() @@ -56,7 +56,7 @@ func TestRepository_GetBlob_NotExist(t *testing.T) { func TestRepository_GetBlob_NoId(t *testing.T) { repoPath := filepath.Join(testReposDir, "repo1_bare") - r, err := OpenRepository(t.Context(), repoPath) + r, err := OpenRepository(repoPath) assert.NoError(t, err) defer r.Close() diff --git a/modules/git/repo_branch.go b/modules/git/repo_branch.go index 1eebc72158bb6..2c0d6c310dcdf 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -5,6 +5,8 @@ package git import ( + "context" + "code.gitea.io/gitea/modules/git/gitcmd" ) @@ -12,13 +14,13 @@ import ( const BranchPrefix = "refs/heads/" // AddRemote adds a new remote to repository. -func (repo *Repository) AddRemote(name, url string, fetch bool) error { +func (repo *Repository) AddRemote(ctx context.Context, name, url string, fetch bool) error { cmd := gitcmd.NewCommand("remote", "add") if fetch { cmd.AddArguments("-f") } _, _, err := cmd.AddDynamicArguments(name, url). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) return err } diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index f1b26b06ab610..a3fd79f0a5aaa 100644 --- a/modules/git/repo_branch_nogogit.go +++ b/modules/git/repo_branch_nogogit.go @@ -18,12 +18,12 @@ import ( ) // IsObjectExist returns true if the given object exists in the repository. -func (repo *Repository) IsObjectExist(name string) bool { +func (repo *Repository) IsObjectExist(ctx context.Context, name string) bool { if name == "" { return false } - wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) + wr, rd, cancel, err := repo.CatFileBatchCheck(ctx) if err != nil { log.Debug("Error writing to CatFileBatchCheck %v", err) return false @@ -39,12 +39,12 @@ func (repo *Repository) IsObjectExist(name string) bool { } // IsReferenceExist returns true if given reference exists in the repository. -func (repo *Repository) IsReferenceExist(name string) bool { +func (repo *Repository) IsReferenceExist(ctx context.Context, name string) bool { if name == "" { return false } - wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) + wr, rd, cancel, err := repo.CatFileBatchCheck(ctx) if err != nil { log.Debug("Error writing to CatFileBatchCheck %v", err) return false @@ -60,23 +60,23 @@ func (repo *Repository) IsReferenceExist(name string) bool { } // IsBranchExist returns true if given branch exists in current repository. -func (repo *Repository) IsBranchExist(name string) bool { +func (repo *Repository) IsBranchExist(ctx context.Context, name string) bool { if repo == nil || name == "" { return false } - return repo.IsReferenceExist(BranchPrefix + name) + return repo.IsReferenceExist(ctx, BranchPrefix+name) } // GetBranchNames returns branches from the repository, skipping "skip" initial branches and // returning at most "limit" branches, or all branches if "limit" is 0. -func (repo *Repository) GetBranchNames(skip, limit int) ([]string, int, error) { - return callShowRef(repo.Ctx, repo.Path, BranchPrefix, gitcmd.TrustedCmdArgs{BranchPrefix, "--sort=-committerdate"}, skip, limit) +func (repo *Repository) GetBranchNames(ctx context.Context, skip, limit int) ([]string, int, error) { + return callShowRef(ctx, repo.Path, BranchPrefix, gitcmd.TrustedCmdArgs{BranchPrefix, "--sort=-committerdate"}, skip, limit) } // WalkReferences walks all the references from the repository // refType should be empty, ObjectTag or ObjectBranch. All other values are equivalent to empty. -func (repo *Repository) WalkReferences(refType ObjectType, skip, limit int, walkfn func(sha1, refname string) error) (int, error) { +func (repo *Repository) WalkReferences(ctx context.Context, refType ObjectType, skip, limit int, walkfn func(sha1, refname string) error) (int, error) { var args gitcmd.TrustedCmdArgs switch refType { case ObjectTag: @@ -85,7 +85,7 @@ func (repo *Repository) WalkReferences(refType ObjectType, skip, limit int, walk args = gitcmd.TrustedCmdArgs{BranchPrefix, "--sort=-committerdate"} } - return WalkShowRef(repo.Ctx, repo.Path, args, skip, limit, walkfn) + return WalkShowRef(ctx, repo.Path, args, skip, limit, walkfn) } // callShowRef return refs, if limit = 0 it will not limit @@ -191,9 +191,9 @@ func WalkShowRef(ctx context.Context, repoPath string, extraArgs gitcmd.TrustedC } // GetRefsBySha returns all references filtered with prefix that belong to a sha commit hash -func (repo *Repository) GetRefsBySha(sha, prefix string) ([]string, error) { +func (repo *Repository) GetRefsBySha(ctx context.Context, sha, prefix string) ([]string, error) { var revList []string - _, err := WalkShowRef(repo.Ctx, repo.Path, nil, 0, 0, func(walkSha, refname string) error { + _, err := WalkShowRef(ctx, repo.Path, nil, 0, 0, func(walkSha, refname string) error { if walkSha == sha && strings.HasPrefix(refname, prefix) { revList = append(revList, refname) } diff --git a/modules/git/repo_branch_test.go b/modules/git/repo_branch_test.go index 5d586954db76e..c848a9a01da2e 100644 --- a/modules/git/repo_branch_test.go +++ b/modules/git/repo_branch_test.go @@ -13,25 +13,25 @@ import ( func TestRepository_GetBranches(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() - branches, countAll, err := bareRepo1.GetBranchNames(0, 2) + branches, countAll, err := bareRepo1.GetBranchNames(t.Context(), 0, 2) assert.NoError(t, err) assert.Len(t, branches, 2) assert.Equal(t, 3, countAll) assert.ElementsMatch(t, []string{"master", "branch2"}, branches) - branches, countAll, err = bareRepo1.GetBranchNames(0, 0) + branches, countAll, err = bareRepo1.GetBranchNames(t.Context(), 0, 0) assert.NoError(t, err) assert.Len(t, branches, 3) assert.Equal(t, 3, countAll) assert.ElementsMatch(t, []string{"master", "branch2", "branch1"}, branches) - branches, countAll, err = bareRepo1.GetBranchNames(5, 1) + branches, countAll, err = bareRepo1.GetBranchNames(t.Context(), 5, 1) assert.NoError(t, err) assert.Empty(t, branches) @@ -41,14 +41,14 @@ func TestRepository_GetBranches(t *testing.T) { func BenchmarkRepository_GetBranches(b *testing.B) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(b.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) if err != nil { b.Fatal(err) } defer bareRepo1.Close() for b.Loop() { - _, _, err := bareRepo1.GetBranchNames(0, 0) + _, _, err := bareRepo1.GetBranchNames(b.Context(), 0, 0) if err != nil { b.Fatal(err) } @@ -57,47 +57,47 @@ func BenchmarkRepository_GetBranches(b *testing.B) { func TestGetRefsBySha(t *testing.T) { bareRepo5Path := filepath.Join(testReposDir, "repo5_pulls") - bareRepo5, err := OpenRepository(t.Context(), bareRepo5Path) + bareRepo5, err := OpenRepository(bareRepo5Path) if err != nil { t.Fatal(err) } defer bareRepo5.Close() // do not exist - branches, err := bareRepo5.GetRefsBySha("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", "") + branches, err := bareRepo5.GetRefsBySha(t.Context(), "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", "") assert.NoError(t, err) assert.Empty(t, branches) // refs/pull/1/head - branches, err = bareRepo5.GetRefsBySha("c83380d7056593c51a699d12b9c00627bd5743e9", PullPrefix) + branches, err = bareRepo5.GetRefsBySha(t.Context(), "c83380d7056593c51a699d12b9c00627bd5743e9", PullPrefix) assert.NoError(t, err) assert.Equal(t, []string{"refs/pull/1/head"}, branches) - branches, err = bareRepo5.GetRefsBySha("d8e0bbb45f200e67d9a784ce55bd90821af45ebd", BranchPrefix) + branches, err = bareRepo5.GetRefsBySha(t.Context(), "d8e0bbb45f200e67d9a784ce55bd90821af45ebd", BranchPrefix) assert.NoError(t, err) assert.Equal(t, []string{"refs/heads/master", "refs/heads/master-clone"}, branches) - branches, err = bareRepo5.GetRefsBySha("58a4bcc53ac13e7ff76127e0fb518b5262bf09af", BranchPrefix) + branches, err = bareRepo5.GetRefsBySha(t.Context(), "58a4bcc53ac13e7ff76127e0fb518b5262bf09af", BranchPrefix) assert.NoError(t, err) assert.Equal(t, []string{"refs/heads/test-patch-1"}, branches) } func BenchmarkGetRefsBySha(b *testing.B) { bareRepo5Path := filepath.Join(testReposDir, "repo5_pulls") - bareRepo5, err := OpenRepository(b.Context(), bareRepo5Path) + bareRepo5, err := OpenRepository(bareRepo5Path) if err != nil { b.Fatal(err) } defer bareRepo5.Close() - _, _ = bareRepo5.GetRefsBySha("8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", "") - _, _ = bareRepo5.GetRefsBySha("d8e0bbb45f200e67d9a784ce55bd90821af45ebd", "") - _, _ = bareRepo5.GetRefsBySha("c83380d7056593c51a699d12b9c00627bd5743e9", "") - _, _ = bareRepo5.GetRefsBySha("58a4bcc53ac13e7ff76127e0fb518b5262bf09af", "") + _, _ = bareRepo5.GetRefsBySha(b.Context(), "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0", "") + _, _ = bareRepo5.GetRefsBySha(b.Context(), "d8e0bbb45f200e67d9a784ce55bd90821af45ebd", "") + _, _ = bareRepo5.GetRefsBySha(b.Context(), "c83380d7056593c51a699d12b9c00627bd5743e9", "") + _, _ = bareRepo5.GetRefsBySha(b.Context(), "58a4bcc53ac13e7ff76127e0fb518b5262bf09af", "") } func TestRepository_IsObjectExist(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + repo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) require.NoError(t, err) defer repo.Close() @@ -143,13 +143,13 @@ func TestRepository_IsObjectExist(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert.Equal(t, tt.want, repo.IsObjectExist(tt.arg)) + assert.Equal(t, tt.want, repo.IsObjectExist(t.Context(), tt.arg)) }) } } func TestRepository_IsReferenceExist(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + repo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) require.NoError(t, err) defer repo.Close() @@ -195,7 +195,7 @@ func TestRepository_IsReferenceExist(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - assert.Equal(t, tt.want, repo.IsReferenceExist(tt.arg)) + assert.Equal(t, tt.want, repo.IsReferenceExist(t.Context(), tt.arg)) }) } } diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index 5f4487ce7e24b..f7a8ca34fdd70 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "io" "os" "strconv" @@ -17,44 +18,44 @@ import ( ) // GetBranchCommitID returns last commit ID string of given branch. -func (repo *Repository) GetBranchCommitID(name string) (string, error) { - return repo.GetRefCommitID(BranchPrefix + name) +func (repo *Repository) GetBranchCommitID(ctx context.Context, name string) (string, error) { + return repo.GetRefCommitID(ctx, BranchPrefix+name) } // GetTagCommitID returns last commit ID string of given tag. -func (repo *Repository) GetTagCommitID(name string) (string, error) { - return repo.GetRefCommitID(TagPrefix + name) +func (repo *Repository) GetTagCommitID(ctx context.Context, name string) (string, error) { + return repo.GetRefCommitID(ctx, TagPrefix+name) } // GetCommit returns commit object of by ID string. -func (repo *Repository) GetCommit(commitID string) (*Commit, error) { - id, err := repo.ConvertToGitID(commitID) +func (repo *Repository) GetCommit(ctx context.Context, commitID string) (*Commit, error) { + id, err := repo.ConvertToGitID(ctx, commitID) if err != nil { return nil, err } - return repo.getCommit(id) + return repo.getCommit(ctx, id) } // GetBranchCommit returns the last commit of given branch. -func (repo *Repository) GetBranchCommit(name string) (*Commit, error) { - commitID, err := repo.GetBranchCommitID(name) +func (repo *Repository) GetBranchCommit(ctx context.Context, name string) (*Commit, error) { + commitID, err := repo.GetBranchCommitID(ctx, name) if err != nil { return nil, err } - return repo.GetCommit(commitID) + return repo.GetCommit(ctx, commitID) } // GetTagCommit get the commit of the specific tag via name -func (repo *Repository) GetTagCommit(name string) (*Commit, error) { - commitID, err := repo.GetTagCommitID(name) +func (repo *Repository) GetTagCommit(ctx context.Context, name string) (*Commit, error) { + commitID, err := repo.GetTagCommitID(ctx, name) if err != nil { return nil, err } - return repo.GetCommit(commitID) + return repo.GetCommit(ctx, commitID) } -func (repo *Repository) getCommitByPathWithID(id ObjectID, relpath string) (*Commit, error) { +func (repo *Repository) getCommitByPathWithID(ctx context.Context, id ObjectID, relpath string) (*Commit, error) { // File name starts with ':' must be escaped. if relpath[0] == ':' { relpath = `\` + relpath @@ -64,7 +65,7 @@ func (repo *Repository) getCommitByPathWithID(id ObjectID, relpath string) (*Com AddDynamicArguments(id.String()). AddDashesAndList(relpath). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if runErr != nil { return nil, runErr } @@ -74,20 +75,20 @@ func (repo *Repository) getCommitByPathWithID(id ObjectID, relpath string) (*Com return nil, err } - return repo.getCommit(id) + return repo.getCommit(ctx, id) } // GetCommitByPath returns the last commit of relative path. -func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) { +func (repo *Repository) GetCommitByPath(ctx context.Context, relpath string) (*Commit, error) { stdout, _, runErr := gitcmd.NewCommand("log", "-1", prettyLogFormat). AddDashesAndList(relpath). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if runErr != nil { return nil, runErr } - commits, err := repo.parsePrettyFormatLogToList(stdout) + commits, err := repo.parsePrettyFormatLogToList(ctx, stdout) if err != nil { return nil, err } @@ -98,7 +99,7 @@ func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) { } // commitsByRangeWithTime returns the specific page commits before current revision, with not, since, until support -func (repo *Repository) commitsByRangeWithTime(id ObjectID, page, pageSize int, not, since, until string) ([]*Commit, error) { +func (repo *Repository) commitsByRangeWithTime(ctx context.Context, id ObjectID, page, pageSize int, not, since, until string) ([]*Commit, error) { cmd := gitcmd.NewCommand("log"). AddOptionFormat("--skip=%d", (page-1)*pageSize). AddOptionFormat("--max-count=%d", pageSize). @@ -115,15 +116,15 @@ func (repo *Repository) commitsByRangeWithTime(id ObjectID, page, pageSize int, cmd.AddOptionFormat("--until=%s", until) } - stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(stdout) + return repo.parsePrettyFormatLogToList(ctx, stdout) } -func (repo *Repository) searchCommits(id ObjectID, opts SearchCommitsOptions) ([]*Commit, error) { +func (repo *Repository) searchCommits(ctx context.Context, id ObjectID, opts SearchCommitsOptions) ([]*Commit, error) { // add common arguments to git command addCommonSearchArgs := func(c *gitcmd.Command) { // ignore case @@ -169,7 +170,7 @@ func (repo *Repository) searchCommits(id ObjectID, opts SearchCommitsOptions) ([ // search for commits matching given constraints and keywords in commit msg addCommonSearchArgs(cmd) - stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + stdout, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) if err != nil { return nil, err } @@ -190,7 +191,7 @@ func (repo *Repository) searchCommits(id ObjectID, opts SearchCommitsOptions) ([ hashCmd.AddDynamicArguments(v) // search with given constraints for commit matching sha hash of v - hashMatching, _, err := hashCmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + hashMatching, _, err := hashCmd.WithDir(repo.Path).RunStdBytes(ctx) if err != nil || bytes.Contains(stdout, hashMatching) { continue } @@ -199,17 +200,17 @@ func (repo *Repository) searchCommits(id ObjectID, opts SearchCommitsOptions) ([ } } - return repo.parsePrettyFormatLogToList(bytes.TrimSuffix(stdout, []byte{'\n'})) + return repo.parsePrettyFormatLogToList(ctx, bytes.TrimSuffix(stdout, []byte{'\n'})) } // FileChangedBetweenCommits Returns true if the file changed between commit IDs id1 and id2 // You must ensure that id1 and id2 are valid commit ids. -func (repo *Repository) FileChangedBetweenCommits(filename, id1, id2 string) (bool, error) { +func (repo *Repository) FileChangedBetweenCommits(ctx context.Context, filename, id1, id2 string) (bool, error) { stdout, _, err := gitcmd.NewCommand("diff", "--name-only", "-z"). AddDynamicArguments(id1, id2). AddDashesAndList(filename). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if err != nil { return false, err } @@ -217,8 +218,8 @@ func (repo *Repository) FileChangedBetweenCommits(filename, id1, id2 string) (bo } // FileCommitsCount return the number of files at a revision -func (repo *Repository) FileCommitsCount(revision, file string) (int64, error) { - return CommitsCount(repo.Ctx, +func (repo *Repository) FileCommitsCount(ctx context.Context, revision, file string) (int64, error) { + return CommitsCount(ctx, CommitsCountOptions{ RepoPath: repo.Path, Revision: []string{revision}, @@ -236,7 +237,7 @@ type CommitsByFileAndRangeOptions struct { } // CommitsByFileAndRange return the commits according revision file and the page -func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) ([]*Commit, error) { +func (repo *Repository) CommitsByFileAndRange(ctx context.Context, opts CommitsByFileAndRangeOptions) ([]*Commit, error) { stdoutReader, stdoutWriter := io.Pipe() defer func() { _ = stdoutReader.Close() @@ -263,7 +264,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) err := gitCmd.WithDir(repo.Path). WithStdout(stdoutWriter). WithStderr(&stderr). - Run(repo.Ctx) + Run(ctx) if err != nil { _ = stdoutWriter.CloseWithError(gitcmd.ConcatenateError(err, (&stderr).String())) } else { @@ -271,7 +272,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) } }() - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -291,7 +292,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) if err != nil { return nil, err } - commit, err := repo.getCommit(objectID) + commit, err := repo.getCommit(ctx, objectID) if err != nil { return nil, err } @@ -300,18 +301,18 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) } // FilesCountBetween return the number of files changed between two commits -func (repo *Repository) FilesCountBetween(startCommitID, endCommitID string) (int, error) { +func (repo *Repository) FilesCountBetween(ctx context.Context, startCommitID, endCommitID string) (int, error) { stdout, _, err := gitcmd.NewCommand("diff", "--name-only"). AddDynamicArguments(startCommitID + "..." + endCommitID). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil && strings.Contains(err.Error(), "no merge base") { // git >= 2.28 now returns an error if startCommitID and endCommitID have become unrelated. // previously it would return the results of git diff --name-only startCommitID endCommitID so let's try that... stdout, _, err = gitcmd.NewCommand("diff", "--name-only"). AddDynamicArguments(startCommitID, endCommitID). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) } if err != nil { return 0, err @@ -321,36 +322,36 @@ func (repo *Repository) FilesCountBetween(startCommitID, endCommitID string) (in // CommitsBetween returns a list that contains commits between [before, last). // If before is detached (removed by reset + push) it is not included. -func (repo *Repository) CommitsBetween(last, before *Commit) ([]*Commit, error) { +func (repo *Repository) CommitsBetween(ctx context.Context, last, before *Commit) ([]*Commit, error) { var stdout []byte var err error if before == nil { stdout, _, err = gitcmd.NewCommand("rev-list"). AddDynamicArguments(last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } else { stdout, _, err = gitcmd.NewCommand("rev-list"). AddDynamicArguments(before.ID.String() + ".." + last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if err != nil && strings.Contains(err.Error(), "no merge base") { // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated. // previously it would return the results of git rev-list before last so let's try that... stdout, _, err = gitcmd.NewCommand("rev-list"). AddDynamicArguments(before.ID.String(), last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } } if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout)) + return repo.parsePrettyFormatLogToList(ctx, bytes.TrimSpace(stdout)) } // CommitsBetweenLimit returns a list that contains at most limit commits skipping the first skip commits between [before, last) -func (repo *Repository) CommitsBetweenLimit(last, before *Commit, limit, skip int) ([]*Commit, error) { +func (repo *Repository) CommitsBetweenLimit(ctx context.Context, last, before *Commit, limit, skip int) ([]*Commit, error) { var stdout []byte var err error if before == nil { @@ -359,14 +360,14 @@ func (repo *Repository) CommitsBetweenLimit(last, before *Commit, limit, skip in AddOptionValues("--skip", strconv.Itoa(skip)). AddDynamicArguments(last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } else { stdout, _, err = gitcmd.NewCommand("rev-list"). AddOptionValues("--max-count", strconv.Itoa(limit)). AddOptionValues("--skip", strconv.Itoa(skip)). AddDynamicArguments(before.ID.String() + ".." + last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if err != nil && strings.Contains(err.Error(), "no merge base") { // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated. // previously it would return the results of git rev-list --max-count n before last so let's try that... @@ -375,18 +376,18 @@ func (repo *Repository) CommitsBetweenLimit(last, before *Commit, limit, skip in AddOptionValues("--skip", strconv.Itoa(skip)). AddDynamicArguments(before.ID.String(), last.ID.String()). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } } if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout)) + return repo.parsePrettyFormatLogToList(ctx, bytes.TrimSpace(stdout)) } // CommitsBetweenNotBase returns a list that contains commits between [before, last), excluding commits in baseBranch. // If before is detached (removed by reset + push) it is not included. -func (repo *Repository) CommitsBetweenNotBase(last, before *Commit, baseBranch string) ([]*Commit, error) { +func (repo *Repository) CommitsBetweenNotBase(ctx context.Context, last, before *Commit, baseBranch string) ([]*Commit, error) { var stdout []byte var err error if before == nil { @@ -394,13 +395,13 @@ func (repo *Repository) CommitsBetweenNotBase(last, before *Commit, baseBranch s AddDynamicArguments(last.ID.String()). AddOptionValues("--not", baseBranch). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } else { stdout, _, err = gitcmd.NewCommand("rev-list"). AddDynamicArguments(before.ID.String()+".."+last.ID.String()). AddOptionValues("--not", baseBranch). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if err != nil && strings.Contains(err.Error(), "no merge base") { // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated. // previously it would return the results of git rev-list before last so let's try that... @@ -408,34 +409,34 @@ func (repo *Repository) CommitsBetweenNotBase(last, before *Commit, baseBranch s AddDynamicArguments(before.ID.String(), last.ID.String()). AddOptionValues("--not", baseBranch). WithDir(repo.Path). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) } } if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout)) + return repo.parsePrettyFormatLogToList(ctx, bytes.TrimSpace(stdout)) } // CommitsBetweenIDs return commits between twoe commits -func (repo *Repository) CommitsBetweenIDs(last, before string) ([]*Commit, error) { - lastCommit, err := repo.GetCommit(last) +func (repo *Repository) CommitsBetweenIDs(ctx context.Context, last, before string) ([]*Commit, error) { + lastCommit, err := repo.GetCommit(ctx, last) if err != nil { return nil, err } if before == "" { - return repo.CommitsBetween(lastCommit, nil) + return repo.CommitsBetween(ctx, lastCommit, nil) } - beforeCommit, err := repo.GetCommit(before) + beforeCommit, err := repo.GetCommit(ctx, before) if err != nil { return nil, err } - return repo.CommitsBetween(lastCommit, beforeCommit) + return repo.CommitsBetween(ctx, lastCommit, beforeCommit) } // CommitsCountBetween return numbers of commits between two commits -func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) { - count, err := CommitsCount(repo.Ctx, CommitsCountOptions{ +func (repo *Repository) CommitsCountBetween(ctx context.Context, start, end string) (int64, error) { + count, err := CommitsCount(ctx, CommitsCountOptions{ RepoPath: repo.Path, Revision: []string{start + ".." + end}, }) @@ -443,7 +444,7 @@ func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) { if err != nil && strings.Contains(err.Error(), "no merge base") { // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated. // previously it would return the results of git rev-list before last so let's try that... - return CommitsCount(repo.Ctx, CommitsCountOptions{ + return CommitsCount(ctx, CommitsCountOptions{ RepoPath: repo.Path, Revision: []string{start, end}, }) @@ -453,26 +454,26 @@ func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) { } // commitsBefore the limit is depth, not total number of returned commits. -func (repo *Repository) commitsBefore(id ObjectID, limit int) ([]*Commit, error) { +func (repo *Repository) commitsBefore(ctx context.Context, id ObjectID, limit int) ([]*Commit, error) { cmd := gitcmd.NewCommand("log", prettyLogFormat) if limit > 0 { cmd.AddOptionFormat("-%d", limit) } cmd.AddDynamicArguments(id.String()) - stdout, _, runErr := cmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + stdout, _, runErr := cmd.WithDir(repo.Path).RunStdBytes(ctx) if runErr != nil { return nil, runErr } - formattedLog, err := repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout)) + formattedLog, err := repo.parsePrettyFormatLogToList(ctx, bytes.TrimSpace(stdout)) if err != nil { return nil, err } commits := make([]*Commit, 0, len(formattedLog)) for _, commit := range formattedLog { - branches, err := repo.getBranches(os.Environ(), commit.ID.String(), 2) + branches, err := repo.getBranches(ctx, os.Environ(), commit.ID.String(), 2) if err != nil { return nil, err } @@ -487,22 +488,22 @@ func (repo *Repository) commitsBefore(id ObjectID, limit int) ([]*Commit, error) return commits, nil } -func (repo *Repository) getCommitsBefore(id ObjectID) ([]*Commit, error) { - return repo.commitsBefore(id, 0) +func (repo *Repository) getCommitsBefore(ctx context.Context, id ObjectID) ([]*Commit, error) { + return repo.commitsBefore(ctx, id, 0) } -func (repo *Repository) getCommitsBeforeLimit(id ObjectID, num int) ([]*Commit, error) { - return repo.commitsBefore(id, num) +func (repo *Repository) getCommitsBeforeLimit(ctx context.Context, id ObjectID, num int) ([]*Commit, error) { + return repo.commitsBefore(ctx, id, num) } -func (repo *Repository) getBranches(env []string, commitID string, limit int) ([]string, error) { +func (repo *Repository) getBranches(ctx context.Context, env []string, commitID string, limit int) ([]string, error) { if DefaultFeatures().CheckVersionAtLeast("2.7.0") { stdout, _, err := gitcmd.NewCommand("for-each-ref", "--format=%(refname:strip=2)"). AddOptionFormat("--count=%d", limit). AddOptionValues("--contains", commitID, BranchPrefix). WithDir(repo.Path). WithEnv(env). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } @@ -515,7 +516,7 @@ func (repo *Repository) getBranches(env []string, commitID string, limit int) ([ AddOptionValues("--contains", commitID). WithDir(repo.Path). WithEnv(env). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } @@ -539,11 +540,11 @@ func (repo *Repository) getBranches(env []string, commitID string, limit int) ([ } // GetCommitsFromIDs get commits from commit IDs -func (repo *Repository) GetCommitsFromIDs(commitIDs []string) []*Commit { +func (repo *Repository) GetCommitsFromIDs(ctx context.Context, commitIDs []string) []*Commit { commits := make([]*Commit, 0, len(commitIDs)) for _, commitID := range commitIDs { - commit, err := repo.GetCommit(commitID) + commit, err := repo.GetCommit(ctx, commitID) if err == nil && commit != nil { commits = append(commits, commit) } @@ -553,25 +554,25 @@ func (repo *Repository) GetCommitsFromIDs(commitIDs []string) []*Commit { } // IsCommitInBranch check if the commit is on the branch -func (repo *Repository) IsCommitInBranch(commitID, branch string) (r bool, err error) { +func (repo *Repository) IsCommitInBranch(ctx context.Context, commitID, branch string) (r bool, err error) { stdout, _, err := gitcmd.NewCommand("branch", "--contains"). AddDynamicArguments(commitID, branch). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return false, err } return len(stdout) > 0, err } -func (repo *Repository) AddLastCommitCache(cacheKey, fullName, sha string) error { +func (repo *Repository) AddLastCommitCache(ctx context.Context, cacheKey, fullName, sha string) error { if repo.LastCommitCache == nil { - commitsCount, err := cache.GetInt64(cacheKey, func() (int64, error) { - commit, err := repo.GetCommit(sha) + commitsCount, err := cache.GetInt64(ctx, cacheKey, func(ctx context.Context) (int64, error) { + commit, err := repo.GetCommit(ctx, sha) if err != nil { return 0, err } - return commit.CommitsCount() + return commit.CommitsCount(ctx) }) if err != nil { return err @@ -582,13 +583,13 @@ func (repo *Repository) AddLastCommitCache(cacheKey, fullName, sha string) error } // GetCommitBranchStart returns the commit where the branch diverged -func (repo *Repository) GetCommitBranchStart(env []string, branch, endCommitID string) (string, error) { +func (repo *Repository) GetCommitBranchStart(ctx context.Context, env []string, branch, endCommitID string) (string, error) { cmd := gitcmd.NewCommand("log", prettyLogFormat) cmd.AddDynamicArguments(endCommitID) stdout, _, runErr := cmd.WithDir(repo.Path). WithEnv(env). - RunStdBytes(repo.Ctx) + RunStdBytes(ctx) if runErr != nil { return "", runErr } @@ -598,7 +599,7 @@ func (repo *Repository) GetCommitBranchStart(env []string, branch, endCommitID s // check the commits one by one until we find a commit contained by another branch // and we think this commit is the divergence point for commitID := range parts { - branches, err := repo.getBranches(env, string(commitID), 2) + branches, err := repo.getBranches(ctx, env, string(commitID), 2) if err != nil { return "", err } diff --git a/modules/git/repo_commit_nogogit.go b/modules/git/repo_commit_nogogit.go index 3f27833fa6c62..497e69d4d5dcd 100644 --- a/modules/git/repo_commit_nogogit.go +++ b/modules/git/repo_commit_nogogit.go @@ -7,6 +7,7 @@ package git import ( "bufio" + "context" "errors" "io" "strings" @@ -16,11 +17,11 @@ import ( ) // ResolveReference resolves a name to a reference -func (repo *Repository) ResolveReference(name string) (string, error) { +func (repo *Repository) ResolveReference(ctx context.Context, name string) (string, error) { stdout, _, err := gitcmd.NewCommand("show-ref", "--hash"). AddDynamicArguments(name). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { if strings.Contains(err.Error(), "not a valid ref") { return "", ErrNotExist{name, ""} @@ -36,8 +37,8 @@ func (repo *Repository) ResolveReference(name string) (string, error) { } // GetRefCommitID returns the last commit ID string of given reference (branch or tag). -func (repo *Repository) GetRefCommitID(name string) (string, error) { - wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) +func (repo *Repository) GetRefCommitID(ctx context.Context, name string) (string, error) { + wr, rd, cancel, err := repo.CatFileBatchCheck(ctx) if err != nil { return "", err } @@ -55,20 +56,20 @@ func (repo *Repository) GetRefCommitID(name string) (string, error) { } // IsCommitExist returns true if given commit exists in current repository. -func (repo *Repository) IsCommitExist(name string) bool { - if err := ensureValidGitRepository(repo.Ctx, repo.Path); err != nil { +func (repo *Repository) IsCommitExist(ctx context.Context, name string) bool { + if err := ensureValidGitRepository(ctx, repo.Path); err != nil { log.Error("IsCommitExist: %v", err) return false } _, _, err := gitcmd.NewCommand("cat-file", "-e"). AddDynamicArguments(name). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) return err == nil } -func (repo *Repository) getCommit(id ObjectID) (*Commit, error) { - wr, rd, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) getCommit(ctx context.Context, id ObjectID) (*Commit, error) { + wr, rd, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -140,8 +141,8 @@ func (repo *Repository) getCommitFromBatchReader(wr WriteCloserError, rd *bufio. } // ConvertToGitID returns a GitHash object from a potential ID string -func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) ConvertToGitID(ctx context.Context, commitID string) (ObjectID, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -152,7 +153,7 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { } } - wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) + wr, rd, cancel, err := repo.CatFileBatchCheck(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_commit_test.go b/modules/git/repo_commit_test.go index 3f7883ab14d6a..e94e872d4dd2c 100644 --- a/modules/git/repo_commit_test.go +++ b/modules/git/repo_commit_test.go @@ -17,7 +17,7 @@ import ( func TestRepository_GetCommitBranches(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() @@ -34,9 +34,9 @@ func TestRepository_GetCommitBranches(t *testing.T) { {"master", []string{"master"}}, } for _, testCase := range testCases { - commit, err := bareRepo1.GetCommit(testCase.CommitID) + commit, err := bareRepo1.GetCommit(t.Context(), testCase.CommitID) assert.NoError(t, err) - branches, err := bareRepo1.getBranches(os.Environ(), commit.ID.String(), 2) + branches, err := bareRepo1.getBranches(t.Context(), os.Environ(), commit.ID.String(), 2) assert.NoError(t, err) assert.Equal(t, testCase.ExpectedBranches, branches) } @@ -44,12 +44,12 @@ func TestRepository_GetCommitBranches(t *testing.T) { func TestGetTagCommitWithSignature(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() // both the tag and the commit are signed here, this validates only the commit signature - commit, err := bareRepo1.GetCommit("28b55526e7100924d864dd89e35c1ea62e7a5a32") + commit, err := bareRepo1.GetCommit(t.Context(), "28b55526e7100924d864dd89e35c1ea62e7a5a32") assert.NoError(t, err) assert.NotNil(t, commit) assert.NotNil(t, commit.Signature) @@ -59,11 +59,11 @@ func TestGetTagCommitWithSignature(t *testing.T) { func TestGetCommitWithBadCommitID(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() - commit, err := bareRepo1.GetCommit("bad_branch") + commit, err := bareRepo1.GetCommit(t.Context(), "bad_branch") assert.Nil(t, commit) assert.Error(t, err) assert.True(t, IsErrNotExist(err)) @@ -71,22 +71,22 @@ func TestGetCommitWithBadCommitID(t *testing.T) { func TestIsCommitInBranch(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() - result, err := bareRepo1.IsCommitInBranch("2839944139e0de9737a044f78b0e4b40d989a9e3", "branch1") + result, err := bareRepo1.IsCommitInBranch(t.Context(), "2839944139e0de9737a044f78b0e4b40d989a9e3", "branch1") assert.NoError(t, err) assert.True(t, result) - result, err = bareRepo1.IsCommitInBranch("2839944139e0de9737a044f78b0e4b40d989a9e3", "branch2") + result, err = bareRepo1.IsCommitInBranch(t.Context(), "2839944139e0de9737a044f78b0e4b40d989a9e3", "branch2") assert.NoError(t, err) assert.False(t, result) } func TestRepository_CommitsBetweenIDs(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo4_commitsbetween") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() @@ -100,7 +100,7 @@ func TestRepository_CommitsBetweenIDs(t *testing.T) { {"78a445db1eac62fe15e624e1137965969addf344", "a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca", 1}, // com2 -> com2_new } for i, c := range cases { - commits, err := bareRepo1.CommitsBetweenIDs(c.NewID, c.OldID) + commits, err := bareRepo1.CommitsBetweenIDs(t.Context(), c.NewID, c.OldID) assert.NoError(t, err) assert.Len(t, commits, c.ExpectedCommits, "case %d", i) } @@ -108,7 +108,7 @@ func TestRepository_CommitsBetweenIDs(t *testing.T) { func TestGetRefCommitID(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() @@ -124,7 +124,7 @@ func TestGetRefCommitID(t *testing.T) { } for _, testCase := range testCases { - commitID, err := bareRepo1.GetRefCommitID(testCase.Ref) + commitID, err := bareRepo1.GetRefCommitID(t.Context(), testCase.Ref) if assert.NoError(t, err) { assert.Equal(t, testCase.ExpectedCommitID, commitID) } @@ -135,16 +135,16 @@ func TestCommitsByFileAndRange(t *testing.T) { defer test.MockVariableValue(&setting.Git.CommitsRangeSize, 2)() bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) require.NoError(t, err) defer bareRepo1.Close() // "foo" has 3 commits in "master" branch - commits, err := bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 1}) + commits, err := bareRepo1.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 1}) require.NoError(t, err) assert.Len(t, commits, 2) - commits, err = bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 2}) + commits, err = bareRepo1.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 2}) require.NoError(t, err) assert.Len(t, commits, 1) } diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index f60696a76378d..54c631e5bc4cf 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -7,6 +7,7 @@ package git import ( "bufio" "bytes" + "context" "errors" "fmt" "io" @@ -19,7 +20,7 @@ import ( ) // GetMergeBase checks and returns merge base of two branches and the reference used as base. -func (repo *Repository) GetMergeBase(tmpRemote, base, head string) (string, string, error) { +func (repo *Repository) GetMergeBase(ctx context.Context, tmpRemote, base, head string) (string, string, error) { if tmpRemote == "" { tmpRemote = "origin" } @@ -31,7 +32,7 @@ func (repo *Repository) GetMergeBase(tmpRemote, base, head string) (string, stri AddDynamicArguments(tmpRemote). AddDashesAndList(base + ":" + tmpBaseName). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err == nil { base = tmpBaseName } @@ -40,7 +41,7 @@ func (repo *Repository) GetMergeBase(tmpRemote, base, head string) (string, stri stdout, _, err := gitcmd.NewCommand("merge-base"). AddDashesAndList(base, head). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) return strings.TrimSpace(stdout), base, err } @@ -57,7 +58,7 @@ func (l *lineCountWriter) Write(p []byte) (n int, err error) { // GetDiffNumChangedFiles counts the number of changed files // This is substantially quicker than shortstat but... -func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparison bool) (int, error) { +func (repo *Repository) GetDiffNumChangedFiles(ctx context.Context, base, head string, directComparison bool) (int, error) { // Now there is git diff --shortstat but this appears to be slower than simply iterating with --nameonly w := &lineCountWriter{} stderr := new(bytes.Buffer) @@ -74,7 +75,7 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis WithDir(repo.Path). WithStdout(w). WithStderr(stderr). - Run(repo.Ctx); err != nil { + Run(ctx); err != nil { if strings.Contains(stderr.String(), "no merge base") { // git >= 2.28 now returns an error if base and head have become unrelated. // previously it would return the results of git diff -z --name-only base head so let's try that... @@ -86,7 +87,7 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis WithDir(repo.Path). WithStdout(w). WithStderr(stderr). - Run(repo.Ctx); err == nil { + Run(ctx); err == nil { return w.numLines, nil } } @@ -98,39 +99,39 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis var patchCommits = regexp.MustCompile(`^From\s(\w+)\s`) // GetDiff generates and returns patch data between given revisions, optimized for human readability -func (repo *Repository) GetDiff(compareArg string, w io.Writer) error { +func (repo *Repository) GetDiff(ctx context.Context, compareArg string, w io.Writer) error { stderr := new(bytes.Buffer) return gitcmd.NewCommand("diff", "-p").AddDynamicArguments(compareArg). WithDir(repo.Path). WithStdout(w). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) } // GetDiffBinary generates and returns patch data between given revisions, including binary diffs. -func (repo *Repository) GetDiffBinary(compareArg string, w io.Writer) error { +func (repo *Repository) GetDiffBinary(ctx context.Context, compareArg string, w io.Writer) error { return gitcmd.NewCommand("diff", "-p", "--binary", "--histogram"). AddDynamicArguments(compareArg). WithDir(repo.Path). WithStdout(w). - Run(repo.Ctx) + Run(ctx) } // GetPatch generates and returns format-patch data between given revisions, able to be used with `git apply` -func (repo *Repository) GetPatch(compareArg string, w io.Writer) error { +func (repo *Repository) GetPatch(ctx context.Context, compareArg string, w io.Writer) error { stderr := new(bytes.Buffer) return gitcmd.NewCommand("format-patch", "--binary", "--stdout").AddDynamicArguments(compareArg). WithDir(repo.Path). WithStdout(w). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) } // GetFilesChangedBetween returns a list of all files that have been changed between the given commits // If base is undefined empty SHA (zeros), it only returns the files changed in the head commit // If base is the SHA of an empty tree (EmptyTreeSHA), it returns the files changes from the initial commit to the head commit -func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) GetFilesChangedBetween(ctx context.Context, base, head string) ([]string, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -140,7 +141,7 @@ func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, err } else { cmd.AddDynamicArguments(base, head) } - stdout, _, err := cmd.WithDir(repo.Path).RunStdString(repo.Ctx) + stdout, _, err := cmd.WithDir(repo.Path).RunStdString(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index bf16b7cfceb61..b8401fe6d28f8 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -22,7 +22,7 @@ func TestGetFormatPatch(t *testing.T) { return } - repo, err := OpenRepository(t.Context(), clonedPath) + repo, err := OpenRepository(clonedPath) if err != nil { assert.NoError(t, err) return @@ -30,7 +30,7 @@ func TestGetFormatPatch(t *testing.T) { defer repo.Close() rd := &bytes.Buffer{} - err = repo.GetPatch("8d92fc95^...8d92fc95", rd) + err = repo.GetPatch(t.Context(), "8d92fc95^...8d92fc95", rd) if err != nil { assert.NoError(t, err) return @@ -50,7 +50,7 @@ func TestGetFormatPatch(t *testing.T) { func TestReadPatch(t *testing.T) { // Ensure we can read the patch files bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) if err != nil { assert.NoError(t, err) return @@ -88,7 +88,7 @@ func TestReadWritePullHead(t *testing.T) { return } - repo, err := OpenRepository(t.Context(), clonedPath) + repo, err := OpenRepository(clonedPath) if err != nil { assert.NoError(t, err) return @@ -96,7 +96,7 @@ func TestReadWritePullHead(t *testing.T) { defer repo.Close() // Try to open non-existing Pull - _, err = repo.GetRefCommitID(PullPrefix + "0/head") + _, err = repo.GetRefCommitID(t.Context(), PullPrefix+"0/head") assert.Error(t, err) // Write a fake sha1 with only 40 zeros @@ -111,7 +111,7 @@ func TestReadWritePullHead(t *testing.T) { } // Read the file created - headContents, err := repo.GetRefCommitID(PullPrefix + "1/head") + headContents, err := repo.GetRefCommitID(t.Context(), PullPrefix+"1/head") if err != nil { assert.NoError(t, err) return @@ -130,11 +130,11 @@ func TestReadWritePullHead(t *testing.T) { func TestGetCommitFilesChanged(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - repo, err := OpenRepository(t.Context(), bareRepo1Path) + repo, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer repo.Close() - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(t.Context()) assert.NoError(t, err) testCases := []struct { @@ -164,7 +164,7 @@ func TestGetCommitFilesChanged(t *testing.T) { } for _, tc := range testCases { - changedFiles, err := repo.GetFilesChangedBetween(tc.base, tc.head) + changedFiles, err := repo.GetFilesChangedBetween(t.Context(), tc.base, tc.head) assert.NoError(t, err) assert.ElementsMatch(t, tc.files, changedFiles) } diff --git a/modules/git/repo_gpg.go b/modules/git/repo_gpg.go index eb1e71e30a5bb..794de2b570c26 100644 --- a/modules/git/repo_gpg.go +++ b/modules/git/repo_gpg.go @@ -5,6 +5,7 @@ package git import ( + "context" "fmt" "os" "strings" @@ -34,7 +35,7 @@ func (gpgSettings *GPGSettings) LoadPublicKeyContent() error { } // GetDefaultPublicGPGKey will return and cache the default public GPG settings for this repository -func (repo *Repository) GetDefaultPublicGPGKey(forceUpdate bool) (*GPGSettings, error) { +func (repo *Repository) GetDefaultPublicGPGKey(ctx context.Context, forceUpdate bool) (*GPGSettings, error) { if repo.gpgSettings != nil && !forceUpdate { return repo.gpgSettings, nil } @@ -43,7 +44,7 @@ func (repo *Repository) GetDefaultPublicGPGKey(forceUpdate bool) (*GPGSettings, Sign: true, } - value, _, _ := gitcmd.NewCommand("config", "--get", "commit.gpgsign").WithDir(repo.Path).RunStdString(repo.Ctx) + value, _, _ := gitcmd.NewCommand("config", "--get", "commit.gpgsign").WithDir(repo.Path).RunStdString(ctx) sign, valid := ParseBool(strings.TrimSpace(value)) if !sign || !valid { gpgSettings.Sign = false @@ -51,16 +52,16 @@ func (repo *Repository) GetDefaultPublicGPGKey(forceUpdate bool) (*GPGSettings, return gpgSettings, nil } - signingKey, _, _ := gitcmd.NewCommand("config", "--get", "user.signingkey").WithDir(repo.Path).RunStdString(repo.Ctx) + signingKey, _, _ := gitcmd.NewCommand("config", "--get", "user.signingkey").WithDir(repo.Path).RunStdString(ctx) gpgSettings.KeyID = strings.TrimSpace(signingKey) - format, _, _ := gitcmd.NewCommand("config", "--default", SigningKeyFormatOpenPGP, "--get", "gpg.format").WithDir(repo.Path).RunStdString(repo.Ctx) + format, _, _ := gitcmd.NewCommand("config", "--default", SigningKeyFormatOpenPGP, "--get", "gpg.format").WithDir(repo.Path).RunStdString(ctx) gpgSettings.Format = strings.TrimSpace(format) - defaultEmail, _, _ := gitcmd.NewCommand("config", "--get", "user.email").WithDir(repo.Path).RunStdString(repo.Ctx) + defaultEmail, _, _ := gitcmd.NewCommand("config", "--get", "user.email").WithDir(repo.Path).RunStdString(ctx) gpgSettings.Email = strings.TrimSpace(defaultEmail) - defaultName, _, _ := gitcmd.NewCommand("config", "--get", "user.name").WithDir(repo.Path).RunStdString(repo.Ctx) + defaultName, _, _ := gitcmd.NewCommand("config", "--get", "user.name").WithDir(repo.Path).RunStdString(ctx) gpgSettings.Name = strings.TrimSpace(defaultName) if err := gpgSettings.LoadPublicKeyContent(); err != nil { diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index 4068f86bb25f1..99c7493981050 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -15,14 +15,14 @@ import ( ) // ReadTreeToIndex reads a treeish to the index -func (repo *Repository) ReadTreeToIndex(treeish string, indexFilename ...string) error { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) ReadTreeToIndex(ctx context.Context, treeish string, indexFilename ...string) error { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return err } if len(treeish) != objectFormat.FullLength() { - res, _, err := gitcmd.NewCommand("rev-parse", "--verify").AddDynamicArguments(treeish).WithDir(repo.Path).RunStdString(repo.Ctx) + res, _, err := gitcmd.NewCommand("rev-parse", "--verify").AddDynamicArguments(treeish).WithDir(repo.Path).RunStdString(ctx) if err != nil { return err } @@ -34,15 +34,15 @@ func (repo *Repository) ReadTreeToIndex(treeish string, indexFilename ...string) if err != nil { return err } - return repo.readTreeToIndex(id, indexFilename...) + return repo.readTreeToIndex(ctx, id, indexFilename...) } -func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) error { +func (repo *Repository) readTreeToIndex(ctx context.Context, id ObjectID, indexFilename ...string) error { var env []string if len(indexFilename) > 0 { env = append(os.Environ(), "GIT_INDEX_FILE="+indexFilename[0]) } - _, _, err := gitcmd.NewCommand("read-tree").AddDynamicArguments(id.String()).WithDir(repo.Path).WithEnv(env).RunStdString(repo.Ctx) + _, _, err := gitcmd.NewCommand("read-tree").AddDynamicArguments(id.String()).WithDir(repo.Path).WithEnv(env).RunStdString(ctx) if err != nil { return err } @@ -50,7 +50,7 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er } // ReadTreeToTemporaryIndex reads a treeish to a temporary index file -func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilename, tmpDir string, cancel context.CancelFunc, err error) { +func (repo *Repository) ReadTreeToTemporaryIndex(ctx context.Context, treeish string) (tmpIndexFilename, tmpDir string, cancel context.CancelFunc, err error) { defer func() { // if error happens and there is a cancel function, do clean up if err != nil && cancel != nil { @@ -66,7 +66,7 @@ func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilena tmpIndexFilename = filepath.Join(tmpDir, ".tmp-index") - err = repo.ReadTreeToIndex(treeish, tmpIndexFilename) + err = repo.ReadTreeToIndex(ctx, treeish, tmpIndexFilename) if err != nil { return "", "", cancel, err } @@ -74,15 +74,15 @@ func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (tmpIndexFilena } // EmptyIndex empties the index -func (repo *Repository) EmptyIndex() error { - _, _, err := gitcmd.NewCommand("read-tree", "--empty").WithDir(repo.Path).RunStdString(repo.Ctx) +func (repo *Repository) EmptyIndex(ctx context.Context) error { + _, _, err := gitcmd.NewCommand("read-tree", "--empty").WithDir(repo.Path).RunStdString(ctx) return err } // LsFiles checks if the given filenames are in the index -func (repo *Repository) LsFiles(filenames ...string) ([]string, error) { +func (repo *Repository) LsFiles(ctx context.Context, filenames ...string) ([]string, error) { cmd := gitcmd.NewCommand("ls-files", "-z").AddDashesAndList(filenames...) - res, _, err := cmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + res, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) if err != nil { return nil, err } @@ -95,8 +95,8 @@ func (repo *Repository) LsFiles(filenames ...string) ([]string, error) { } // RemoveFilesFromIndex removes given filenames from the index - it does not check whether they are present. -func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) RemoveFilesFromIndex(ctx context.Context, filenames ...string) error { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return err } @@ -115,7 +115,7 @@ func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error { WithStdin(bytes.NewReader(buffer.Bytes())). WithStdout(stdout). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) } type IndexObjectInfo struct { @@ -125,7 +125,7 @@ type IndexObjectInfo struct { } // AddObjectsToIndex adds the provided object hashes to the index at the provided filenames -func (repo *Repository) AddObjectsToIndex(objects ...IndexObjectInfo) error { +func (repo *Repository) AddObjectsToIndex(ctx context.Context, objects ...IndexObjectInfo) error { cmd := gitcmd.NewCommand("update-index", "--add", "--replace", "-z", "--index-info") stdout := new(bytes.Buffer) stderr := new(bytes.Buffer) @@ -139,17 +139,17 @@ func (repo *Repository) AddObjectsToIndex(objects ...IndexObjectInfo) error { WithStdin(bytes.NewReader(buffer.Bytes())). WithStdout(stdout). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) } // AddObjectToIndex adds the provided object hash to the index at the provided filename -func (repo *Repository) AddObjectToIndex(mode string, object ObjectID, filename string) error { - return repo.AddObjectsToIndex(IndexObjectInfo{Mode: mode, Object: object, Filename: filename}) +func (repo *Repository) AddObjectToIndex(ctx context.Context, mode string, object ObjectID, filename string) error { + return repo.AddObjectsToIndex(ctx, IndexObjectInfo{Mode: mode, Object: object, Filename: filename}) } // WriteTree writes the current index as a tree to the object db and returns its hash -func (repo *Repository) WriteTree() (*Tree, error) { - stdout, _, runErr := gitcmd.NewCommand("write-tree").WithDir(repo.Path).RunStdString(repo.Ctx) +func (repo *Repository) WriteTree(ctx context.Context) (*Tree, error) { + stdout, _, runErr := gitcmd.NewCommand("write-tree").WithDir(repo.Path).RunStdString(ctx) if runErr != nil { return nil, runErr } diff --git a/modules/git/repo_object.go b/modules/git/repo_object.go index 2a39a3c4d813f..2c1159e167075 100644 --- a/modules/git/repo_object.go +++ b/modules/git/repo_object.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "io" "strings" @@ -39,12 +40,12 @@ func (EmptyReader) Read(p []byte) (int, error) { return 0, io.EOF } -func (repo *Repository) GetObjectFormat() (ObjectFormat, error) { +func (repo *Repository) GetObjectFormat(ctx context.Context) (ObjectFormat, error) { if repo != nil && repo.objectFormat != nil { return repo.objectFormat, nil } - str, err := repo.hashObject(EmptyReader{}, false) + str, err := repo.hashObject(ctx, EmptyReader{}, false) if err != nil { return nil, err } @@ -59,15 +60,15 @@ func (repo *Repository) GetObjectFormat() (ObjectFormat, error) { } // HashObject takes a reader and returns hash for that reader -func (repo *Repository) HashObject(reader io.Reader) (ObjectID, error) { - idStr, err := repo.hashObject(reader, true) +func (repo *Repository) HashObject(ctx context.Context, reader io.Reader) (ObjectID, error) { + idStr, err := repo.hashObject(ctx, reader, true) if err != nil { return nil, err } return NewIDFromString(idStr) } -func (repo *Repository) hashObject(reader io.Reader, save bool) (string, error) { +func (repo *Repository) hashObject(ctx context.Context, reader io.Reader, save bool) (string, error) { var cmd *gitcmd.Command if save { cmd = gitcmd.NewCommand("hash-object", "-w", "--stdin") @@ -81,7 +82,7 @@ func (repo *Repository) hashObject(reader io.Reader, save bool) (string, error) WithStdin(reader). WithStdout(stdout). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) if err != nil { return "", err } diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go index 8859a93a578d9..b6b9a20cec463 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -12,8 +12,8 @@ import ( ) // GetRefs returns all references of the repository. -func (repo *Repository) GetRefs() ([]*Reference, error) { - return repo.GetRefsFiltered("") +func (repo *Repository) GetRefs(ctx context.Context) ([]*Reference, error) { + return repo.GetRefsFiltered(ctx, "") } // ListOccurrences lists all refs of the given refType the given commit appears in sorted by creation date DESC @@ -71,19 +71,19 @@ func parseTags(refs []string) []string { // * "refs/tags/1234567890" vs commit "1234567890" // In most cases, it SHOULD AVOID using this function, unless there is an irresistible reason (eg: make API friendly to end users) // If the function is used, the caller SHOULD CHECK the ref type carefully. -func (repo *Repository) UnstableGuessRefByShortName(shortName string) RefName { - if repo.IsBranchExist(shortName) { +func (repo *Repository) UnstableGuessRefByShortName(ctx context.Context, shortName string) RefName { + if repo.IsBranchExist(ctx, shortName) { return RefNameFromBranch(shortName) } - if repo.IsTagExist(shortName) { + if repo.IsTagExist(ctx, shortName) { return RefNameFromTag(shortName) } if strings.HasPrefix(shortName, "refs/") { - if repo.IsReferenceExist(shortName) { + if repo.IsReferenceExist(ctx, shortName) { return RefName(shortName) } } - commit, err := repo.GetCommit(shortName) + commit, err := repo.GetCommit(ctx, shortName) if err == nil { commitIDString := commit.ID.String() if strings.HasPrefix(commitIDString, shortName) { diff --git a/modules/git/repo_ref_nogogit.go b/modules/git/repo_ref_nogogit.go index 09bb0df7b80e1..ea16442ecb5c3 100644 --- a/modules/git/repo_ref_nogogit.go +++ b/modules/git/repo_ref_nogogit.go @@ -7,6 +7,7 @@ package git import ( "bufio" + "context" "io" "strings" @@ -14,7 +15,7 @@ import ( ) // GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with. -func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { +func (repo *Repository) GetRefsFiltered(ctx context.Context, pattern string) ([]*Reference, error) { stdoutReader, stdoutWriter := io.Pipe() defer func() { _ = stdoutReader.Close() @@ -27,7 +28,7 @@ func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { WithDir(repo.Path). WithStdout(stdoutWriter). WithStderr(stderrBuilder). - Run(repo.Ctx) + Run(ctx) if err != nil { _ = stdoutWriter.CloseWithError(gitcmd.ConcatenateError(err, stderrBuilder.String())) } else { diff --git a/modules/git/repo_ref_test.go b/modules/git/repo_ref_test.go index 29c255098f11d..02c30605f9297 100644 --- a/modules/git/repo_ref_test.go +++ b/modules/git/repo_ref_test.go @@ -12,11 +12,11 @@ import ( func TestRepository_GetRefs(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() - refs, err := bareRepo1.GetRefs() + refs, err := bareRepo1.GetRefs(t.Context()) assert.NoError(t, err) assert.Len(t, refs, 6) @@ -37,11 +37,11 @@ func TestRepository_GetRefs(t *testing.T) { func TestRepository_GetRefsFiltered(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() - refs, err := bareRepo1.GetRefsFiltered(TagPrefix) + refs, err := bareRepo1.GetRefsFiltered(t.Context(), TagPrefix) assert.NoError(t, err) if assert.Len(t, refs, 2) { diff --git a/modules/git/repo_stats.go b/modules/git/repo_stats.go index cfb35288fe819..9ea5c1cec8522 100644 --- a/modules/git/repo_stats.go +++ b/modules/git/repo_stats.go @@ -36,7 +36,7 @@ type CodeActivityAuthor struct { } // GetCodeActivityStats returns code statistics for activity page -func (repo *Repository) GetCodeActivityStats(fromTime time.Time, branch string) (*CodeActivityStats, error) { +func (repo *Repository) GetCodeActivityStats(ctx context.Context, fromTime time.Time, branch string) (*CodeActivityStats, error) { stats := &CodeActivityStats{} since := fromTime.Format(time.RFC3339) @@ -44,7 +44,7 @@ func (repo *Repository) GetCodeActivityStats(fromTime time.Time, branch string) stdout, _, runErr := gitcmd.NewCommand("rev-list", "--count", "--no-merges", "--branches=*", "--date=iso"). AddOptionFormat("--since=%s", since). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if runErr != nil { return nil, runErr } @@ -146,7 +146,7 @@ func (repo *Repository) GetCodeActivityStats(fromTime time.Time, branch string) _ = stdoutReader.Close() return nil }). - Run(repo.Ctx) + Run(ctx) if err != nil { return nil, fmt.Errorf("Failed to get GetCodeActivityStats for repository.\nError: %w\nStderr: %s", err, stderr) } diff --git a/modules/git/repo_stats_test.go b/modules/git/repo_stats_test.go index 538283111bdc1..176bd7405b67f 100644 --- a/modules/git/repo_stats_test.go +++ b/modules/git/repo_stats_test.go @@ -13,14 +13,14 @@ import ( func TestRepository_GetCodeActivityStats(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) assert.NoError(t, err) defer bareRepo1.Close() timeFrom, err := time.Parse(time.RFC3339, "2016-01-01T00:00:00+00:00") assert.NoError(t, err) - code, err := bareRepo1.GetCodeActivityStats(timeFrom, "") + code, err := bareRepo1.GetCodeActivityStats(t.Context(), timeFrom, "") assert.NoError(t, err) assert.NotNil(t, code) diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go index 4ad0c6e5abc9b..557c6ad8fe0fe 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -5,6 +5,7 @@ package git import ( + "context" "fmt" "io" "strings" @@ -18,28 +19,28 @@ import ( const TagPrefix = "refs/tags/" // CreateTag create one tag in the repository -func (repo *Repository) CreateTag(name, revision string) error { - _, _, err := gitcmd.NewCommand("tag").AddDashesAndList(name, revision).WithDir(repo.Path).RunStdString(repo.Ctx) +func (repo *Repository) CreateTag(ctx context.Context, name, revision string) error { + _, _, err := gitcmd.NewCommand("tag").AddDashesAndList(name, revision).WithDir(repo.Path).RunStdString(ctx) return err } // CreateAnnotatedTag create one annotated tag in the repository -func (repo *Repository) CreateAnnotatedTag(name, message, revision string) error { +func (repo *Repository) CreateAnnotatedTag(ctx context.Context, name, message, revision string) error { _, _, err := gitcmd.NewCommand("tag", "-a", "-m"). AddDynamicArguments(message). AddDashesAndList(name, revision). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) return err } // GetTagNameBySHA returns the name of a tag from its tag object SHA or commit SHA -func (repo *Repository) GetTagNameBySHA(sha string) (string, error) { +func (repo *Repository) GetTagNameBySHA(ctx context.Context, sha string) (string, error) { if len(sha) < 5 { return "", fmt.Errorf("SHA is too short: %s", sha) } - stdout, _, err := gitcmd.NewCommand("show-ref", "--tags", "-d").WithDir(repo.Path).RunStdString(repo.Ctx) + stdout, _, err := gitcmd.NewCommand("show-ref", "--tags", "-d").WithDir(repo.Path).RunStdString(ctx) if err != nil { return "", err } @@ -61,8 +62,8 @@ func (repo *Repository) GetTagNameBySHA(sha string) (string, error) { } // GetTagID returns the object ID for a tag (annotated tags have both an object SHA AND a commit SHA) -func (repo *Repository) GetTagID(name string) (string, error) { - stdout, _, err := gitcmd.NewCommand("show-ref", "--tags").AddDashesAndList(name).WithDir(repo.Path).RunStdString(repo.Ctx) +func (repo *Repository) GetTagID(ctx context.Context, name string) (string, error) { + stdout, _, err := gitcmd.NewCommand("show-ref", "--tags").AddDashesAndList(name).WithDir(repo.Path).RunStdString(ctx) if err != nil { return "", err } @@ -77,8 +78,8 @@ func (repo *Repository) GetTagID(name string) (string, error) { } // GetTag returns a Git tag by given name. -func (repo *Repository) GetTag(name string) (*Tag, error) { - idStr, err := repo.GetTagID(name) +func (repo *Repository) GetTag(ctx context.Context, name string) (*Tag, error) { + idStr, err := repo.GetTagID(ctx, name) if err != nil { return nil, err } @@ -88,7 +89,7 @@ func (repo *Repository) GetTag(name string) (*Tag, error) { return nil, err } - tag, err := repo.getTag(id, name) + tag, err := repo.getTag(ctx, id, name) if err != nil { return nil, err } @@ -96,13 +97,13 @@ func (repo *Repository) GetTag(name string) (*Tag, error) { } // GetTagWithID returns a Git tag by given name and ID -func (repo *Repository) GetTagWithID(idStr, name string) (*Tag, error) { +func (repo *Repository) GetTagWithID(ctx context.Context, idStr, name string) (*Tag, error) { id, err := NewIDFromString(idStr) if err != nil { return nil, err } - tag, err := repo.getTag(id, name) + tag, err := repo.getTag(ctx, id, name) if err != nil { return nil, err } @@ -110,7 +111,7 @@ func (repo *Repository) GetTagWithID(idStr, name string) (*Tag, error) { } // GetTagInfos returns all tag infos of the repository. -func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) { +func (repo *Repository) GetTagInfos(ctx context.Context, page, pageSize int) ([]*Tag, int, error) { // Generally, refname:short should be equal to refname:lstrip=2 except core.warnAmbiguousRefs is used to select the strict abbreviation mode. // https://git-scm.com/docs/git-for-each-ref#Documentation/git-for-each-ref.txt-refname forEachRefFmt := foreachref.NewFormat("objecttype", "refname:lstrip=2", "object", "objectname", "creator", "contents", "contents:signature") @@ -127,7 +128,7 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) { WithDir(repo.Path). WithStdout(stdoutWriter). WithStderr(&stderr). - Run(repo.Ctx) + Run(ctx) if err != nil { _ = stdoutWriter.CloseWithError(gitcmd.ConcatenateError(err, stderr.String())) } else { @@ -205,14 +206,14 @@ func parseTagRef(ref map[string]string) (tag *Tag, err error) { } // GetAnnotatedTag returns a Git tag by its SHA, must be an annotated tag -func (repo *Repository) GetAnnotatedTag(sha string) (*Tag, error) { +func (repo *Repository) GetAnnotatedTag(ctx context.Context, sha string) (*Tag, error) { id, err := NewIDFromString(sha) if err != nil { return nil, err } // Tag type must be "tag" (annotated) and not a "commit" (lightweight) tag - if tagType, err := repo.GetTagType(id); err != nil { + if tagType, err := repo.GetTagType(ctx, id); err != nil { return nil, err } else if ObjectType(tagType) != ObjectTag { // not an annotated tag @@ -220,12 +221,12 @@ func (repo *Repository) GetAnnotatedTag(sha string) (*Tag, error) { } // Get tag name - name, err := repo.GetTagNameBySHA(id.String()) + name, err := repo.GetTagNameBySHA(ctx, id.String()) if err != nil { return nil, err } - tag, err := repo.getTag(id, name) + tag, err := repo.getTag(ctx, id, name) if err != nil { return nil, err } diff --git a/modules/git/repo_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 5f79b68a9ae62..8bf65c334481b 100644 --- a/modules/git/repo_tag_nogogit.go +++ b/modules/git/repo_tag_nogogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "errors" "io" @@ -14,17 +15,17 @@ import ( ) // IsTagExist returns true if given tag exists in the repository. -func (repo *Repository) IsTagExist(name string) bool { +func (repo *Repository) IsTagExist(ctx context.Context, name string) bool { if repo == nil || name == "" { return false } - return repo.IsReferenceExist(TagPrefix + name) + return repo.IsReferenceExist(ctx, TagPrefix+name) } // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) -func (repo *Repository) GetTagType(id ObjectID) (string, error) { - wr, rd, cancel, err := repo.CatFileBatchCheck(repo.Ctx) +func (repo *Repository) GetTagType(ctx context.Context, id ObjectID) (string, error) { + wr, rd, cancel, err := repo.CatFileBatchCheck(ctx) if err != nil { return "", err } @@ -43,7 +44,7 @@ func (repo *Repository) GetTagType(id ObjectID) (string, error) { return typ, nil } -func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { +func (repo *Repository) getTag(ctx context.Context, tagID ObjectID, name string) (*Tag, error) { t, ok := repo.tagCache.Get(tagID.String()) if ok { log.Debug("Hit cache: %s", tagID) @@ -52,13 +53,13 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { return &tagClone, nil } - tp, err := repo.GetTagType(tagID) + tp, err := repo.GetTagType(ctx, tagID) if err != nil { return nil, err } // Get the commit ID and tag ID (may be different for annotated tag) for the returned tag object - commitIDStr, err := repo.GetTagCommitID(name) + commitIDStr, err := repo.GetTagCommitID(ctx, name) if err != nil { // every tag should have a commit ID so return all errors return nil, err @@ -70,7 +71,7 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { // If type is "commit, the tag is a lightweight tag if ObjectType(tp) == ObjectCommit { - commit, err := repo.GetCommit(commitIDStr) + commit, err := repo.GetCommit(ctx, commitIDStr) if err != nil { return nil, err } @@ -88,7 +89,7 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { } // The tag is an annotated tag with a message. - wr, rd, cancel, err := repo.CatFileBatch(repo.Ctx) + wr, rd, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_tag_test.go b/modules/git/repo_tag_test.go index e6f8e75a0ebfd..59ca8c9bce6d5 100644 --- a/modules/git/repo_tag_test.go +++ b/modules/git/repo_tag_test.go @@ -13,14 +13,14 @@ import ( func TestRepository_GetTagInfos(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - bareRepo1, err := OpenRepository(t.Context(), bareRepo1Path) + bareRepo1, err := OpenRepository(bareRepo1Path) if err != nil { assert.NoError(t, err) return } defer bareRepo1.Close() - tags, total, err := bareRepo1.GetTagInfos(0, 0) + tags, total, err := bareRepo1.GetTagInfos(t.Context(), 0, 0) if err != nil { assert.NoError(t, err) return @@ -44,7 +44,7 @@ func TestRepository_GetTag(t *testing.T) { return } - bareRepo1, err := OpenRepository(t.Context(), clonedPath) + bareRepo1, err := OpenRepository(clonedPath) if err != nil { assert.NoError(t, err) return @@ -56,14 +56,14 @@ func TestRepository_GetTag(t *testing.T) { lTagName := "lightweightTag" // Create the lightweight tag - err = bareRepo1.CreateTag(lTagName, lTagCommitID) + err = bareRepo1.CreateTag(t.Context(), lTagName, lTagCommitID) if err != nil { assert.NoError(t, err, "Unable to create the lightweight tag: %s for ID: %s. Error: %v", lTagName, lTagCommitID, err) return } // and try to get the Tag for lightweight tag - lTag, err := bareRepo1.GetTag(lTagName) + lTag, err := bareRepo1.GetTag(t.Context(), lTagName) require.NoError(t, err) require.NotNil(t, lTag, "nil lTag: %s", lTagName) @@ -78,20 +78,20 @@ func TestRepository_GetTag(t *testing.T) { aTagMessage := "my annotated message \n - test two line" // Create the annotated tag - err = bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) + err = bareRepo1.CreateAnnotatedTag(t.Context(), aTagName, aTagMessage, aTagCommitID) if err != nil { assert.NoError(t, err, "Unable to create the annotated tag: %s for ID: %s. Error: %v", aTagName, aTagCommitID, err) return } // Now try to get the tag for the annotated Tag - aTagID, err := bareRepo1.GetTagID(aTagName) + aTagID, err := bareRepo1.GetTagID(t.Context(), aTagName) if err != nil { assert.NoError(t, err) return } - aTag, err := bareRepo1.GetTag(aTagName) + aTag, err := bareRepo1.GetTag(t.Context(), aTagName) require.NoError(t, err) require.NotNil(t, aTag, "nil aTag: %s", aTagName) @@ -106,20 +106,20 @@ func TestRepository_GetTag(t *testing.T) { rTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" rTagName := "release/" + lTagName - err = bareRepo1.CreateTag(rTagName, rTagCommitID) + err = bareRepo1.CreateTag(t.Context(), rTagName, rTagCommitID) if err != nil { assert.NoError(t, err, "Unable to create the tag: %s for ID: %s. Error: %v", rTagName, rTagCommitID, err) return } - rTagID, err := bareRepo1.GetTagID(rTagName) + rTagID, err := bareRepo1.GetTagID(t.Context(), rTagName) if err != nil { assert.NoError(t, err) return } assert.Equal(t, rTagCommitID, rTagID) - oTagID, err := bareRepo1.GetTagID(lTagName) + oTagID, err := bareRepo1.GetTagID(t.Context(), lTagName) if err != nil { assert.NoError(t, err) return @@ -136,7 +136,7 @@ func TestRepository_GetAnnotatedTag(t *testing.T) { return } - bareRepo1, err := OpenRepository(t.Context(), clonedPath) + bareRepo1, err := OpenRepository(clonedPath) if err != nil { assert.NoError(t, err) return @@ -145,16 +145,16 @@ func TestRepository_GetAnnotatedTag(t *testing.T) { lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1" lTagName := "lightweightTag" - bareRepo1.CreateTag(lTagName, lTagCommitID) + bareRepo1.CreateTag(t.Context(), lTagName, lTagCommitID) aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0" aTagName := "annotatedTag" aTagMessage := "my annotated message" - bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID) - aTagID, _ := bareRepo1.GetTagID(aTagName) + bareRepo1.CreateAnnotatedTag(t.Context(), aTagName, aTagMessage, aTagCommitID) + aTagID, _ := bareRepo1.GetTagID(t.Context(), aTagName) // Try an annotated tag - tag, err := bareRepo1.GetAnnotatedTag(aTagID) + tag, err := bareRepo1.GetAnnotatedTag(t.Context(), aTagID) if err != nil { assert.NoError(t, err) return @@ -165,18 +165,18 @@ func TestRepository_GetAnnotatedTag(t *testing.T) { assert.Equal(t, "tag", tag.Type) // Annotated tag's Commit ID should fail - tag2, err := bareRepo1.GetAnnotatedTag(aTagCommitID) + tag2, err := bareRepo1.GetAnnotatedTag(t.Context(), aTagCommitID) assert.Error(t, err) assert.True(t, IsErrNotExist(err)) assert.Nil(t, tag2) // Annotated tag's name should fail - tag3, err := bareRepo1.GetAnnotatedTag(aTagName) + tag3, err := bareRepo1.GetAnnotatedTag(t.Context(), aTagName) assert.Errorf(t, err, "Length must be 40: %d", len(aTagName)) assert.Nil(t, tag3) // Lightweight Tag should fail - tag4, err := bareRepo1.GetAnnotatedTag(lTagCommitID) + tag4, err := bareRepo1.GetAnnotatedTag(t.Context(), lTagCommitID) assert.Error(t, err) assert.True(t, IsErrNotExist(err)) assert.Nil(t, tag4) diff --git a/modules/git/repo_test.go b/modules/git/repo_test.go index 26ee3a091a269..f28f6020c28d7 100644 --- a/modules/git/repo_test.go +++ b/modules/git/repo_test.go @@ -22,10 +22,10 @@ func TestGetLatestCommitTime(t *testing.T) { func TestRepoIsEmpty(t *testing.T) { emptyRepo2Path := filepath.Join(testReposDir, "repo2_empty") - repo, err := OpenRepository(t.Context(), emptyRepo2Path) + repo, err := OpenRepository(emptyRepo2Path) assert.NoError(t, err) defer repo.Close() - isEmpty, err := repo.IsEmpty() + isEmpty, err := repo.IsEmpty(t.Context()) assert.NoError(t, err) assert.True(t, isEmpty) } diff --git a/modules/git/repo_tree.go b/modules/git/repo_tree.go index 964342ba001f7..beb321e892a9c 100644 --- a/modules/git/repo_tree.go +++ b/modules/git/repo_tree.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "os" "strings" "time" @@ -23,7 +24,7 @@ type CommitTreeOpts struct { } // CommitTree creates a commit from a given tree id for the user with provided message -func (repo *Repository) CommitTree(author, committer *Signature, tree *Tree, opts CommitTreeOpts) (ObjectID, error) { +func (repo *Repository) CommitTree(ctx context.Context, author, committer *Signature, tree *Tree, opts CommitTreeOpts) (ObjectID, error) { commitTimeStr := time.Now().Format(time.RFC3339) // Because this may call hooks we should pass in the environment @@ -65,7 +66,7 @@ func (repo *Repository) CommitTree(author, committer *Signature, tree *Tree, opt WithStdin(messageBytes). WithStdout(stdout). WithStderr(stderr). - Run(repo.Ctx) + Run(ctx) if err != nil { return nil, gitcmd.ConcatenateError(err, stderr.String()) } diff --git a/modules/git/repo_tree_nogogit.go b/modules/git/repo_tree_nogogit.go index 1954f8516219d..d92b11829ac60 100644 --- a/modules/git/repo_tree_nogogit.go +++ b/modules/git/repo_tree_nogogit.go @@ -6,11 +6,12 @@ package git import ( + "context" "io" ) -func (repo *Repository) getTree(id ObjectID) (*Tree, error) { - wr, rd, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) getTree(ctx context.Context, id ObjectID) (*Tree, error) { + wr, rd, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -58,7 +59,7 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) { case "tree": tree := NewTree(repo, id) tree.ResolvedID = id - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -79,13 +80,13 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) { } // GetTree find the tree object in the repository. -func (repo *Repository) GetTree(idStr string) (*Tree, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) GetTree(ctx context.Context, idStr string) (*Tree, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } if len(idStr) != objectFormat.FullLength() { - res, err := repo.GetRefCommitID(idStr) + res, err := repo.GetRefCommitID(ctx, idStr) if err != nil { return nil, err } @@ -98,5 +99,5 @@ func (repo *Repository) GetTree(idStr string) (*Tree, error) { return nil, err } - return repo.getTree(id) + return repo.getTree(ctx, id) } diff --git a/modules/git/tree.go b/modules/git/tree.go index 9c73aec735e2a..ad5e66e6bdafc 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "strings" "code.gitea.io/gitea/modules/git/gitcmd" @@ -20,7 +21,7 @@ func NewTree(repo *Repository, id ObjectID) *Tree { } // SubTree get a subtree by the sub dir path -func (t *Tree) SubTree(rpath string) (*Tree, error) { +func (t *Tree) SubTree(ctx context.Context, rpath string) (*Tree, error) { if len(rpath) == 0 { return t, nil } @@ -33,12 +34,12 @@ func (t *Tree) SubTree(rpath string) (*Tree, error) { te *TreeEntry ) for _, name := range paths { - te, err = p.GetTreeEntryByPath(name) + te, err = p.GetTreeEntryByPath(ctx, name) if err != nil { return nil, err } - g, err = t.repo.getTree(te.ID) + g, err = t.repo.getTree(ctx, te.ID) if err != nil { return nil, err } @@ -49,11 +50,11 @@ func (t *Tree) SubTree(rpath string) (*Tree, error) { } // LsTree checks if the given filenames are in the tree -func (repo *Repository) LsTree(ref string, filenames ...string) ([]string, error) { +func (repo *Repository) LsTree(ctx context.Context, ref string, filenames ...string) ([]string, error) { cmd := gitcmd.NewCommand("ls-tree", "-z", "--name-only"). AddDashesAndList(append([]string{ref}, filenames...)...) - res, _, err := cmd.WithDir(repo.Path).RunStdBytes(repo.Ctx) + res, _, err := cmd.WithDir(repo.Path).RunStdBytes(ctx) if err != nil { return nil, err } @@ -66,13 +67,13 @@ func (repo *Repository) LsTree(ref string, filenames ...string) ([]string, error } // GetTreePathLatestCommit returns the latest commit of a tree path -func (repo *Repository) GetTreePathLatestCommit(refName, treePath string) (*Commit, error) { +func (repo *Repository) GetTreePathLatestCommit(ctx context.Context, refName, treePath string) (*Commit, error) { stdout, _, err := gitcmd.NewCommand("rev-list", "-1"). AddDynamicArguments(refName).AddDashesAndList(treePath). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } - return repo.GetCommit(strings.TrimSpace(stdout)) + return repo.GetCommit(ctx, strings.TrimSpace(stdout)) } diff --git a/modules/git/tree_blob.go b/modules/git/tree_blob.go index 31d9f3d73b2d5..130d3f1fca958 100644 --- a/modules/git/tree_blob.go +++ b/modules/git/tree_blob.go @@ -4,9 +4,11 @@ package git +import "context" + // GetBlobByPath get the blob object according the path -func (t *Tree) GetBlobByPath(relpath string) (*Blob, error) { - entry, err := t.GetTreeEntryByPath(relpath) +func (t *Tree) GetBlobByPath(ctx context.Context, relpath string) (*Blob, error) { + entry, err := t.GetTreeEntryByPath(ctx, relpath) if err != nil { return nil, err } diff --git a/modules/git/tree_blob_nogogit.go b/modules/git/tree_blob_nogogit.go index b18d0fa05e6dd..536adcd185d01 100644 --- a/modules/git/tree_blob_nogogit.go +++ b/modules/git/tree_blob_nogogit.go @@ -6,12 +6,13 @@ package git import ( + "context" "path" "strings" ) // GetTreeEntryByPath get the tree entries according the sub dir -func (t *Tree) GetTreeEntryByPath(relpath string) (_ *TreeEntry, err error) { +func (t *Tree) GetTreeEntryByPath(ctx context.Context, relpath string) (_ *TreeEntry, err error) { if len(relpath) == 0 { return &TreeEntry{ ptree: t, @@ -26,14 +27,14 @@ func (t *Tree) GetTreeEntryByPath(relpath string) (_ *TreeEntry, err error) { tree := t for _, name := range parts[:len(parts)-1] { - tree, err = tree.SubTree(name) + tree, err = tree.SubTree(ctx, name) if err != nil { return nil, err } } name := parts[len(parts)-1] - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { return nil, err } diff --git a/modules/git/tree_entry.go b/modules/git/tree_entry.go index 5099d8ee79bc3..2498fa7874abe 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -5,6 +5,7 @@ package git import ( + "context" "path" "sort" "strings" @@ -30,18 +31,18 @@ type EntryFollowResult struct { TargetEntry *TreeEntry } -func EntryFollowLink(commit *Commit, fullPath string, te *TreeEntry) (*EntryFollowResult, error) { +func EntryFollowLink(ctx context.Context, commit *Commit, fullPath string, te *TreeEntry) (*EntryFollowResult, error) { if !te.IsLink() { return nil, util.ErrorWrap(util.ErrUnprocessableContent, "%q is not a symlink", fullPath) } // git's filename max length is 4096, hopefully a link won't be longer than multiple of that const maxSymlinkSize = 20 * 4096 - if te.Blob().Size() > maxSymlinkSize { + if te.Blob().Size(ctx) > maxSymlinkSize { return nil, util.ErrorWrap(util.ErrUnprocessableContent, "%q content exceeds symlink limit", fullPath) } - link, err := te.Blob().GetBlobContent(maxSymlinkSize) + link, err := te.Blob().GetBlobContent(ctx, maxSymlinkSize) if err != nil { return nil, err } @@ -51,18 +52,18 @@ func EntryFollowLink(commit *Commit, fullPath string, te *TreeEntry) (*EntryFoll } targetFullPath := path.Join(path.Dir(fullPath), link) - targetEntry, err := commit.GetTreeEntryByPath(targetFullPath) + targetEntry, err := commit.GetTreeEntryByPath(ctx, targetFullPath) if err != nil { return &EntryFollowResult{SymlinkContent: link}, err } return &EntryFollowResult{SymlinkContent: link, TargetFullPath: targetFullPath, TargetEntry: targetEntry}, nil } -func EntryFollowLinks(commit *Commit, firstFullPath string, firstTreeEntry *TreeEntry, optLimit ...int) (res *EntryFollowResult, err error) { +func EntryFollowLinks(ctx context.Context, commit *Commit, firstFullPath string, firstTreeEntry *TreeEntry, optLimit ...int) (res *EntryFollowResult, err error) { limit := util.OptionalArg(optLimit, 10) treeEntry, fullPath := firstTreeEntry, firstFullPath for range limit { - res, err = EntryFollowLink(commit, fullPath, treeEntry) + res, err = EntryFollowLink(ctx, commit, fullPath, treeEntry) if err != nil { return res, err } @@ -78,8 +79,8 @@ func EntryFollowLinks(commit *Commit, firstFullPath string, firstTreeEntry *Tree } // returns the Tree pointed to by this TreeEntry, or nil if this is not a tree -func (te *TreeEntry) Tree() *Tree { - t, err := te.ptree.repo.getTree(te.ID) +func (te *TreeEntry) Tree(ctx context.Context) *Tree { + t, err := te.ptree.repo.getTree(ctx, te.ID) if err != nil { return nil } @@ -88,17 +89,17 @@ func (te *TreeEntry) Tree() *Tree { } // GetSubJumpablePathName return the full path of subdirectory jumpable ( contains only one directory ) -func (te *TreeEntry) GetSubJumpablePathName() string { +func (te *TreeEntry) GetSubJumpablePathName(ctx context.Context) string { if te.IsSubModule() || !te.IsDir() { return "" } - tree, err := te.ptree.SubTree(te.Name()) + tree, err := te.ptree.SubTree(ctx, te.Name()) if err != nil { return te.Name() } - entries, _ := tree.ListEntries() + entries, _ := tree.ListEntries(ctx) if len(entries) == 1 && entries[0].IsDir() { - name := entries[0].GetSubJumpablePathName() + name := entries[0].GetSubJumpablePathName(ctx) if name != "" { return te.Name() + "/" + name } diff --git a/modules/git/tree_entry_common_test.go b/modules/git/tree_entry_common_test.go index 8e20ee56ff6ac..4583729d18981 100644 --- a/modules/git/tree_entry_common_test.go +++ b/modules/git/tree_entry_common_test.go @@ -13,22 +13,22 @@ import ( ) func TestFollowLink(t *testing.T) { - r, err := OpenRepository(t.Context(), "tests/repos/repo1_bare") + r, err := OpenRepository("tests/repos/repo1_bare") require.NoError(t, err) defer r.Close() - commit, err := r.GetCommit("37991dec2c8e592043f47155ce4808d4580f9123") + commit, err := r.GetCommit(t.Context(), "37991dec2c8e592043f47155ce4808d4580f9123") require.NoError(t, err) // get the symlink { lnkFullPath := "foo/bar/link_to_hello" - lnk, err := commit.Tree.GetTreeEntryByPath("foo/bar/link_to_hello") + lnk, err := commit.Tree.GetTreeEntryByPath(t.Context(), "foo/bar/link_to_hello") require.NoError(t, err) assert.True(t, lnk.IsLink()) // should be able to dereference to target - res, err := EntryFollowLink(commit, lnkFullPath, lnk) + res, err := EntryFollowLink(t.Context(), commit, lnkFullPath, lnk) require.NoError(t, err) assert.Equal(t, "hello", res.TargetEntry.Name()) assert.Equal(t, "foo/nar/hello", res.TargetFullPath) @@ -38,38 +38,38 @@ func TestFollowLink(t *testing.T) { { // should error when called on a normal file - entry, err := commit.Tree.GetTreeEntryByPath("file1.txt") + entry, err := commit.Tree.GetTreeEntryByPath(t.Context(), "file1.txt") require.NoError(t, err) - res, err := EntryFollowLink(commit, "file1.txt", entry) + res, err := EntryFollowLink(t.Context(), commit, "file1.txt", entry) assert.ErrorIs(t, err, util.ErrUnprocessableContent) assert.Nil(t, res) } { // should error for broken links - entry, err := commit.Tree.GetTreeEntryByPath("foo/broken_link") + entry, err := commit.Tree.GetTreeEntryByPath(t.Context(), "foo/broken_link") require.NoError(t, err) assert.True(t, entry.IsLink()) - res, err := EntryFollowLink(commit, "foo/broken_link", entry) + res, err := EntryFollowLink(t.Context(), commit, "foo/broken_link", entry) assert.ErrorIs(t, err, util.ErrNotExist) assert.Equal(t, "nar/broken_link", res.SymlinkContent) } { // should error for external links - entry, err := commit.Tree.GetTreeEntryByPath("foo/outside_repo") + entry, err := commit.Tree.GetTreeEntryByPath(t.Context(), "foo/outside_repo") require.NoError(t, err) assert.True(t, entry.IsLink()) - res, err := EntryFollowLink(commit, "foo/outside_repo", entry) + res, err := EntryFollowLink(t.Context(), commit, "foo/outside_repo", entry) assert.ErrorIs(t, err, util.ErrNotExist) assert.Equal(t, "../../outside_repo", res.SymlinkContent) } { // testing fix for short link bug - entry, err := commit.Tree.GetTreeEntryByPath("foo/link_short") + entry, err := commit.Tree.GetTreeEntryByPath(t.Context(), "foo/link_short") require.NoError(t, err) - res, err := EntryFollowLink(commit, "foo/link_short", entry) + res, err := EntryFollowLink(t.Context(), commit, "foo/link_short", entry) assert.ErrorIs(t, err, util.ErrNotExist) assert.Equal(t, "a", res.SymlinkContent) } diff --git a/modules/git/tree_entry_nogogit.go b/modules/git/tree_entry_nogogit.go index 8fad96cdf8924..dce60de310582 100644 --- a/modules/git/tree_entry_nogogit.go +++ b/modules/git/tree_entry_nogogit.go @@ -5,7 +5,11 @@ package git -import "code.gitea.io/gitea/modules/log" +import ( + "context" + + "code.gitea.io/gitea/modules/log" +) // TreeEntry the leaf in the git tree type TreeEntry struct { @@ -29,14 +33,14 @@ func (te *TreeEntry) Mode() EntryMode { } // Size returns the size of the entry -func (te *TreeEntry) Size() int64 { +func (te *TreeEntry) Size(ctx context.Context) int64 { if te.IsDir() { return 0 } else if te.sized { return te.size } - wr, rd, cancel, err := te.ptree.repo.CatFileBatchCheck(te.ptree.repo.Ctx) + wr, rd, cancel, err := te.ptree.repo.CatFileBatchCheck(ctx) if err != nil { log.Debug("error whilst reading size for %s in %s. Error: %v", te.ID.String(), te.ptree.repo.Path, err) return 0 diff --git a/modules/git/tree_nogogit.go b/modules/git/tree_nogogit.go index 956a5938f0f27..83587c627f783 100644 --- a/modules/git/tree_nogogit.go +++ b/modules/git/tree_nogogit.go @@ -6,6 +6,7 @@ package git import ( + "context" "io" "strings" @@ -29,13 +30,13 @@ type Tree struct { } // ListEntries returns all entries of current tree. -func (t *Tree) ListEntries() (Entries, error) { +func (t *Tree) ListEntries(ctx context.Context) (Entries, error) { if t.entriesParsed { return t.entries, nil } if t.repo != nil { - wr, rd, cancel, err := t.repo.CatFileBatch(t.repo.Ctx) + wr, rd, cancel, err := t.repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -72,7 +73,7 @@ func (t *Tree) ListEntries() (Entries, error) { } } - stdout, _, runErr := gitcmd.NewCommand("ls-tree", "-l").AddDynamicArguments(t.ID.String()).WithDir(t.repo.Path).RunStdBytes(t.repo.Ctx) + stdout, _, runErr := gitcmd.NewCommand("ls-tree", "-l").AddDynamicArguments(t.ID.String()).WithDir(t.repo.Path).RunStdBytes(ctx) if runErr != nil { if strings.Contains(runErr.Error(), "fatal: Not a valid object name") || strings.Contains(runErr.Error(), "fatal: not a tree object") { return nil, ErrNotExist{ @@ -93,7 +94,7 @@ func (t *Tree) ListEntries() (Entries, error) { // listEntriesRecursive returns all entries of current tree recursively including all subtrees // extraArgs could be "-l" to get the size, which is slower -func (t *Tree) listEntriesRecursive(extraArgs gitcmd.TrustedCmdArgs) (Entries, error) { +func (t *Tree) listEntriesRecursive(ctx context.Context, extraArgs gitcmd.TrustedCmdArgs) (Entries, error) { if t.entriesRecursiveParsed { return t.entriesRecursive, nil } @@ -102,7 +103,7 @@ func (t *Tree) listEntriesRecursive(extraArgs gitcmd.TrustedCmdArgs) (Entries, e AddArguments(extraArgs...). AddDynamicArguments(t.ID.String()). WithDir(t.repo.Path). - RunStdBytes(t.repo.Ctx) + RunStdBytes(ctx) if runErr != nil { return nil, runErr } @@ -117,11 +118,11 @@ func (t *Tree) listEntriesRecursive(extraArgs gitcmd.TrustedCmdArgs) (Entries, e } // ListEntriesRecursiveFast returns all entries of current tree recursively including all subtrees, no size -func (t *Tree) ListEntriesRecursiveFast() (Entries, error) { - return t.listEntriesRecursive(nil) +func (t *Tree) ListEntriesRecursiveFast(ctx context.Context) (Entries, error) { + return t.listEntriesRecursive(ctx, nil) } // ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees, with size -func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) { - return t.listEntriesRecursive(gitcmd.TrustedCmdArgs{"--long"}) +func (t *Tree) ListEntriesRecursiveWithSize(ctx context.Context) (Entries, error) { + return t.listEntriesRecursive(ctx, gitcmd.TrustedCmdArgs{"--long"}) } diff --git a/modules/git/tree_test.go b/modules/git/tree_test.go index 67f95fe74894c..992ed1f4fd37d 100644 --- a/modules/git/tree_test.go +++ b/modules/git/tree_test.go @@ -11,31 +11,31 @@ import ( ) func TestSubTree_Issue29101(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + repo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("ce064814f4a0d337b333e646ece456cd39fab612") + commit, err := repo.GetCommit(t.Context(), "ce064814f4a0d337b333e646ece456cd39fab612") assert.NoError(t, err) // old code could produce a different error if called multiple times for range 10 { - _, err = commit.SubTree("file1.txt") + _, err = commit.SubTree(t.Context(), "file1.txt") assert.Error(t, err) assert.True(t, IsErrNotExist(err)) } } func Test_GetTreePathLatestCommit(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo6_blame")) + repo, err := OpenRepository(filepath.Join(testReposDir, "repo6_blame")) assert.NoError(t, err) defer repo.Close() - commitID, err := repo.GetBranchCommitID("master") + commitID, err := repo.GetBranchCommitID(t.Context(), "master") assert.NoError(t, err) assert.Equal(t, "544d8f7a3b15927cddf2299b4b562d6ebd71b6a7", commitID) - commit, err := repo.GetTreePathLatestCommit("master", "blame.txt") + commit, err := repo.GetTreePathLatestCommit(t.Context(), "master", "blame.txt") assert.NoError(t, err) assert.NotNil(t, commit) assert.Equal(t, "45fb6cbc12f970b04eacd5cd4165edd11c8d7376", commit.ID.String()) diff --git a/modules/gitrepo/branch.go b/modules/gitrepo/branch.go index e05d75caf8393..cfe59d927f5d1 100644 --- a/modules/gitrepo/branch.go +++ b/modules/gitrepo/branch.go @@ -15,23 +15,23 @@ import ( // GetBranchesByPath returns a branch by its path // if limit = 0 it will not limit func GetBranchesByPath(ctx context.Context, repo Repository, skip, limit int) ([]string, int, error) { - gitRepo, err := OpenRepository(ctx, repo) + gitRepo, err := OpenRepository(repo) if err != nil { return nil, 0, err } defer gitRepo.Close() - return gitRepo.GetBranchNames(skip, limit) + return gitRepo.GetBranchNames(ctx, skip, limit) } func GetBranchCommitID(ctx context.Context, repo Repository, branch string) (string, error) { - gitRepo, err := OpenRepository(ctx, repo) + gitRepo, err := OpenRepository(repo) if err != nil { return "", err } defer gitRepo.Close() - return gitRepo.GetBranchCommitID(branch) + return gitRepo.GetBranchCommitID(ctx, branch) } // SetDefaultBranch sets default branch of repository. diff --git a/modules/gitrepo/gitrepo.go b/modules/gitrepo/gitrepo.go index 59d2323599211..58aa2c5697596 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/gitrepo/gitrepo.go @@ -27,8 +27,8 @@ var repoPath = func(repo Repository) string { } // OpenRepository opens the repository at the given relative path with the provided context. -func OpenRepository(ctx context.Context, repo Repository) (*git.Repository, error) { - return git.OpenRepository(ctx, repoPath(repo)) +func OpenRepository(repo Repository) (*git.Repository, error) { + return git.OpenRepository(repoPath(repo)) } // contextKey is a value for use with context.WithValue. @@ -44,7 +44,7 @@ func RepositoryFromContextOrOpen(ctx context.Context, repo Repository) (*git.Rep gitRepo, err := RepositoryFromRequestContextOrOpen(reqCtx, repo) return gitRepo, util.NopCloser{}, err } - gitRepo, err := OpenRepository(ctx, repo) + gitRepo, err := OpenRepository(repo) return gitRepo, gitRepo, err } @@ -55,7 +55,7 @@ func RepositoryFromRequestContextOrOpen(ctx reqctx.RequestContext, repo Reposito if gitRepo, ok := ctx.Value(ck).(*git.Repository); ok { return gitRepo, nil } - gitRepo, err := git.OpenRepository(ctx, ck.repoPath) + gitRepo, err := git.OpenRepository(ck.repoPath) if err != nil { return nil, err } diff --git a/modules/indexer/code/git.go b/modules/indexer/code/git.go index ca9c6a2974885..74e38c003862e 100644 --- a/modules/indexer/code/git.go +++ b/modules/indexer/code/git.go @@ -64,7 +64,7 @@ func isIndexable(entry *git.TreeEntry) bool { } // parseGitLsTreeOutput parses the output of a `git ls-tree -r --full-name` command -func parseGitLsTreeOutput(stdout []byte) ([]internal.FileUpdate, error) { +func parseGitLsTreeOutput(ctx context.Context, stdout []byte) ([]internal.FileUpdate, error) { entries, err := git.ParseTreeEntries(stdout) if err != nil { return nil, err @@ -76,7 +76,7 @@ func parseGitLsTreeOutput(stdout []byte) ([]internal.FileUpdate, error) { updates[idxCount] = internal.FileUpdate{ Filename: entry.Name(), BlobSha: entry.ID.String(), - Size: entry.Size(), + Size: entry.Size(ctx), Sized: true, } idxCount++ @@ -94,7 +94,7 @@ func genesisChanges(ctx context.Context, repo *repo_model.Repository, revision s } var err error - changes.Updates, err = parseGitLsTreeOutput(stdout) + changes.Updates, err = parseGitLsTreeOutput(ctx, stdout) return &changes, err } @@ -124,7 +124,7 @@ func nonGenesisChanges(ctx context.Context, repo *repo_model.Repository, revisio return err } - updates, err1 := parseGitLsTreeOutput(lsTreeStdout) + updates, err1 := parseGitLsTreeOutput(ctx, lsTreeStdout) if err1 != nil { return err1 } diff --git a/modules/indexer/code/gitgrep/gitgrep.go b/modules/indexer/code/gitgrep/gitgrep.go index 6f6e0b47b9e2e..c3992a5fdc7b6 100644 --- a/modules/indexer/code/gitgrep/gitgrep.go +++ b/modules/indexer/code/gitgrep/gitgrep.go @@ -42,7 +42,7 @@ func PerformSearch(ctx context.Context, page int, repoID int64, gitRepo *git.Rep // TODO: if no branch exists, it reports: exit status 128, fatal: this operation must be run in a work tree. return nil, 0, fmt.Errorf("git.GrepSearch: %w", err) } - commitID, err := gitRepo.GetRefCommitID(ref.String()) + commitID, err := gitRepo.GetRefCommitID(ctx, ref.String()) if err != nil { return nil, 0, fmt.Errorf("gitRepo.GetRefCommitID: %w", err) } diff --git a/modules/indexer/stats/db.go b/modules/indexer/stats/db.go index 199d493e97d21..951e9c8c44acb 100644 --- a/modules/indexer/stats/db.go +++ b/modules/indexer/stats/db.go @@ -37,7 +37,7 @@ func (db *DBIndexer) Index(id int64) error { return err } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { if err.Error() == "no such file or directory" { return nil @@ -47,7 +47,7 @@ func (db *DBIndexer) Index(id int64) error { defer gitRepo.Close() // Get latest commit for default branch - commitID, err := gitRepo.GetBranchCommitID(repo.DefaultBranch) + commitID, err := gitRepo.GetBranchCommitID(ctx, repo.DefaultBranch) if err != nil { if git.IsErrBranchNotExist(err) || git.IsErrNotExist(err) || setting.IsInTesting { log.Debug("Unable to get commit ID for default branch %s in %s ... skipping this repository", repo.DefaultBranch, repo.FullName()) @@ -63,7 +63,7 @@ func (db *DBIndexer) Index(id int64) error { } // Calculate and save language statistics to database - stats, err := languagestats.GetLanguageStats(gitRepo, commitID) + stats, err := languagestats.GetLanguageStats(ctx, gitRepo, commitID) if err != nil { if !setting.IsInTesting { log.Error("Unable to get language stats for ID %s for default branch %s in %s. Error: %v", commitID, repo.DefaultBranch, repo.FullName(), err) diff --git a/modules/issue/template/unmarshal.go b/modules/issue/template/unmarshal.go index 1d8e9dd02d995..6cf4113b94535 100644 --- a/modules/issue/template/unmarshal.go +++ b/modules/issue/template/unmarshal.go @@ -4,6 +4,7 @@ package template import ( + "context" "fmt" "io" "path" @@ -42,35 +43,35 @@ func Unmarshal(filename string, content []byte) (*api.IssueTemplate, error) { } // UnmarshalFromEntry parses out a valid template from the blob in entry -func UnmarshalFromEntry(entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) { - return unmarshalFromEntry(entry, path.Join(dir, entry.Name())) // Filepaths in Git are ALWAYS '/' separated do not use filepath here +func UnmarshalFromEntry(ctx context.Context, entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) { + return unmarshalFromEntry(ctx, entry, path.Join(dir, entry.Name())) // Filepaths in Git are ALWAYS '/' separated do not use filepath here } // UnmarshalFromCommit parses out a valid template from the commit -func UnmarshalFromCommit(commit *git.Commit, filename string) (*api.IssueTemplate, error) { - entry, err := commit.GetTreeEntryByPath(filename) +func UnmarshalFromCommit(ctx context.Context, commit *git.Commit, filename string) (*api.IssueTemplate, error) { + entry, err := commit.GetTreeEntryByPath(ctx, filename) if err != nil { return nil, fmt.Errorf("get entry for %q: %w", filename, err) } - return unmarshalFromEntry(entry, filename) + return unmarshalFromEntry(ctx, entry, filename) } // UnmarshalFromRepo parses out a valid template from the head commit of the branch -func UnmarshalFromRepo(repo *git.Repository, branch, filename string) (*api.IssueTemplate, error) { - commit, err := repo.GetBranchCommit(branch) +func UnmarshalFromRepo(ctx context.Context, repo *git.Repository, branch, filename string) (*api.IssueTemplate, error) { + commit, err := repo.GetBranchCommit(ctx, branch) if err != nil { return nil, fmt.Errorf("get commit on branch %q: %w", branch, err) } - return UnmarshalFromCommit(commit, filename) + return UnmarshalFromCommit(ctx, commit, filename) } -func unmarshalFromEntry(entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) { - if size := entry.Blob().Size(); size > setting.UI.MaxDisplayFileSize { +func unmarshalFromEntry(ctx context.Context, entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) { + if size := entry.Blob().Size(ctx); size > setting.UI.MaxDisplayFileSize { return nil, fmt.Errorf("too large: %v > MaxDisplayFileSize", size) } - r, err := entry.Blob().DataAsync() + r, err := entry.Blob().DataAsync(ctx) if err != nil { return nil, fmt.Errorf("data async: %w", err) } diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 30aa0a6e85ec1..a41743099fe72 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -26,7 +26,7 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error) log.Debug("SyncRepoBranches: in Repo[%d:%s]", repo.ID, repo.FullName()) - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Error("OpenRepository[%s]: %w", repo.FullName(), err) return 0, err @@ -37,7 +37,7 @@ func SyncRepoBranches(ctx context.Context, repoID, doerID int64) (int64, error) } func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, doerID int64) (int64, error) { - objFmt, err := gitRepo.GetObjectFormat() + objFmt, err := gitRepo.GetObjectFormat(ctx) if err != nil { return 0, fmt.Errorf("GetObjectFormat: %w", err) } @@ -50,7 +50,7 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, allBranches := container.Set[string]{} { - branches, _, err := gitRepo.GetBranchNames(0, 0) + branches, _, err := gitRepo.GetBranchNames(ctx, 0, 0) if err != nil { return 0, err } @@ -79,7 +79,7 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, var toRemove []int64 for branch := range allBranches { dbb := dbBranches[branch] - commit, err := gitRepo.GetBranchCommit(branch) + commit, err := gitRepo.GetBranchCommit(ctx, branch) if err != nil { return 0, err } diff --git a/modules/repository/repo.go b/modules/repository/repo.go index ad4a53b858cb3..413a178f8332f 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -47,7 +47,7 @@ func SyncRepoTags(ctx context.Context, repoID int64) error { return err } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return err } @@ -179,7 +179,7 @@ func (shortRelease) TableName() string { // repositories like https://github.com/vim/vim (with over 13000 tags). func SyncReleasesWithTags(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository) error { log.Debug("SyncReleasesWithTags: in Repo[%d:%s/%s]", repo.ID, repo.OwnerName, repo.Name) - tags, _, err := gitRepo.GetTagInfos(0, 0) + tags, _, err := gitRepo.GetTagInfos(ctx, 0, 0) if err != nil { return fmt.Errorf("unable to GetTagInfos in pull-mirror Repo[%d:%s/%s]: %w", repo.ID, repo.OwnerName, repo.Name, err) } diff --git a/routers/api/v1/repo/blob.go b/routers/api/v1/repo/blob.go index 9a17fc1bbfd2c..d1cb72f5f1f74 100644 --- a/routers/api/v1/repo/blob.go +++ b/routers/api/v1/repo/blob.go @@ -47,7 +47,7 @@ func GetBlob(ctx *context.APIContext) { return } - if blob, err := files_service.GetBlobBySHA(ctx.Repo.Repository, ctx.Repo.GitRepo, sha); err != nil { + if blob, err := files_service.GetBlobBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, sha); err != nil { ctx.APIError(http.StatusBadRequest, err) } else { ctx.JSON(http.StatusOK, blob) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 65fac45aa11f2..23357ee1187fe 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -68,7 +68,7 @@ func GetBranch(ctx *context.APIContext) { return } - c, err := ctx.Repo.GitRepo.GetBranchCommit(branchName) + c, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, branchName) if err != nil { ctx.APIErrorInternal(err) return @@ -219,14 +219,14 @@ func CreateBranch(ctx *context.APIContext) { var err error if len(opt.OldRefName) > 0 { - oldCommit, err = ctx.Repo.GitRepo.GetCommit(opt.OldRefName) + oldCommit, err = ctx.Repo.GitRepo.GetCommit(ctx, opt.OldRefName) if err != nil { ctx.APIErrorInternal(err) return } } else if len(opt.OldBranchName) > 0 { //nolint:staticcheck // deprecated field if gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, opt.OldBranchName) { //nolint:staticcheck // deprecated field - oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(opt.OldBranchName) //nolint:staticcheck // deprecated field + oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, opt.OldBranchName) //nolint:staticcheck // deprecated field if err != nil { ctx.APIErrorInternal(err) return @@ -236,7 +236,7 @@ func CreateBranch(ctx *context.APIContext) { return } } else { - oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultBranch) if err != nil { ctx.APIErrorInternal(err) return @@ -259,7 +259,7 @@ func CreateBranch(ctx *context.APIContext) { return } - commit, err := ctx.Repo.GitRepo.GetBranchCommit(opt.BranchName) + commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, opt.BranchName) if err != nil { ctx.APIErrorInternal(err) return @@ -354,7 +354,7 @@ func ListBranches(ctx *context.APIContext) { apiBranches = make([]*api.Branch, 0, len(branches)) for i := range branches { - c, err := ctx.Repo.GitRepo.GetBranchCommit(branches[i].Name) + c, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, branches[i].Name) if err != nil { // Skip if this branch doesn't exist anymore. if git.IsErrNotExist(err) { diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go index 6a93be624f615..b91916b5e52a0 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -73,7 +73,7 @@ func GetSingleCommit(ctx *context.APIContext) { } func getCommit(ctx *context.APIContext, identifier string, toCommitOpts convert.ToCommitOptions) { - commit, err := ctx.Repo.GitRepo.GetCommit(identifier) + commit, err := ctx.Repo.GitRepo.GetCommit(ctx, identifier) if err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound("commit doesn't exist: " + identifier) @@ -207,14 +207,14 @@ func GetAllCommits(ctx *context.APIContext) { var baseCommit *git.Commit if len(sha) == 0 { // no sha supplied - use default branch - baseCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + baseCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultBranch) if err != nil { ctx.APIErrorInternal(err) return } } else { // get commit specified by sha - baseCommit, err = ctx.Repo.GitRepo.GetCommit(sha) + baseCommit, err = ctx.Repo.GitRepo.GetCommit(ctx, sha) if err != nil { ctx.NotFoundOrServerError(err) return @@ -222,7 +222,7 @@ func GetAllCommits(ctx *context.APIContext) { } // Total commit count - commitsCountTotal, err = git.CommitsCount(ctx.Repo.GitRepo.Ctx, git.CommitsCountOptions{ + commitsCountTotal, err = git.CommitsCount(ctx, git.CommitsCountOptions{ RepoPath: ctx.Repo.GitRepo.Path, Not: not, Revision: []string{baseCommit.ID.String()}, @@ -235,7 +235,7 @@ func GetAllCommits(ctx *context.APIContext) { } // Query commits - commits, err = baseCommit.CommitsByRange(listOptions.Page, listOptions.PageSize, not, since, until) + commits, err = baseCommit.CommitsByRange(ctx, listOptions.Page, listOptions.PageSize, not, since, until) if err != nil { ctx.APIErrorInternal(err) return @@ -264,6 +264,7 @@ func GetAllCommits(ctx *context.APIContext) { } commits, err = ctx.Repo.GitRepo.CommitsByFileAndRange( + ctx, git.CommitsByFileAndRangeOptions{ Revision: sha, File: path, @@ -342,7 +343,7 @@ func DownloadCommitDiffOrPatch(ctx *context.APIContext) { sha := ctx.PathParam("sha") diffType := git.RawDiffType(ctx.PathParam("diffType")) - if err := git.GetRawDiff(ctx.Repo.GitRepo, sha, diffType, ctx.Resp); err != nil { + if err := git.GetRawDiff(ctx, ctx.Repo.GitRepo, sha, diffType, ctx.Resp); err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound("commit doesn't exist: " + sha) return diff --git a/routers/api/v1/repo/download.go b/routers/api/v1/repo/download.go index ea5846d343112..a3e6dc116cc64 100644 --- a/routers/api/v1/repo/download.go +++ b/routers/api/v1/repo/download.go @@ -13,7 +13,7 @@ import ( ) func serveRepoArchive(ctx *context.APIContext, reqFileName string) { - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, reqFileName) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, reqFileName) if err != nil { if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) { ctx.APIError(http.StatusBadRequest, err) diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 2b6348c2fb1eb..22afbf74e9c47 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -136,7 +136,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { ctx.RespHeader().Set(giteaObjectTypeHeader, string(files_service.GetObjectTypeFromTreeEntry(entry))) // LFS Pointer files are at most 1024 bytes - so any blob greater than 1024 bytes cannot be an LFS file - if blob.Size() > lfs.MetaFileMaxSize { + if blob.Size(ctx) > lfs.MetaFileMaxSize { // First handle caching for the blob if httpcache.HandleGenericETagTimeCache(ctx.Req, ctx.Resp, `"`+blob.ID.String()+`"`, lastModified) { return @@ -151,7 +151,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { // OK, now the blob is known to have at most 1024 (lfs pointer max size) bytes, // we can simply read this in one go (This saves reading it twice) - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { ctx.APIErrorInternal(err) return @@ -179,7 +179,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { } // If not cached - serve! - common.ServeContentByReader(ctx.Base, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf)) + common.ServeContentByReader(ctx.Base, ctx.Repo.TreePath, blob.Size(ctx), bytes.NewReader(buf)) return } @@ -193,7 +193,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { return } - common.ServeContentByReader(ctx.Base, ctx.Repo.TreePath, blob.Size(), bytes.NewReader(buf)) + common.ServeContentByReader(ctx.Base, ctx.Repo.TreePath, blob.Size(ctx), bytes.NewReader(buf)) return } else if err != nil { ctx.APIErrorInternal(err) @@ -225,7 +225,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { } func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEntry, lastModified *time.Time) { - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound() @@ -240,7 +240,7 @@ func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEn return nil, nil, nil } - latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) + latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx, ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) if err != nil { ctx.APIErrorInternal(err) return nil, nil, nil @@ -316,7 +316,7 @@ func GetEditorconfig(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - ec, _, err := ctx.Repo.GetEditorconfig(ctx.Repo.Commit) + ec, _, err := ctx.Repo.GetEditorconfig(ctx, ctx.Repo.Commit) if err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound(err) diff --git a/routers/api/v1/repo/notes.go b/routers/api/v1/repo/notes.go index 87efb1caf2676..df9db7e10e2eb 100644 --- a/routers/api/v1/repo/notes.go +++ b/routers/api/v1/repo/notes.go @@ -66,7 +66,7 @@ func getNote(ctx *context.APIContext, identifier string) { return } - commitID, err := ctx.Repo.GitRepo.ConvertToGitID(identifier) + commitID, err := ctx.Repo.GitRepo.ConvertToGitID(ctx, identifier) if err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound(err) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 22851ad2c5207..8e9012afeb35a 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1055,7 +1055,7 @@ func MergePullRequest(ctx *context.APIContext) { if ctx.Repo != nil && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID == pr.HeadRepoID && ctx.Repo.GitRepo != nil { headRepo = ctx.Repo.GitRepo } else { - headRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) + headRepo, err = gitrepo.OpenRepository(pr.HeadRepo) if err != nil { ctx.APIErrorInternal(err) return @@ -1149,7 +1149,7 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) headGitRepo = ctx.Repo.GitRepo closer = func() {} // no need to close the head repo because it shares the base repo } else { - headGitRepo, err = gitrepo.OpenRepository(ctx, headRepo) + headGitRepo, err = gitrepo.OpenRepository(headRepo) if err != nil { ctx.APIErrorInternal(err) return nil, nil @@ -1188,8 +1188,8 @@ func parseCompareInfo(ctx *context.APIContext, form api.CreatePullRequestOption) return nil, nil } - baseRef := ctx.Repo.GitRepo.UnstableGuessRefByShortName(baseRefToGuess) - headRef := headGitRepo.UnstableGuessRefByShortName(headRefToGuess) + baseRef := ctx.Repo.GitRepo.UnstableGuessRefByShortName(ctx, baseRefToGuess) + headRef := headGitRepo.UnstableGuessRefByShortName(ctx, headRefToGuess) log.Trace("Repo path: %q, base ref: %q->%q, head ref: %q->%q", ctx.Repo.GitRepo.Path, baseRefToGuess, baseRef, headRefToGuess, headRef) @@ -1593,7 +1593,7 @@ func GetPullRequestFiles(ctx *context.APIContext) { return } - headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := baseGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 3c00193fac1d9..6fe04b97a1643 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -336,7 +336,7 @@ func CreatePullReview(ctx *context.APIContext) { } defer closer.Close() - headCommitID, err := gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { ctx.APIErrorInternal(err) return @@ -455,7 +455,7 @@ func SubmitPullReview(ctx *context.APIContext) { return } - headCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go index 272b395dfb983..b37785b55dccc 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -249,7 +249,7 @@ func CreateRelease(ctx *context.APIContext) { } // GitHub doesn't have "tag_message", GitLab has: https://docs.gitlab.com/api/releases/#create-a-release // It doesn't need to be the same as the "release note" - if err := release_service.CreateRelease(ctx.Repo.GitRepo, rel, nil, form.TagMessage); err != nil { + if err := release_service.CreateRelease(ctx, ctx.Repo.GitRepo, rel, nil, form.TagMessage); err != nil { if repo_model.IsErrReleaseAlreadyExist(err) { ctx.APIError(http.StatusConflict, err) } else if release_service.IsErrProtectedTagName(err) { diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 2f5a969b6b720..0f94c5942821c 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -1193,7 +1193,7 @@ func GetIssueTemplates(ctx *context.APIContext) { // "$ref": "#/responses/IssueTemplates" // "404": // "$ref": "#/responses/notFound" - ret := issue.ParseTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + ret := issue.ParseTemplatesFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) if cnt := len(ret.TemplateErrors); cnt != 0 { ctx.Resp.Header().Add("X-Gitea-Warning", "error occurs when parsing issue template: count="+strconv.Itoa(cnt)) } @@ -1223,7 +1223,7 @@ func GetIssueConfig(ctx *context.APIContext) { // "$ref": "#/responses/RepoIssueConfig" // "404": // "$ref": "#/responses/notFound" - issueConfig, _ := issue.GetTemplateConfigFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + issueConfig, _ := issue.GetTemplateConfigFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.JSON(http.StatusOK, issueConfig) } @@ -1250,7 +1250,7 @@ func ValidateIssueConfig(ctx *context.APIContext) { // "$ref": "#/responses/RepoIssueConfigValidation" // "404": // "$ref": "#/responses/notFound" - _, err := issue.GetTemplateConfigFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + _, err := issue.GetTemplateConfigFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) if err == nil { ctx.JSON(http.StatusOK, api.IssueConfigValidation{Valid: true, Message: ""}) diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go index 9e77637282a3e..990dd9549a657 100644 --- a/routers/api/v1/repo/tag.go +++ b/routers/api/v1/repo/tag.go @@ -55,7 +55,7 @@ func ListTags(ctx *context.APIContext) { listOpts := utils.GetListOptions(ctx) - tags, total, err := ctx.Repo.GitRepo.GetTagInfos(listOpts.Page, listOpts.PageSize) + tags, total, err := ctx.Repo.GitRepo.GetTagInfos(ctx, listOpts.Page, listOpts.PageSize) if err != nil { ctx.APIErrorInternal(err) return @@ -107,10 +107,10 @@ func GetAnnotatedTag(ctx *context.APIContext) { return } - if tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(sha); err != nil { + if tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(ctx, sha); err != nil { ctx.APIError(http.StatusBadRequest, err) } else { - commit, err := ctx.Repo.GitRepo.GetTagCommit(tag.Name) + commit, err := ctx.Repo.GitRepo.GetTagCommit(ctx, tag.Name) if err != nil { ctx.APIError(http.StatusBadRequest, err) } @@ -148,7 +148,7 @@ func GetTag(ctx *context.APIContext) { // "$ref": "#/responses/notFound" tagName := ctx.PathParam("*") - tag, err := ctx.Repo.GitRepo.GetTag(tagName) + tag, err := ctx.Repo.GitRepo.GetTag(ctx, tagName) if err != nil { ctx.APIErrorNotFound("tag doesn't exist: " + tagName) return @@ -198,7 +198,7 @@ func CreateTag(ctx *context.APIContext) { form.Target = ctx.Repo.Repository.DefaultBranch } - commit, err := ctx.Repo.GitRepo.GetCommit(form.Target) + commit, err := ctx.Repo.GitRepo.GetCommit(ctx, form.Target) if err != nil { ctx.APIError(http.StatusNotFound, fmt.Errorf("target not found: %w", err)) return @@ -218,7 +218,7 @@ func CreateTag(ctx *context.APIContext) { return } - tag, err := ctx.Repo.GitRepo.GetTag(form.TagName) + tag, err := ctx.Repo.GitRepo.GetTag(ctx, form.TagName) if err != nil { ctx.APIErrorInternal(err) return diff --git a/routers/api/v1/repo/wiki.go b/routers/api/v1/repo/wiki.go index 8e24ffa465c14..0264a32936322 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -4,6 +4,7 @@ package repo import ( + stdCtx "context" "encoding/base64" "fmt" "net/http" @@ -193,10 +194,10 @@ func getWikiPage(ctx *context.APIContext, wikiName wiki_service.WebPath) *api.Wi } // get commit count - wiki revisions - commitsCount, _ := wikiRepo.FileCommitsCount(ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := wikiRepo.FileCommitsCount(ctx, ctx.Repo.Repository.DefaultWikiBranch, pageFilename) // Get last change information. - lastCommit, err := wikiRepo.GetCommitByPath(pageFilename) + lastCommit, err := wikiRepo.GetCommitByPath(ctx, pageFilename) if err != nil { ctx.APIErrorInternal(err) return nil @@ -307,7 +308,7 @@ func ListWikiPages(ctx *context.APIContext) { skip := (page - 1) * limit maxNum := page * limit - entries, err := commit.ListEntries() + entries, err := commit.ListEntries(ctx) if err != nil { ctx.APIErrorInternal(err) return @@ -317,7 +318,7 @@ func ListWikiPages(ctx *context.APIContext) { if i < skip || i >= maxNum || !entry.IsRegular() { continue } - c, err := wikiRepo.GetCommitByPath(entry.Name()) + c, err := wikiRepo.GetCommitByPath(ctx, entry.Name()) if err != nil { ctx.APIErrorInternal(err) return @@ -429,12 +430,13 @@ func ListPageRevisions(ctx *context.APIContext) { } // get commit count - wiki revisions - commitsCount, _ := wikiRepo.FileCommitsCount(ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := wikiRepo.FileCommitsCount(ctx, ctx.Repo.Repository.DefaultWikiBranch, pageFilename) page := max(ctx.FormInt("page"), 1) // get Commit Count commitsHistory, err := wikiRepo.CommitsByFileAndRange( + ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.Repository.DefaultWikiBranch, File: pageFilename, @@ -450,8 +452,8 @@ func ListPageRevisions(ctx *context.APIContext) { } // findEntryForFile finds the tree entry for a target filepath. -func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) { - entry, err := commit.GetTreeEntryByPath(target) +func findEntryForFile(ctx stdCtx.Context, commit *git.Commit, target string) (*git.TreeEntry, error) { + entry, err := commit.GetTreeEntryByPath(ctx, target) if err != nil { return nil, err } @@ -464,13 +466,13 @@ func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) if unescapedTarget, err = url.QueryUnescape(target); err != nil { return nil, err } - return commit.GetTreeEntryByPath(unescapedTarget) + return commit.GetTreeEntryByPath(ctx, unescapedTarget) } // findWikiRepoCommit opens the wiki repo and returns the latest commit, writing to context on error. // The caller is responsible for closing the returned repo again func findWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit) { - wikiRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository.WikiStorageRepo()) + wikiRepo, err := gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { if git.IsErrNotExist(err) || err.Error() == "no such file or directory" { ctx.APIErrorNotFound(err) @@ -480,7 +482,7 @@ func findWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit) return nil, nil } - commit, err := wikiRepo.GetBranchCommit(ctx.Repo.Repository.DefaultWikiBranch) + commit, err := wikiRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultWikiBranch) if err != nil { if git.IsErrNotExist(err) { ctx.APIErrorNotFound(err) @@ -496,10 +498,10 @@ func findWikiRepoCommit(ctx *context.APIContext) (*git.Repository, *git.Commit) // given tree entry, encoded with base64. Writes to ctx if an error occurs. func wikiContentsByEntry(ctx *context.APIContext, entry *git.TreeEntry) string { blob := entry.Blob() - if blob.Size() > setting.API.DefaultMaxBlobSize { + if blob.Size(ctx) > setting.API.DefaultMaxBlobSize { return "" } - content, err := blob.GetBlobContentBase64(nil) + content, err := blob.GetBlobContentBase64(ctx, nil) if err != nil { ctx.APIErrorInternal(err) return "" @@ -511,7 +513,7 @@ func wikiContentsByEntry(ctx *context.APIContext, entry *git.TreeEntry) string { // indicating whether the page exists. Writes to ctx if an error occurs. func wikiContentsByName(ctx *context.APIContext, commit *git.Commit, wikiName wiki_service.WebPath, isSidebarOrFooter bool) (string, string) { gitFilename := wiki_service.WebPathToGitPath(wikiName) - entry, err := findEntryForFile(commit, gitFilename) + entry, err := findEntryForFile(ctx, commit, gitFilename) if err != nil { if git.IsErrNotExist(err) { if !isSidebarOrFooter { diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go index 1cfe01a639903..3dc5afdc8a042 100644 --- a/routers/api/v1/utils/git.go +++ b/routers/api/v1/utils/git.go @@ -37,7 +37,7 @@ func ResolveRefCommit(ctx reqctx.RequestContext, repo *repo_model.Repository, in if refCommit.RefName == "" { return nil, git.ErrNotExist{ID: inputRef} } - if refCommit.Commit, err = gitRepo.GetCommit(refCommit.RefName.String()); err != nil { + if refCommit.Commit, err = gitRepo.GetCommit(ctx, refCommit.RefName.String()); err != nil { return nil, err } refCommit.CommitID = refCommit.Commit.ID.String() @@ -56,6 +56,6 @@ func GetGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, strin if len(filter) > 0 { filter = "refs/" + filter } - refs, err := ctx.Repo.GitRepo.GetRefsFiltered(filter) + refs, err := ctx.Repo.GitRepo.GetRefsFiltered(ctx, filter) return refs, "GetRefsFiltered", err } diff --git a/routers/common/serve.go b/routers/common/serve.go index 862230b30f048..3c9ce013eb151 100644 --- a/routers/common/serve.go +++ b/routers/common/serve.go @@ -24,7 +24,7 @@ func ServeBlob(ctx *context.Base, repo *repo_model.Repository, filePath string, return nil } - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { return err } @@ -35,7 +35,7 @@ func ServeBlob(ctx *context.Base, repo *repo_model.Repository, filePath string, }() _ = repo.LoadOwner(ctx) - httplib.ServeContentByReader(ctx.Req, ctx.Resp, blob.Size(), dataRc, &httplib.ServeHeaderOptions{ + httplib.ServeContentByReader(ctx.Req, ctx.Resp, blob.Size(ctx), dataRc, &httplib.ServeHeaderOptions{ Filename: path.Base(filePath), CacheIsPublic: !repo.IsPrivate && repo.Owner != nil && repo.Owner.Visibility == structs.VisibleTypePublic, CacheDuration: setting.StaticCacheTime, diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index e8bef7d6c14bb..ceee7b449cf91 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -122,7 +122,7 @@ func HookPostReceive(ctx *gitea_context.PrivateContext) { } if len(branchesToSync) > 0 { var err error - gitRepo, err = gitrepo.OpenRepository(ctx, repo) + gitRepo, err = gitrepo.OpenRepository(repo) if err != nil { log.Error("Failed to open repository: %s/%s Error: %v", ownerName, repoName, err) ctx.JSON(http.StatusInternalServerError, private.HookPostReceiveResult{ diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 9d69bbcedfaba..91b474a5d2db6 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -216,7 +216,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r // 3. Enforce require signed commits if protectBranch.RequireSignedCommits { - err := verifyCommits(oldCommitID, newCommitID, gitRepo, ctx.env) + err := verifyCommits(ctx, oldCommitID, newCommitID, gitRepo, ctx.env) if err != nil { if !isErrUnverifiedCommit(err) { log.Error("Unable to check commits from %s to %s in %-v: %v", oldCommitID, newCommitID, repo, err) @@ -242,7 +242,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r globs := protectBranch.GetProtectedFilePatterns() if len(globs) > 0 { - _, err := pull_service.CheckFileProtection(gitRepo, branchName, oldCommitID, newCommitID, globs, 1, ctx.env) + _, err := pull_service.CheckFileProtection(ctx, gitRepo, branchName, oldCommitID, newCommitID, globs, 1, ctx.env) if err != nil { if !pull_service.IsErrFilePathProtected(err) { log.Error("Unable to check file protection for commits from %s to %s in %-v: %v", oldCommitID, newCommitID, repo, err) @@ -300,7 +300,7 @@ func preReceiveBranch(ctx *preReceiveContext, oldCommitID, newCommitID string, r // Allow commits that only touch unprotected files globs := protectBranch.GetUnprotectedFilePatterns() if len(globs) > 0 { - unprotectedFilesOnly, err := pull_service.CheckUnprotectedFiles(gitRepo, branchName, oldCommitID, newCommitID, globs, ctx.env) + unprotectedFilesOnly, err := pull_service.CheckUnprotectedFiles(ctx, gitRepo, branchName, oldCommitID, newCommitID, globs, ctx.env) if err != nil { log.Error("Unable to check file protection for commits from %s to %s in %-v: %v", oldCommitID, newCommitID, repo, err) ctx.JSON(http.StatusInternalServerError, private.Response{ diff --git a/routers/private/hook_verification.go b/routers/private/hook_verification.go index 9c357f4b41c6f..9d04e627f97c3 100644 --- a/routers/private/hook_verification.go +++ b/routers/private/hook_verification.go @@ -17,7 +17,7 @@ import ( // This file contains commit verification functions for refs passed across in hooks -func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env []string) error { +func verifyCommits(ctx context.Context, oldCommitID, newCommitID string, repo *git.Repository, env []string) error { stdoutReader, stdoutWriter, err := os.Pipe() if err != nil { log.Error("Unable to create os.Pipe for %s", repo.Path) @@ -29,7 +29,7 @@ func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env [] }() var command *gitcmd.Command - objectFormat, _ := repo.GetObjectFormat() + objectFormat, _ := repo.GetObjectFormat(ctx) if oldCommitID == objectFormat.EmptyObjectID().String() { // When creating a new branch, the oldCommitID is empty, by using "newCommitID --not --all": // List commits that are reachable by following the newCommitID, exclude "all" existing heads/tags commits @@ -44,7 +44,7 @@ func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env [] WithStdout(stdoutWriter). WithPipelineFunc(func(ctx context.Context, cancel context.CancelFunc) error { _ = stdoutWriter.Close() - err := readAndVerifyCommitsFromShaReader(stdoutReader, repo, env) + err := readAndVerifyCommitsFromShaReader(ctx, stdoutReader, repo, env) if err != nil { log.Error("readAndVerifyCommitsFromShaReader failed: %v", err) cancel() @@ -52,18 +52,18 @@ func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env [] _ = stdoutReader.Close() return err }). - Run(repo.Ctx) + Run(ctx) if err != nil && !isErrUnverifiedCommit(err) { log.Error("Unable to check commits from %s to %s in %s: %v", oldCommitID, newCommitID, repo.Path, err) } return err } -func readAndVerifyCommitsFromShaReader(input io.ReadCloser, repo *git.Repository, env []string) error { +func readAndVerifyCommitsFromShaReader(ctx context.Context, input io.ReadCloser, repo *git.Repository, env []string) error { scanner := bufio.NewScanner(input) for scanner.Scan() { line := scanner.Text() - err := readAndVerifyCommit(line, repo, env) + err := readAndVerifyCommit(ctx, line, repo, env) if err != nil { return err } @@ -71,7 +71,7 @@ func readAndVerifyCommitsFromShaReader(input io.ReadCloser, repo *git.Repository return scanner.Err() } -func readAndVerifyCommit(sha string, repo *git.Repository, env []string) error { +func readAndVerifyCommit(ctx context.Context, sha string, repo *git.Repository, env []string) error { stdoutReader, stdoutWriter, err := os.Pipe() if err != nil { log.Error("Unable to create pipe for %s: %v", repo.Path, err) @@ -103,7 +103,7 @@ func readAndVerifyCommit(sha string, repo *git.Repository, env []string) error { } return nil }). - Run(repo.Ctx) + Run(ctx) } type errUnverifiedCommit struct { diff --git a/routers/private/hook_verification_test.go b/routers/private/hook_verification_test.go index 8653e34daa424..9ec1c5d856224 100644 --- a/routers/private/hook_verification_test.go +++ b/routers/private/hook_verification_test.go @@ -17,13 +17,13 @@ var testReposDir = "tests/repos/" func TestVerifyCommits(t *testing.T) { unittest.PrepareTestEnv(t) - gitRepo, err := git.OpenRepository(t.Context(), testReposDir+"repo1_hook_verification") + gitRepo, err := git.OpenRepository(testReposDir + "repo1_hook_verification") if err != nil { defer gitRepo.Close() } assert.NoError(t, err) - objectFormat, err := gitRepo.GetObjectFormat() + objectFormat, err := gitRepo.GetObjectFormat(t.Context()) assert.NoError(t, err) testCases := []struct { @@ -37,7 +37,7 @@ func TestVerifyCommits(t *testing.T) { } for _, tc := range testCases { - err = verifyCommits(tc.base, tc.head, gitRepo, nil) + err = verifyCommits(t.Context(), tc.base, tc.head, gitRepo, nil) if tc.verified { assert.NoError(t, err) } else { diff --git a/routers/web/feed/branch.go b/routers/web/feed/branch.go index eb7f6dc5bc572..7689ed244d120 100644 --- a/routers/web/feed/branch.go +++ b/routers/web/feed/branch.go @@ -19,7 +19,7 @@ func ShowBranchFeed(ctx *context.Context, repo *repo.Repository, formatType stri var commits []*git.Commit var err error if ctx.Repo.Commit != nil { - commits, err = ctx.Repo.Commit.CommitsByRange(0, 10, "", "", "") + commits, err = ctx.Repo.Commit.CommitsByRange(ctx, 0, 10, "", "", "") if err != nil { ctx.ServerError("ShowBranchFeed", err) return diff --git a/routers/web/feed/file.go b/routers/web/feed/file.go index 026c15c43a575..ff5608931cd64 100644 --- a/routers/web/feed/file.go +++ b/routers/web/feed/file.go @@ -22,6 +22,7 @@ func ShowFileFeed(ctx *context.Context, repo *repo.Repository, formatType string return } commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange( + ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.RefFullName.ShortName(), // FIXME: legacy code used ShortName File: fileName, diff --git a/routers/web/org/home.go b/routers/web/org/home.go index 63ae6c683b54f..b3aa353747d55 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -173,7 +173,7 @@ func prepareOrgProfileReadme(ctx *context.Context, prepareResult *shared_user.Pr return false } - readmeBytes, err := readmeBlob.GetBlobContent(setting.UI.MaxDisplayFileSize) + readmeBytes, err := readmeBlob.GetBlobContent(ctx, setting.UI.MaxDisplayFileSize) if err != nil { log.Error("failed to GetBlobContent for profile %q (view as %q) readme: %v", profileRepo.FullName(), viewAs, err) return false diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go index 202da407d298b..06481e6936cb7 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -67,7 +67,7 @@ func List(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("actions.actions") ctx.Data["PageIsActions"] = true - commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultBranch) if errors.Is(err, util.ErrNotExist) { ctx.Data["NotFoundPrompt"] = ctx.Tr("repo.branch.default_branch_not_exist", ctx.Repo.Repository.DefaultBranch) ctx.NotFound(nil) @@ -101,9 +101,9 @@ func WorkflowDispatchInputs(ctx *context.Context) { var commit *git.Commit var err error if refName.IsTag() { - commit, err = ctx.Repo.GitRepo.GetTagCommit(refName.TagName()) + commit, err = ctx.Repo.GitRepo.GetTagCommit(ctx, refName.TagName()) } else if refName.IsBranch() { - commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName.BranchName()) + commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, refName.BranchName()) } else { ctx.ServerError("UnsupportedRefType", nil) return @@ -126,7 +126,7 @@ func prepareWorkflowDispatchTemplate(ctx *context.Context, commit *git.Commit) ( var curWorkflow *model.Workflow - _, entries, err := actions.ListWorkflows(commit) + _, entries, err := actions.ListWorkflows(ctx, commit) if err != nil { ctx.ServerError("ListWorkflows", err) return nil @@ -150,7 +150,7 @@ func prepareWorkflowDispatchTemplate(ctx *context.Context, commit *git.Commit) ( workflows = make([]Workflow, 0, len(entries)) for _, entry := range entries { workflow := Workflow{Entry: *entry} - content, err := actions.GetContentFromEntry(entry) + content, err := actions.GetContentFromEntry(ctx, entry) if err != nil { ctx.ServerError("GetContentFromEntry", err) return nil diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 3422128026ffd..3dcfcc8db571c 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -73,14 +73,14 @@ func ViewWorkflowFile(ctx *context_module.Context) { }, err) return } - commit, err := ctx.Repo.GitRepo.GetCommit(run.CommitSHA) + commit, err := ctx.Repo.GitRepo.GetCommit(ctx, run.CommitSHA) if err != nil { ctx.NotFoundOrServerError("GetCommit", func(err error) bool { return errors.Is(err, util.ErrNotExist) }, err) return } - rpath, entries, err := actions.ListWorkflows(commit) + rpath, entries, err := actions.ListWorkflows(ctx, commit) if err != nil { ctx.ServerError("ListWorkflows", err) return diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index e304633f95238..614ca4f29e10a 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -50,7 +50,7 @@ func RefBlame(ctx *context.Context) { ctx.NotFound(nil) return } - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err) return @@ -68,7 +68,7 @@ func RefBlame(ctx *context.Context) { ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) blob := entry.Blob() - fileSize := blob.Size() + fileSize := blob.Size(ctx) ctx.Data["FileSize"] = fileSize ctx.Data["FileTreePath"] = ctx.Repo.TreePath @@ -84,7 +84,7 @@ func RefBlame(ctx *context.Context) { return } - ctx.Data["NumLines"], err = blob.GetBlobLineCount(nil) + ctx.Data["NumLines"], err = blob.GetBlobLineCount(ctx, nil) if err != nil { ctx.NotFound(err) return @@ -204,7 +204,7 @@ func processBlameParts(ctx *context.Context, blameParts []*git.BlamePart) map[st commit, ok := commitCache[sha] var err error if !ok { - commit, err = ctx.Repo.GitRepo.GetCommit(sha) + commit, err = ctx.Repo.GitRepo.GetCommit(ctx, sha) if err != nil { if git.IsErrNotExist(err) { ctx.NotFound(err) diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 1a86a62fae172..b83d03cb43cf9 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -76,7 +76,7 @@ func Commits(ctx *context.Context) { } // Both `git log branchName` and `git log commitId` work. - commits, err := ctx.Repo.Commit.CommitsByRange(page, pageSize, "", "", "") + commits, err := ctx.Repo.Commit.CommitsByRange(ctx, page, pageSize, "", "", "") if err != nil { ctx.ServerError("CommitsByRange", err) return @@ -143,7 +143,7 @@ func Graph(ctx *context.Context) { page := ctx.FormInt("page") - graph, err := gitgraph.GetCommitGraph(ctx.Repo.GitRepo, page, 0, hidePRRefs, realBranches, files) + graph, err := gitgraph.GetCommitGraph(ctx, ctx.Repo.GitRepo, page, 0, hidePRRefs, realBranches, files) if err != nil { ctx.ServerError("GetCommitGraph", err) return @@ -156,7 +156,7 @@ func Graph(ctx *context.Context) { ctx.Data["Graph"] = graph - gitRefs, err := ctx.Repo.GitRepo.GetRefs() + gitRefs, err := ctx.Repo.GitRepo.GetRefs(ctx) if err != nil { ctx.ServerError("GitRepo.GetRefs", err) return @@ -194,7 +194,7 @@ func SearchCommits(ctx *context.Context) { all := ctx.FormBool("all") opts := git.NewSearchCommitsOptions(query, all) - commits, err := ctx.Repo.Commit.SearchCommits(opts) + commits, err := ctx.Repo.Commit.SearchCommits(ctx, opts) if err != nil { ctx.ServerError("SearchCommits", err) return @@ -222,7 +222,7 @@ func FileHistory(ctx *context.Context) { return } - commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(ctx.Repo.RefFullName.ShortName(), ctx.Repo.TreePath) + commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(ctx, ctx.Repo.RefFullName.ShortName(), ctx.Repo.TreePath) if err != nil { ctx.ServerError("FileCommitsCount", err) return @@ -234,6 +234,7 @@ func FileHistory(ctx *context.Context) { page := max(ctx.FormInt("page"), 1) commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange( + ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.RefFullName.ShortName(), // FIXME: legacy code used ShortName File: ctx.Repo.TreePath, @@ -282,7 +283,7 @@ func Diff(ctx *context.Context) { ) if ctx.Data["PageIsWiki"] != nil { - gitRepo, err = gitrepo.OpenRepository(ctx, ctx.Repo.Repository.WikiStorageRepo()) + gitRepo, err = gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("Repo.GitRepo.GetCommit", err) return @@ -292,7 +293,7 @@ func Diff(ctx *context.Context) { gitRepo = ctx.Repo.GitRepo } - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { if git.IsErrNotExist(err) { ctx.NotFound(err) @@ -349,7 +350,7 @@ func Diff(ctx *context.Context) { var parentCommit *git.Commit var parentCommitID string if commit.ParentCount() > 0 { - parentCommit, err = gitRepo.GetCommit(parents[0]) + parentCommit, err = gitRepo.GetCommit(ctx, parents[0]) if err != nil { ctx.NotFound(err) return @@ -424,7 +425,7 @@ func Diff(ctx *context.Context) { func RawDiff(ctx *context.Context) { var gitRepo *git.Repository if ctx.Data["PageIsWiki"] != nil { - wikiRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository.WikiStorageRepo()) + wikiRepo, err := gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("OpenRepository", err) return @@ -439,6 +440,7 @@ func RawDiff(ctx *context.Context) { } } if err := git.GetRawDiff( + ctx, gitRepo, ctx.PathParam("sha"), git.RawDiffType(ctx.PathParam("ext")), diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 9262703078a6a..d600b16b4567b 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -61,7 +61,7 @@ func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner return nil } - blob, err := commit.GetBlobByPath(path) + blob, err := commit.GetBlobByPath(ctx, path) if err != nil { return nil } @@ -75,7 +75,7 @@ func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner return st } - st, err := blob.GuessContentType() + st, err := blob.GuessContentType(ctx) if err != nil { log.Error("GuessContentType failed: %v", err) return st @@ -140,11 +140,11 @@ func setCsvCompareContext(ctx *context.Context) { return nil, nil, nil } - if setting.UI.CSV.MaxFileSize != 0 && setting.UI.CSV.MaxFileSize < blob.Size() { + if setting.UI.CSV.MaxFileSize != 0 && setting.UI.CSV.MaxFileSize < blob.Size(ctx) { return nil, nil, errTooLarge } - reader, err := blob.DataAsync() + reader, err := blob.DataAsync(ctx) if err != nil { return nil, nil, err } @@ -303,13 +303,13 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { ctx.Repo.PullRequest.SameRepo = isSameRepo // Check if base branch is valid. - baseIsCommit := ctx.Repo.GitRepo.IsCommitExist(ci.BaseBranch) + baseIsCommit := ctx.Repo.GitRepo.IsCommitExist(ctx, ci.BaseBranch) baseIsBranch := gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, ci.BaseBranch) baseIsTag := gitrepo.IsTagExist(ctx, ctx.Repo.Repository, ci.BaseBranch) if !baseIsCommit && !baseIsBranch && !baseIsTag { // Check if baseBranch is short sha commit hash - if baseCommit, _ := ctx.Repo.GitRepo.GetCommit(ci.BaseBranch); baseCommit != nil { + if baseCommit, _ := ctx.Repo.GitRepo.GetCommit(ctx, ci.BaseBranch); baseCommit != nil { ci.BaseBranch = baseCommit.ID.String() ctx.Data["BaseBranch"] = ci.BaseBranch baseIsCommit = true @@ -505,12 +505,12 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { } // Check if head branch is valid. - headIsCommit := ci.HeadGitRepo.IsCommitExist(ci.HeadBranch) + headIsCommit := ci.HeadGitRepo.IsCommitExist(ctx, ci.HeadBranch) headIsBranch := gitrepo.IsBranchExist(ctx, ci.HeadRepo, ci.HeadBranch) headIsTag := gitrepo.IsTagExist(ctx, ci.HeadRepo, ci.HeadBranch) if !headIsCommit && !headIsBranch && !headIsTag { // Check if headBranch is short sha commit hash - if headCommit, _ := ci.HeadGitRepo.GetCommit(ci.HeadBranch); headCommit != nil { + if headCommit, _ := ci.HeadGitRepo.GetCommit(ctx, ci.HeadBranch); headCommit != nil { ci.HeadBranch = headCommit.ID.String() ctx.Data["HeadBranch"] = ci.HeadBranch headIsCommit = true @@ -654,7 +654,7 @@ func PrepareCompareDiff( ctx.Data["FileIconPoolHTML"] = renderedIconPool.RenderToHTML() } - headCommit, err := ci.HeadGitRepo.GetCommit(headCommitID) + headCommit, err := ci.HeadGitRepo.GetCommit(ctx, headCommitID) if err != nil { ctx.ServerError("GetCommit", err) return false @@ -662,7 +662,7 @@ func PrepareCompareDiff( baseGitRepo := ctx.Repo.GitRepo - beforeCommit, err := baseGitRepo.GetCommit(beforeCommitID) + beforeCommit, err := baseGitRepo.GetCommit(ctx, beforeCommitID) if err != nil { ctx.ServerError("GetCommit", err) return false @@ -880,7 +880,7 @@ func ExcerptBlob(ctx *context.Context) { gitRepo := ctx.Repo.GitRepo if ctx.Data["PageIsWiki"] == true { var err error - gitRepo, err = gitrepo.OpenRepository(ctx, ctx.Repo.Repository.WikiStorageRepo()) + gitRepo, err = gitrepo.OpenRepository(ctx.Repo.Repository.WikiStorageRepo()) if err != nil { ctx.ServerError("OpenRepository", err) return @@ -888,7 +888,7 @@ func ExcerptBlob(ctx *context.Context) { defer gitRepo.Close() } chunkSize := gitdiff.BlobExcerptChunkSize - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { ctx.HTTPError(http.StatusInternalServerError, "GetCommit") return @@ -901,9 +901,9 @@ func ExcerptBlob(ctx *context.Context) { idxRight -= chunkSize leftHunkSize += chunkSize rightHunkSize += chunkSize - section.Lines, err = getExcerptLines(commit, filePath, idxLeft-1, idxRight-1, chunkSize) + section.Lines, err = getExcerptLines(ctx, commit, filePath, idxLeft-1, idxRight-1, chunkSize) } else if direction == "down" && (idxLeft-lastLeft) > chunkSize { - section.Lines, err = getExcerptLines(commit, filePath, lastLeft, lastRight, chunkSize) + section.Lines, err = getExcerptLines(ctx, commit, filePath, lastLeft, lastRight, chunkSize) lastLeft += chunkSize lastRight += chunkSize } else { @@ -911,7 +911,7 @@ func ExcerptBlob(ctx *context.Context) { if direction == "down" { offset = 0 } - section.Lines, err = getExcerptLines(commit, filePath, lastLeft, lastRight, idxRight-lastRight+offset) + section.Lines, err = getExcerptLines(ctx, commit, filePath, lastLeft, lastRight, idxRight-lastRight+offset) leftHunkSize = 0 rightHunkSize = 0 idxLeft = lastLeft @@ -954,12 +954,12 @@ func ExcerptBlob(ctx *context.Context) { ctx.HTML(http.StatusOK, tplBlobExcerpt) } -func getExcerptLines(commit *git.Commit, filePath string, idxLeft, idxRight, chunkSize int) ([]*gitdiff.DiffLine, error) { - blob, err := commit.Tree.GetBlobByPath(filePath) +func getExcerptLines(ctx gocontext.Context, commit *git.Commit, filePath string, idxLeft, idxRight, chunkSize int) ([]*gitdiff.DiffLine, error) { + blob, err := commit.Tree.GetBlobByPath(ctx, filePath) if err != nil { return nil, err } - reader, err := blob.DataAsync() + reader, err := blob.DataAsync(ctx) if err != nil { return nil, err } diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go index 6f394aae27d02..b5689292747e4 100644 --- a/routers/web/repo/download.go +++ b/routers/web/repo/download.go @@ -24,7 +24,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim return nil } - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { return err } @@ -82,7 +82,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim } func getBlobForEntry(ctx *context.Context) (*git.Blob, *time.Time) { - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { if git.IsErrNotExist(err) { ctx.NotFound(err) @@ -97,7 +97,7 @@ func getBlobForEntry(ctx *context.Context) (*git.Blob, *time.Time) { return nil, nil } - latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) + latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx, ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) if err != nil { ctx.ServerError("GetTreePathLatestCommit", err) return nil, nil diff --git a/routers/web/repo/editor.go b/routers/web/repo/editor.go index 2a5ac102824d9..8163666c18ce2 100644 --- a/routers/web/repo/editor.go +++ b/routers/web/repo/editor.go @@ -221,7 +221,7 @@ func redirectForCommitChoice[T any](ctx *context.Context, parsed *preparedEditor } func editFileOpenExisting(ctx *context.Context) (prefetch []byte, dataRc io.ReadCloser, fInfo *fileInfo) { - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "GetTreeEntryByPath", err) return nil, nil, nil @@ -413,7 +413,7 @@ func DeleteFilePost(ctx *context.Context) { } ctx.Flash.Success(ctx.Tr("repo.editor.file_delete_success", treePath)) - redirectTreePath := getClosestParentWithFiles(ctx.Repo.GitRepo, parsed.NewBranchName, treePath) + redirectTreePath := getClosestParentWithFiles(ctx, ctx.Repo.GitRepo, parsed.NewBranchName, treePath) redirectForCommitChoice(ctx, parsed, redirectTreePath) } diff --git a/routers/web/repo/editor_cherry_pick.go b/routers/web/repo/editor_cherry_pick.go index 10c2741b1cb22..eaa1ff41dc135 100644 --- a/routers/web/repo/editor_cherry_pick.go +++ b/routers/web/repo/editor_cherry_pick.go @@ -23,7 +23,7 @@ func CherryPick(ctx *context.Context) { fromCommitID := ctx.PathParam("sha") ctx.Data["FromCommitID"] = fromCommitID - cherryPickCommit, err := ctx.Repo.GitRepo.GetCommit(fromCommitID) + cherryPickCommit, err := ctx.Repo.GitRepo.GetCommit(ctx, fromCommitID) if err != nil { HandleGitError(ctx, "GetCommit", err) return @@ -68,7 +68,7 @@ func CherryPickPost(ctx *context.Context) { if parsed.form.Revert { err = git.GetReverseRawDiff(ctx, ctx.Repo.Repository.RepoPath(), fromCommitID, buf) } else { - err = git.GetRawDiff(ctx.Repo.GitRepo, fromCommitID, "patch", buf) + err = git.GetRawDiff(ctx, ctx.Repo.GitRepo, fromCommitID, "patch", buf) } if err == nil { opts.Content = buf.String() diff --git a/routers/web/repo/editor_preview.go b/routers/web/repo/editor_preview.go index 14be5b72b65bd..aa79c05e0c2af 100644 --- a/routers/web/repo/editor_preview.go +++ b/routers/web/repo/editor_preview.go @@ -18,7 +18,7 @@ func DiffPreviewPost(ctx *context.Context) { return } - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(treePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, treePath) if err != nil { ctx.ServerError("GetTreeEntryByPath", err) return diff --git a/routers/web/repo/editor_test.go b/routers/web/repo/editor_test.go index 3ba75d5d70697..e37ec8c52d323 100644 --- a/routers/web/repo/editor_test.go +++ b/routers/web/repo/editor_test.go @@ -21,11 +21,11 @@ func TestEditorUtils(t *testing.T) { assert.Equal(t, "user2-patch-1", branchName) }) t.Run("getClosestParentWithFiles", func(t *testing.T) { - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - treePath := getClosestParentWithFiles(gitRepo, "sub-home-md-img-check", "docs/foo/bar") + treePath := getClosestParentWithFiles(t.Context(), gitRepo, "sub-home-md-img-check", "docs/foo/bar") assert.Equal(t, "docs", treePath) - treePath = getClosestParentWithFiles(gitRepo, "sub-home-md-img-check", "any/other") + treePath = getClosestParentWithFiles(t.Context(), gitRepo, "sub-home-md-img-check", "any/other") assert.Empty(t, treePath) }) } diff --git a/routers/web/repo/editor_util.go b/routers/web/repo/editor_util.go index f910f0bd40729..65b908b3eab6f 100644 --- a/routers/web/repo/editor_util.go +++ b/routers/web/repo/editor_util.go @@ -39,21 +39,21 @@ func getUniquePatchBranchName(ctx context.Context, prefixName string, repo *repo // getClosestParentWithFiles Recursively gets the closest path of parent in a tree that has files when a file in a tree is // deleted. It returns "" for the tree root if no parents other than the root have files. -func getClosestParentWithFiles(gitRepo *git.Repository, branchName, originTreePath string) string { +func getClosestParentWithFiles(ctx context.Context, gitRepo *git.Repository, branchName, originTreePath string) string { var f func(treePath string, commit *git.Commit) string f = func(treePath string, commit *git.Commit) string { if treePath == "" || treePath == "." { return "" } // see if the tree has entries - if tree, err := commit.SubTree(treePath); err != nil { + if tree, err := commit.SubTree(ctx, treePath); err != nil { return f(path.Dir(treePath), commit) // failed to get the tree, going up a dir - } else if entries, err := tree.ListEntries(); err != nil || len(entries) == 0 { + } else if entries, err := tree.ListEntries(ctx); err != nil || len(entries) == 0 { return f(path.Dir(treePath), commit) // no files in this dir, going up a dir } return treePath } - commit, err := gitRepo.GetBranchCommit(branchName) // must get the commit again to get the latest change + commit, err := gitRepo.GetBranchCommit(ctx, branchName) // must get the commit again to get the latest change if err != nil { log.Error("GetBranchCommit: %v", err) return "" @@ -63,7 +63,7 @@ func getClosestParentWithFiles(gitRepo *git.Repository, branchName, originTreePa // getContextRepoEditorConfig returns the editorconfig JSON string for given treePath or "null" func getContextRepoEditorConfig(ctx *context_service.Context, treePath string) string { - ec, _, err := ctx.Repo.GetEditorconfig() + ec, _, err := ctx.Repo.GetEditorconfig(ctx) if err == nil { def, err := ec.GetDefinitionForFilename(treePath) if err == nil { diff --git a/routers/web/repo/issue_list.go b/routers/web/repo/issue_list.go index a11d35da1eb85..40afa0e6bc1d5 100644 --- a/routers/web/repo/issue_list.go +++ b/routers/web/repo/issue_list.go @@ -778,7 +778,7 @@ func Issues(ctx *context.Context) { } ctx.Data["Title"] = ctx.Tr("repo.issues") ctx.Data["PageIsIssueList"] = true - ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo) + ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) } prepareIssueFilterAndList(ctx, ctx.FormInt64("milestone"), ctx.FormInt64("project"), optional.Some(isPullList)) diff --git a/routers/web/repo/issue_new.go b/routers/web/repo/issue_new.go index 1393f62fa531a..a249fb44e99f4 100644 --- a/routers/web/repo/issue_new.go +++ b/routers/web/repo/issue_new.go @@ -38,7 +38,7 @@ import ( // Tries to load and set an issue template. The first return value indicates if a template was loaded. func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles []string, metaData *IssuePageMetaData) (bool, map[string]error) { - commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultBranch) if err != nil { return false, nil } @@ -51,10 +51,10 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles templateErrs := map[string]error{} for _, filename := range templateCandidates { - if ok, _ := commit.HasFile(filename); !ok { + if ok, _ := commit.HasFile(ctx, filename); !ok { continue } - template, err := issue_template.UnmarshalFromCommit(commit, filename) + template, err := issue_template.UnmarshalFromCommit(ctx, commit, filename) if err != nil { templateErrs[filename] = err continue @@ -98,8 +98,8 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles // NewIssue render creating issue page func NewIssue(ctx *context.Context) { - issueConfig, _ := issue_service.GetTemplateConfigFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) - hasTemplates := issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo) + issueConfig, _ := issue_service.GetTemplateConfigFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) + hasTemplates := issue_service.HasTemplatesOrContactLinks(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.Data["Title"] = ctx.Tr("repo.issues.new") ctx.Data["PageIsIssueList"] = true @@ -135,7 +135,7 @@ func NewIssue(ctx *context.Context) { } ctx.Data["Tags"] = tags - ret := issue_service.ParseTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + ret := issue_service.ParseTemplatesFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) templateLoaded, errs := setTemplateIfExists(ctx, issueTemplateKey, IssueTemplateCandidates, pageMetaData) maps.Copy(ret.TemplateErrors, errs) if ctx.Written() { @@ -186,20 +186,20 @@ func NewIssueChooseTemplate(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.issues.new") ctx.Data["PageIsIssueList"] = true - ret := issue_service.ParseTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + ret := issue_service.ParseTemplatesFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.Data["IssueTemplates"] = ret.IssueTemplates if len(ret.TemplateErrors) > 0 { ctx.Flash.Warning(renderErrorOfTemplates(ctx, ret.TemplateErrors), true) } - if !issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo) { + if !issue_service.HasTemplatesOrContactLinks(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) { // The "issues/new" and "issues/new/choose" share the same query parameters "project" and "milestone", if no template here, just redirect to the "issues/new" page with these parameters. ctx.Redirect(fmt.Sprintf("%s/issues/new?%s", ctx.Repo.Repository.Link(), ctx.Req.URL.RawQuery), http.StatusSeeOther) return } - issueConfig, err := issue_service.GetTemplateConfigFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + issueConfig, err := issue_service.GetTemplateConfigFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.Data["IssueConfig"] = issueConfig ctx.Data["IssueConfigError"] = err // ctx.Flash.Err makes problems here @@ -328,7 +328,7 @@ func NewIssuePost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.CreateIssueForm) ctx.Data["Title"] = ctx.Tr("repo.issues.new") ctx.Data["PageIsIssueList"] = true - ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo) + ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled upload.AddUploadContext(ctx, "comment") @@ -369,7 +369,7 @@ func NewIssuePost(ctx *context.Context) { content := form.Content if filename := ctx.Req.Form.Get("template-file"); filename != "" { - if template, err := issue_template.UnmarshalFromRepo(ctx.Repo.GitRepo, ctx.Repo.Repository.DefaultBranch, filename); err == nil { + if template, err := issue_template.UnmarshalFromRepo(ctx, ctx.Repo.GitRepo, ctx.Repo.Repository.DefaultBranch, filename); err == nil { content = issue_template.RenderToMarkdown(template, ctx.Req.Form) } } diff --git a/routers/web/repo/issue_view.go b/routers/web/repo/issue_view.go index d9f6c33e3fbc5..65a6692b51008 100644 --- a/routers/web/repo/issue_view.go +++ b/routers/web/repo/issue_view.go @@ -348,7 +348,7 @@ func ViewIssue(ctx *context.Context) { return } ctx.Data["PageIsIssueList"] = true - ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx.Repo.Repository, ctx.Repo.GitRepo) + ctx.Data["NewIssueChooseTemplate"] = issue_service.HasTemplatesOrContactLinks(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) } ctx.Data["IsProjectsEnabled"] = ctx.Repo.CanRead(unit.TypeProjects) diff --git a/routers/web/repo/middlewares.go b/routers/web/repo/middlewares.go index 7518e6feae916..7d2634686cd16 100644 --- a/routers/web/repo/middlewares.go +++ b/routers/web/repo/middlewares.go @@ -18,7 +18,7 @@ func SetEditorconfigIfExists(ctx *context.Context) { return } - ec, _, err := ctx.Repo.GetEditorconfig() + ec, _, err := ctx.Repo.GetEditorconfig(ctx) if err != nil { // it used to check `!git.IsErrNotExist(err)` and create a system notice, but it is quite annoying and useless // because network errors also happen frequently, so we just ignore it diff --git a/routers/web/repo/milestone.go b/routers/web/repo/milestone.go index dd53b1d3f1052..db0dfcb61028f 100644 --- a/routers/web/repo/milestone.go +++ b/routers/web/repo/milestone.go @@ -262,7 +262,7 @@ func MilestoneIssuesAndPulls(ctx *context.Context) { prepareIssueFilterAndList(ctx, milestoneID, projectID, optional.None[bool]()) - ret := issue.ParseTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) + ret := issue.ParseTemplatesFromDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo) ctx.Data["NewIssueChooseTemplate"] = len(ret.IssueTemplates) > 0 ctx.Data["CanWriteIssues"] = ctx.Repo.CanWriteIssuesOrPulls(false) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index ea3e700b771cd..9527865f27c51 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -196,7 +196,7 @@ func GetPullDiffStats(ctx *context.Context) { } // do not report 500 server error to end users if error occurs, otherwise a PR missing ref won't be able to view. - headCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + headCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { log.Error("Failed to GetRefCommitID: %v, repo: %v", err, ctx.Repo.Repository.FullName()) return @@ -218,7 +218,7 @@ func GetMergedBaseCommitID(ctx *context.Context, issue *issues_model.Issue) stri if pull.MergeBase == "" { var commitSHA, parentCommit string // If there is a head or a patch file, and it is readable, grab info - commitSHA, err := ctx.Repo.GitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + commitSHA, err := ctx.Repo.GitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { // Head File does not exist, try the patch commitSHA, err = ctx.Repo.GitRepo.ReadPatchCommit(pull.Index) @@ -341,7 +341,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ if pull.BaseRepoID == ctx.Repo.Repository.ID && ctx.Repo.GitRepo != nil { baseGitRepo = ctx.Repo.GitRepo } else { - baseGitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo) + baseGitRepo, err := gitrepo.OpenRepository(pull.BaseRepo) if err != nil { ctx.ServerError("OpenRepository", err) return nil @@ -355,7 +355,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ ctx.Data["BaseTarget"] = pull.BaseBranch ctx.Data["HeadTarget"] = pull.HeadBranch - sha, err := baseGitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + sha, err := baseGitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { ctx.ServerError(fmt.Sprintf("GetRefCommitID(%s)", pull.GetGitHeadRefName()), err) return nil @@ -413,9 +413,9 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ if headBranchExist { if pull.Flow != issues_model.PullRequestFlowGithub { - headBranchSha, err = baseGitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + headBranchSha, err = baseGitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) } else { - headBranchSha, err = headGitRepo.GetBranchCommitID(pull.HeadBranch) + headBranchSha, err = headGitRepo.GetBranchCommitID(ctx, pull.HeadBranch) } if err != nil { ctx.ServerError("GetBranchCommitID", err) @@ -436,7 +436,7 @@ func prepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *pull_ ctx.Data["GetCommitMessages"] = "" } - sha, err := baseGitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + sha, err := baseGitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { if git.IsErrNotExist(err) { ctx.Data["IsPullRequestBroken"] = true @@ -674,7 +674,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { return } - headCommitID, err := gitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + headCommitID, err := gitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { ctx.ServerError("GetRefCommitID", err) return @@ -699,7 +699,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { if beforeCommitID == "" || beforeCommitID == prInfo.MergeBase { beforeCommitID = prInfo.MergeBase // mergebase commit is not in the list of the pull request commits - beforeCommit, err = gitRepo.GetCommit(beforeCommitID) + beforeCommit, err = gitRepo.GetCommit(ctx, beforeCommitID) if err != nil { ctx.ServerError("GetCommit", err) return @@ -712,7 +712,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { } } } else { - beforeCommit, err = afterCommit.Parent(0) + beforeCommit, err = afterCommit.Parent(ctx, 0) if err != nil { ctx.ServerError("Parent", err) return @@ -1206,7 +1206,7 @@ func MergePullRequest(ctx *context.Context) { if ctx.Repo != nil && ctx.Repo.Repository != nil && pr.HeadRepoID == ctx.Repo.Repository.ID && ctx.Repo.GitRepo != nil { headRepo = ctx.Repo.GitRepo } else { - headRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) + headRepo, err = gitrepo.OpenRepository(pr.HeadRepo) if err != nil { ctx.ServerError(fmt.Sprintf("OpenRepository[%s]", pr.HeadRepo.FullName()), err) return @@ -1301,7 +1301,7 @@ func CompareAndPullRequestPost(ctx *context.Context) { content := form.Content if filename := ctx.Req.Form.Get("template-file"); filename != "" { - if template, err := issue_template.UnmarshalFromRepo(ctx.Repo.GitRepo, ctx.Repo.Repository.DefaultBranch, filename); err == nil { + if template, err := issue_template.UnmarshalFromRepo(ctx, ctx.Repo.GitRepo, ctx.Repo.Repository.DefaultBranch, filename); err == nil { content = issue_template.RenderToMarkdown(template, ctx.Req.Form) } } @@ -1461,7 +1461,7 @@ func CleanUpPullRequest(ctx *context.Context) { gitBaseRepo = ctx.Repo.GitRepo } else { // If not just open it - gitBaseRepo, err = gitrepo.OpenRepository(ctx, pr.BaseRepo) + gitBaseRepo, err = gitrepo.OpenRepository(pr.BaseRepo) if err != nil { ctx.ServerError(fmt.Sprintf("OpenRepository[%s]", pr.BaseRepo.FullName()), err) return @@ -1476,7 +1476,7 @@ func CleanUpPullRequest(ctx *context.Context) { gitRepo = ctx.Repo.GitRepo } else if pr.BaseRepoID != pr.HeadRepoID { // Otherwise just load it up - gitRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) + gitRepo, err = gitrepo.OpenRepository(pr.HeadRepo) if err != nil { ctx.ServerError(fmt.Sprintf("OpenRepository[%s]", pr.HeadRepo.FullName()), err) return @@ -1489,13 +1489,13 @@ func CleanUpPullRequest(ctx *context.Context) { }() // Check if branch has no new commits - headCommitID, err := gitBaseRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := gitBaseRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Error("GetRefCommitID: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) return } - branchCommitID, err := gitRepo.GetBranchCommitID(pr.HeadBranch) + branchCommitID, err := gitRepo.GetBranchCommitID(ctx, pr.HeadBranch) if err != nil { log.Error("GetBranchCommitID: %v", err) ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index 18e14e9b224c4..1b0d98351ecf1 100644 --- a/routers/web/repo/pull_review.go +++ b/routers/web/repo/pull_review.go @@ -49,7 +49,7 @@ func RenderNewCodeCommentForm(ctx *context.Context) { ctx.Data["PageIsPullFiles"] = true ctx.Data["Issue"] = issue ctx.Data["CurrentReview"] = currentReview - pullHeadCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(issue.PullRequest.GetGitHeadRefName()) + pullHeadCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(ctx, issue.PullRequest.GetGitHeadRefName()) if err != nil { ctx.ServerError("GetRefCommitID", err) return @@ -199,7 +199,7 @@ func renderConversation(ctx *context.Context, comment *issues_model.Comment, ori ctx.ServerError("comment.Issue.LoadPullRequest", err) return } - pullHeadCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(comment.Issue.PullRequest.GetGitHeadRefName()) + pullHeadCommitID, err := ctx.Repo.GitRepo.GetRefCommitID(ctx, comment.Issue.PullRequest.GetGitHeadRefName()) if err != nil { ctx.ServerError("GetRefCommitID", err) return diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 36ea20c23e6f7..178c633ebf7e9 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -5,6 +5,7 @@ package repo import ( + stdCtx "context" "errors" "fmt" "net/http" @@ -40,14 +41,14 @@ const ( ) // calReleaseNumCommitsBehind calculates given release has how many commits behind release target. -func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model.Release, countCache map[string]int64) error { +func calReleaseNumCommitsBehind(ctx stdCtx.Context, repoCtx *context.Repository, release *repo_model.Release, countCache map[string]int64) error { target := release.Target if target == "" { target = repoCtx.Repository.DefaultBranch } // Get count if not cached if _, ok := countCache[target]; !ok { - commit, err := repoCtx.GitRepo.GetBranchCommit(target) + commit, err := repoCtx.GitRepo.GetBranchCommit(ctx, target) if err != nil { var errNotExist git.ErrNotExist if target == repoCtx.Repository.DefaultBranch || !errors.As(err, &errNotExist) { @@ -55,12 +56,12 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model } // fallback to default branch target = repoCtx.Repository.DefaultBranch - commit, err = repoCtx.GitRepo.GetBranchCommit(target) + commit, err = repoCtx.GitRepo.GetBranchCommit(ctx, target) if err != nil { return fmt.Errorf("GetBranchCommit(DefaultBranch): %w", err) } } - countCache[target], err = commit.CommitsCount() + countCache[target], err = commit.CommitsCount(ctx) if err != nil { return fmt.Errorf("CommitsCount: %w", err) } @@ -123,7 +124,7 @@ func getReleaseInfos(ctx *context.Context, opts *repo_model.FindReleasesOptions) } if !r.IsDraft { - if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { + if err := calReleaseNumCommitsBehind(ctx, ctx.Repo, r, countCache); err != nil { return nil, err } } @@ -485,7 +486,7 @@ func NewReleasePost(ctx *context.Context) { IsPrerelease: form.Prerelease, IsTag: false, } - if err = release_service.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs, newTagMsg); err != nil { + if err = release_service.CreateRelease(ctx, ctx.Repo.GitRepo, rel, attachmentUUIDs, newTagMsg); err != nil { handleTagReleaseError(err) return } diff --git a/routers/web/repo/release_test.go b/routers/web/repo/release_test.go index 9f49fc750070c..7ba91afb29705 100644 --- a/routers/web/repo/release_test.go +++ b/routers/web/repo/release_test.go @@ -158,7 +158,7 @@ func TestCalReleaseNumCommitsBehind(t *testing.T) { countCache := make(map[string]int64) for _, release := range releases { - err := calReleaseNumCommitsBehind(ctx.Repo, release, countCache) + err := calReleaseNumCommitsBehind(ctx, ctx.Repo, release, countCache) assert.NoError(t, err) } diff --git a/routers/web/repo/render.go b/routers/web/repo/render.go index 689174dfa1aa5..ec39bc7abbd48 100644 --- a/routers/web/repo/render.go +++ b/routers/web/repo/render.go @@ -24,7 +24,7 @@ func RenderFile(ctx *context.Context) { var blob *git.Blob var err error if ctx.Repo.TreePath != "" { - blob, err = ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath) + blob, err = ctx.Repo.Commit.GetBlobByPath(ctx, ctx.Repo.TreePath) } else { blob, err = ctx.Repo.GitRepo.GetBlob(ctx.PathParam("sha")) } @@ -37,7 +37,7 @@ func RenderFile(ctx *context.Context) { return } - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { ctx.ServerError("DataAsync", err) return diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go index 07435a550dc81..8a7d6af88542f 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -65,12 +65,12 @@ func MustBeAbleToUpload(ctx *context.Context) { func CommitInfoCache(ctx *context.Context) { var err error - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultBranch) if err != nil { ctx.ServerError("GetBranchCommit", err) return } - ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount() + ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount(ctx) if err != nil { ctx.ServerError("GetCommitsCount", err) return @@ -364,7 +364,7 @@ func RedirectDownload(ctx *context.Context) { // Download an archive of a repository func Download(ctx *context.Context) { - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*")) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*")) if err != nil { if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) { ctx.HTTPError(http.StatusBadRequest, err.Error()) @@ -388,7 +388,7 @@ func InitiateDownload(ctx *context.Context) { }) return } - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*")) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*")) if err != nil { ctx.HTTPError(http.StatusBadRequest, "invalid archive request") return diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go index af6708e841f46..9906537ccff05 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -121,7 +121,7 @@ func LFSLocks(ctx *context.Context) { return } - gitRepo, err := git.OpenRepository(ctx, tmpBasePath) + gitRepo, err := git.OpenRepository(tmpBasePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", tmpBasePath, err) ctx.ServerError("LFSLocks", fmt.Errorf("failed to open new temporary repository in: %s %w", tmpBasePath, err)) @@ -129,7 +129,7 @@ func LFSLocks(ctx *context.Context) { } defer gitRepo.Close() - checker, err := attribute.NewBatchChecker(gitRepo, ctx.Repo.Repository.DefaultBranch, []string{attribute.Lockable}) + checker, err := attribute.NewBatchChecker(ctx, gitRepo, ctx.Repo.Repository.DefaultBranch, []string{attribute.Lockable}) if err != nil { log.Error("Unable to check attributes in %s (%v)", tmpBasePath, err) ctx.ServerError("LFSLocks", err) @@ -141,7 +141,7 @@ func LFSLocks(ctx *context.Context) { filenames := make([]string, len(lfsLocks)) for i, lock := range lfsLocks { filenames[i] = lock.Path - attrs, err := checker.CheckPath(lock.Path) + attrs, err := checker.CheckPath(ctx, lock.Path) if err != nil { log.Error("Unable to check attributes in %s: %s (%v)", tmpBasePath, lock.Path, err) continue @@ -150,7 +150,7 @@ func LFSLocks(ctx *context.Context) { } ctx.Data["Lockables"] = lockables - filelist, err := gitRepo.LsFiles(filenames...) + filelist, err := gitRepo.LsFiles(ctx, filenames...) if err != nil { log.Error("Unable to lsfiles in %s (%v)", tmpBasePath, err) ctx.ServerError("LFSLocks", err) @@ -383,7 +383,7 @@ func LFSFileFind(ctx *context.Context) { ctx.Data["Size"] = size ctx.Data["SHA"] = sha - results, err := pipeline.FindLFSFile(ctx.Repo.GitRepo, objectID) + results, err := pipeline.FindLFSFile(ctx, ctx.Repo.GitRepo, objectID) if err != nil && err != io.EOF { log.Error("Failure in FindLFSFile: %v", err) ctx.ServerError("LFSFind: FindLFSFile.", err) diff --git a/routers/web/repo/treelist.go b/routers/web/repo/treelist.go index 340b2bc091741..8a047743ed4af 100644 --- a/routers/web/repo/treelist.go +++ b/routers/web/repo/treelist.go @@ -22,13 +22,13 @@ import ( // TreeList get all files' entries of a repository func TreeList(ctx *context.Context) { - tree, err := ctx.Repo.Commit.SubTree("/") + tree, err := ctx.Repo.Commit.SubTree(ctx, "/") if err != nil { ctx.ServerError("Repo.Commit.SubTree", err) return } - entries, err := tree.ListEntriesRecursiveFast() + entries, err := tree.ListEntriesRecursiveFast(ctx) if err != nil { ctx.ServerError("ListEntriesRecursiveFast", err) return diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index e47bc56d081a6..b0158424e10ba 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -70,7 +70,7 @@ func (fi *fileInfo) isLFSFile() bool { } func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) (buf []byte, dataRc io.ReadCloser, fi *fileInfo, err error) { - dataRc, err = blob.DataAsync() + dataRc, err = blob.DataAsync(ctx) if err != nil { return nil, nil, nil, err } @@ -81,7 +81,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) (buf []b n, _ := util.ReadAtMost(dataRc, buf) buf = buf[:n] - fi = &fileInfo{fileSize: blob.Size(), st: typesniffer.DetectContentType(buf)} + fi = &fileInfo{fileSize: blob.Size(ctx), st: typesniffer.DetectContentType(buf)} // FIXME: what happens when README file is an image? if !fi.st.IsText() || !setting.LFS.StartServer { @@ -114,7 +114,7 @@ func getFileReader(ctx gocontext.Context, repoID int64, blob *git.Blob) (buf []b } buf = buf[:n] fi.st = typesniffer.DetectContentType(buf) - fi.fileSize = blob.Size() + fi.fileSize = blob.Size(ctx) fi.lfsMeta = &meta.Pointer return buf, dataRc, fi, nil } @@ -262,7 +262,7 @@ func prepareDirectoryFileIcons(ctx *context.Context, files []git.CommitInfo) { fileIcons := map[string]template.HTML{} for _, f := range files { fullPath := path.Join(ctx.Repo.TreePath, f.Entry.Name()) - entryInfo := fileicon.EntryInfoFromGitTreeEntry(ctx.Repo.Commit, fullPath, f.Entry) + entryInfo := fileicon.EntryInfoFromGitTreeEntry(ctx, ctx.Repo.Commit, fullPath, f.Entry) fileIcons[f.Entry.Name()] = fileicon.RenderEntryIconHTML(renderedIconPool, entryInfo) } fileIcons[".."] = fileicon.RenderEntryIconHTML(renderedIconPool, fileicon.EntryInfoFolder()) @@ -271,7 +271,7 @@ func prepareDirectoryFileIcons(ctx *context.Context, files []git.CommitInfo) { } func renderDirectoryFiles(ctx *context.Context, timeout time.Duration) git.Entries { - tree, err := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) + tree, err := ctx.Repo.Commit.SubTree(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "Repo.Commit.SubTree", err) return nil @@ -280,7 +280,7 @@ func renderDirectoryFiles(ctx *context.Context, timeout time.Duration) git.Entri ctx.Data["LastCommitLoaderURL"] = ctx.Repo.RepoLink + "/lastcommit/" + url.PathEscape(ctx.Repo.CommitID) + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) // Get current entry user currently looking at. - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err) return nil @@ -291,7 +291,7 @@ func renderDirectoryFiles(ctx *context.Context, timeout time.Duration) git.Entri return nil } - allEntries, err := tree.ListEntries() + allEntries, err := tree.ListEntries(ctx) if err != nil { ctx.ServerError("ListEntries", err) return nil diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 2d5bddd939f10..f0fbd10dbfbf7 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -32,7 +32,7 @@ import ( ) func prepareLatestCommitInfo(ctx *context.Context) bool { - commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.TreePath) + commit, err := ctx.Repo.Commit.GetCommitByPath(ctx, ctx.Repo.TreePath) if err != nil { ctx.ServerError("GetCommitByPath", err) return false @@ -178,7 +178,7 @@ func prepareFileView(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) if ctx.Repo.TreePath == ".editorconfig" { - _, editorconfigWarning, editorconfigErr := ctx.Repo.GetEditorconfig(ctx.Repo.Commit) + _, editorconfigWarning, editorconfigErr := ctx.Repo.GetEditorconfig(ctx, ctx.Repo.Commit) if editorconfigWarning != nil { ctx.Data["FileWarning"] = strings.TrimSpace(editorconfigWarning.Error()) } @@ -186,12 +186,12 @@ func prepareFileView(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileError"] = strings.TrimSpace(editorconfigErr.Error()) } } else if issue_service.IsTemplateConfig(ctx.Repo.TreePath) { - _, issueConfigErr := issue_service.GetTemplateConfig(ctx.Repo.GitRepo, ctx.Repo.TreePath, ctx.Repo.Commit) + _, issueConfigErr := issue_service.GetTemplateConfig(ctx, ctx.Repo.GitRepo, ctx.Repo.TreePath, ctx.Repo.Commit) if issueConfigErr != nil { ctx.Data["FileError"] = strings.TrimSpace(issueConfigErr.Error()) } } else if actions.IsWorkflow(ctx.Repo.TreePath) { - content, err := actions.GetContentFromEntry(entry) + content, err := actions.GetContentFromEntry(ctx, entry) if err != nil { log.Error("actions.GetContentFromEntry: %v", err) } @@ -200,7 +200,7 @@ func prepareFileView(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileError"] = ctx.Locale.Tr("actions.runs.invalid_workflow_helper", workFlowErr.Error()) } } else if issue_service.IsCodeOwnerFile(ctx.Repo.TreePath) { - if data, err := blob.GetBlobContent(setting.UI.MaxDisplayFileSize); err == nil { + if data, err := blob.GetBlobContent(ctx, setting.UI.MaxDisplayFileSize); err == nil { _, warnings := issue_model.GetCodeOwnersFromContent(ctx, data) if len(warnings) > 0 { ctx.Data["FileWarning"] = strings.Join(warnings, "\n") diff --git a/routers/web/repo/view_home.go b/routers/web/repo/view_home.go index 88d9fd8fe2882..5e451687f7b1e 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -38,7 +38,7 @@ func checkOutdatedBranch(ctx *context.Context) { } // get the head commit of the branch since ctx.Repo.CommitID is not always the head commit of `ctx.Repo.BranchName` - commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.BranchName) + commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.BranchName) if err != nil { log.Error("GetBranchCommitID: %v", err) // Don't return an error page, as it can be rechecked the next time the user opens the page. @@ -96,12 +96,12 @@ func prepareHomeSidebarCitationFile(entry *git.TreeEntry) func(ctx *context.Cont if entry.Name() != "" { return } - tree, err := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) + tree, err := ctx.Repo.Commit.SubTree(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "Repo.Commit.SubTree", err) return } - allEntries, err := tree.ListEntries() + allEntries, err := tree.ListEntries(ctx) if err != nil { ctx.ServerError("ListEntries", err) return @@ -109,7 +109,7 @@ func prepareHomeSidebarCitationFile(entry *git.TreeEntry) func(ctx *context.Cont for _, entry := range allEntries { if entry.Name() == "CITATION.cff" || entry.Name() == "CITATION.bib" { // Read Citation file contents - if content, err := entry.Blob().GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { + if content, err := entry.Blob().GetBlobContent(ctx, setting.UI.MaxDisplayFileSize); err != nil { log.Error("checkCitationFile: GetBlobContent: %v", err) } else { ctx.Data["CitiationExist"] = true @@ -216,7 +216,7 @@ func handleRepoEmptyOrBroken(ctx *context.Context) { ctx.Repo.GitRepo, _ = gitrepo.RepositoryFromRequestContextOrOpen(ctx, ctx.Repo.Repository) } if ctx.Repo.GitRepo != nil { - reallyEmpty, err := ctx.Repo.GitRepo.IsEmpty() + reallyEmpty, err := ctx.Repo.GitRepo.IsEmpty(ctx) if err != nil { showEmpty = true // the repo is broken updateContextRepoEmptyAndStatus(ctx, true, repo_model.RepositoryBroken) @@ -225,7 +225,7 @@ func handleRepoEmptyOrBroken(ctx *context.Context) { } else if reallyEmpty { showEmpty = true // the repo is really empty updateContextRepoEmptyAndStatus(ctx, true, repo_model.RepositoryReady) - } else if branches, _, _ := ctx.Repo.GitRepo.GetBranchNames(0, 1); len(branches) == 0 { + } else if branches, _, _ := ctx.Repo.GitRepo.GetBranchNames(ctx, 0, 1); len(branches) == 0 { showEmpty = true // it is not really empty, but there is no branch // at the moment, other repo units like "actions" are not able to handle such case, // so we just mark the repo as empty to prevent from displaying these units. @@ -286,7 +286,7 @@ func handleRepoViewSubmodule(ctx *context.Context, commitSubmoduleFile *git.Comm func prepareToRenderDirOrFile(entry *git.TreeEntry) func(ctx *context.Context) { return func(ctx *context.Context) { if entry.IsSubModule() { - commitSubmoduleFile, err := git.GetCommitInfoSubmoduleFile(ctx.Repo.RepoLink, ctx.Repo.TreePath, ctx.Repo.Commit, entry.ID) + commitSubmoduleFile, err := git.GetCommitInfoSubmoduleFile(ctx, ctx.Repo.RepoLink, ctx.Repo.TreePath, ctx.Repo.Commit, entry.ID) if err != nil { HandleGitError(ctx, "prepareToRenderDirOrFile: GetCommitInfoSubmoduleFile", err) return @@ -347,7 +347,7 @@ func redirectFollowSymlink(ctx *context.Context, treePathEntry *git.TreeEntry) b return false } if treePathEntry.IsLink() { - if res, err := git.EntryFollowLinks(ctx.Repo.Commit, ctx.Repo.TreePath, treePathEntry); err == nil { + if res, err := git.EntryFollowLinks(ctx, ctx.Repo.Commit, ctx.Repo.TreePath, treePathEntry); err == nil { redirect := ctx.Repo.RepoLink + "/src/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(res.TargetFullPath) + "?" + ctx.Req.URL.RawQuery ctx.Redirect(redirect) return true @@ -389,7 +389,7 @@ func Home(ctx *context.Context) { prepareHomeTreeSideBarSwitch(ctx) // get the current git entry which doer user is currently looking at. - entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) + entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx, ctx.Repo.TreePath) if err != nil { HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err) return diff --git a/routers/web/repo/view_readme.go b/routers/web/repo/view_readme.go index ba03febff3ddf..b1b6c63293ed5 100644 --- a/routers/web/repo/view_readme.go +++ b/routers/web/repo/view_readme.go @@ -69,7 +69,7 @@ func findReadmeFileInEntries(ctx *context.Context, parentDir string, entries []* fullPath := path.Join(parentDir, entry.Name()) if readmeFiles[i] == nil || base.NaturalSortLess(readmeFiles[i].Name(), entry.Blob().Name()) { if entry.IsLink() { - res, err := git.EntryFollowLinks(ctx.Repo.Commit, fullPath, entry) + res, err := git.EntryFollowLinks(ctx, ctx.Repo.Commit, fullPath, entry) if err == nil && (res.TargetEntry.IsExecutable() || res.TargetEntry.IsRegular()) { readmeFiles[i] = entry } @@ -93,12 +93,12 @@ func findReadmeFileInEntries(ctx *context.Context, parentDir string, entries []* if subTreeEntry == nil { continue } - subTree := subTreeEntry.Tree() + subTree := subTreeEntry.Tree(ctx) if subTree == nil { // this should be impossible; if subTreeEntry exists so should this. continue } - childEntries, err := subTree.ListEntries() + childEntries, err := subTree.ListEntries(ctx) if err != nil { return "", nil, err } @@ -146,7 +146,7 @@ func prepareToRenderReadmeFile(ctx *context.Context, subfolder string, readmeFil readmeFullPath := path.Join(ctx.Repo.TreePath, subfolder, readmeFile.Name()) readmeTargetEntry := readmeFile if readmeFile.IsLink() { - if res, err := git.EntryFollowLinks(ctx.Repo.Commit, readmeFullPath, readmeFile); err == nil { + if res, err := git.EntryFollowLinks(ctx, ctx.Repo.Commit, readmeFullPath, readmeFile); err == nil { readmeTargetEntry = res.TargetEntry } else { readmeTargetEntry = nil // if we cannot resolve the symlink, we cannot render the readme, ignore the error diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index 289db11a4f830..b3cddb3c9f7da 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -6,6 +6,7 @@ package repo import ( "bytes" + stdCtx "context" "html/template" "io" "net/http" @@ -78,8 +79,8 @@ type PageMeta struct { } // findEntryForFile finds the tree entry for a target filepath. -func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) { - entry, err := commit.GetTreeEntryByPath(target) +func findEntryForFile(ctx stdCtx.Context, commit *git.Commit, target string) (*git.TreeEntry, error) { + entry, err := commit.GetTreeEntryByPath(ctx, target) if err != nil && !git.IsErrNotExist(err) { return nil, err } @@ -92,7 +93,7 @@ func findEntryForFile(commit *git.Commit, target string) (*git.TreeEntry, error) if unescapedTarget, err = url.QueryUnescape(target); err != nil { return nil, err } - return commit.GetTreeEntryByPath(unescapedTarget) + return commit.GetTreeEntryByPath(ctx, unescapedTarget) } func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, error) { @@ -102,7 +103,7 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err return nil, nil, errGitRepo } - commit, errCommit := wikiGitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultWikiBranch) + commit, errCommit := wikiGitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultWikiBranch) if git.IsErrNotExist(errCommit) { // if the default branch recorded in database is out of sync, then re-sync it gitRepoDefaultBranch, errBranch := gitrepo.GetDefaultBranch(ctx, ctx.Repo.Repository.WikiStorageRepo()) @@ -116,7 +117,7 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err } ctx.Repo.Repository.DefaultWikiBranch = gitRepoDefaultBranch // retry to get the commit from the correct default branch - commit, errCommit = wikiGitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultWikiBranch) + commit, errCommit = wikiGitRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultWikiBranch) } if errCommit != nil { return wikiGitRepo, nil, errCommit @@ -127,7 +128,7 @@ func findWikiRepoCommit(ctx *context.Context) (*git.Repository, *git.Commit, err // wikiContentsByEntry returns the contents of the wiki page referenced by the // given tree entry. Writes to ctx if an error occurs. func wikiContentsByEntry(ctx *context.Context, entry *git.TreeEntry) []byte { - reader, err := entry.Blob().DataAsync() + reader, err := entry.Blob().DataAsync(ctx) if err != nil { ctx.ServerError("Blob.Data", err) return nil @@ -147,7 +148,7 @@ func wikiContentsByEntry(ctx *context.Context, entry *git.TreeEntry) []byte { func wikiEntryByName(ctx *context.Context, commit *git.Commit, wikiName wiki_service.WebPath) (*git.TreeEntry, string, bool, bool) { isRaw := false gitFilename := wiki_service.WebPathToGitPath(wikiName) - entry, err := findEntryForFile(commit, gitFilename) + entry, err := findEntryForFile(ctx, commit, gitFilename) if err != nil && !git.IsErrNotExist(err) { ctx.ServerError("findEntryForFile", err) return nil, "", false, false @@ -155,7 +156,7 @@ func wikiEntryByName(ctx *context.Context, commit *git.Commit, wikiName wiki_ser if entry == nil { // check if the file without ".md" suffix exists gitFilename := strings.TrimSuffix(gitFilename, ".md") - entry, err = findEntryForFile(commit, gitFilename) + entry, err = findEntryForFile(ctx, commit, gitFilename) if err != nil && !git.IsErrNotExist(err) { ctx.ServerError("findEntryForFile", err) return nil, "", false, false @@ -188,7 +189,7 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { } // get the wiki pages list. - entries, err := commit.ListEntries() + entries, err := commit.ListEntries(ctx) if err != nil { ctx.ServerError("ListEntries", err) return nil, nil @@ -310,7 +311,7 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { } // get commit count - wiki revisions - commitsCount, _ := wikiGitRepo.FileCommitsCount(ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := wikiGitRepo.FileCommitsCount(ctx, ctx.Repo.Repository.DefaultWikiBranch, pageFilename) ctx.Data["CommitCount"] = commitsCount return wikiGitRepo, entry @@ -350,7 +351,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) } // get commit count - wiki revisions - commitsCount, _ := wikiGitRepo.FileCommitsCount(ctx.Repo.Repository.DefaultWikiBranch, pageFilename) + commitsCount, _ := wikiGitRepo.FileCommitsCount(ctx, ctx.Repo.Repository.DefaultWikiBranch, pageFilename) ctx.Data["CommitCount"] = commitsCount // get page @@ -358,6 +359,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) // get Commit Count commitsHistory, err := wikiGitRepo.CommitsByFileAndRange( + ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.Repository.DefaultWikiBranch, File: pageFilename, @@ -497,7 +499,7 @@ func Wiki(ctx *context.Context) { ctx.Data["FormatWarning"] = ext + " rendering is not supported at the moment. Rendered as Markdown." } // Get last change information. - lastCommit, err := wikiGitRepo.GetCommitByPath(wikiPath) + lastCommit, err := wikiGitRepo.GetCommitByPath(ctx, wikiPath) if err != nil { ctx.ServerError("GetCommitByPath", err) return @@ -529,7 +531,7 @@ func WikiRevision(ctx *context.Context) { // Get last change information. wikiPath := entry.Name() - lastCommit, err := wikiGitRepo.GetCommitByPath(wikiPath) + lastCommit, err := wikiGitRepo.GetCommitByPath(ctx, wikiPath) if err != nil { ctx.ServerError("GetCommitByPath", err) return @@ -556,13 +558,13 @@ func WikiPages(ctx *context.Context) { } treePath := "" // To support list sub folders' pages in the future - tree, err := commit.SubTree(treePath) + tree, err := commit.SubTree(ctx, treePath) if err != nil { ctx.ServerError("SubTree", err) return } - allEntries, err := tree.ListEntries() + allEntries, err := tree.ListEntries(ctx) if err != nil { ctx.ServerError("ListEntries", err) return @@ -618,7 +620,7 @@ func WikiRaw(ctx *context.Context) { var entry *git.TreeEntry if commit != nil { // Try to find a file with that name - entry, err = findEntryForFile(commit, providedGitPath) + entry, err = findEntryForFile(ctx, commit, providedGitPath) if err != nil && !git.IsErrNotExist(err) { ctx.ServerError("findFile", err) return @@ -627,7 +629,7 @@ func WikiRaw(ctx *context.Context) { if entry == nil { // Try to find a wiki page with that name providedGitPath = strings.TrimSuffix(providedGitPath, ".md") - entry, err = findEntryForFile(commit, providedGitPath) + entry, err = findEntryForFile(ctx, commit, providedGitPath) if err != nil && !git.IsErrNotExist(err) { ctx.ServerError("findFile", err) return diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go index 409d7c9a05bca..079bacf757aa0 100644 --- a/routers/web/repo/wiki_test.go +++ b/routers/web/repo/wiki_test.go @@ -29,12 +29,12 @@ const ( ) func wikiEntry(t *testing.T, repo *repo_model.Repository, wikiName wiki_service.WebPath) *git.TreeEntry { - wikiRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + wikiRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) assert.NoError(t, err) defer wikiRepo.Close() - commit, err := wikiRepo.GetBranchCommit("master") + commit, err := wikiRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) - entries, err := commit.ListEntries() + entries, err := commit.ListEntries(t.Context()) assert.NoError(t, err) for _, entry := range entries { if entry.Name() == wiki_service.WebPathToGitPath(wikiName) { @@ -49,7 +49,7 @@ func wikiContent(t *testing.T, repo *repo_model.Repository, wikiName wiki_servic if !assert.NotNil(t, entry) { return "" } - reader, err := entry.Blob().DataAsync() + reader, err := entry.Blob().DataAsync(t.Context()) assert.NoError(t, err) defer reader.Close() bytes, err := io.ReadAll(reader) diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 2bd0abc4c03f7..371c18e0024b9 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -116,13 +116,13 @@ func FindOwnerProfileReadme(ctx *context.Context, doer *user_model.User, optProf return nil, nil } - commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch) + commit, err := profileGitRepo.GetBranchCommit(ctx, profileDbRepo.DefaultBranch) if err != nil { log.Error("FindOwnerProfileReadme failed to GetBranchCommit: %v", err) return nil, nil } - profileReadmeBlob, _ = commit.GetBlobByPath("README.md") // no need to handle this error + profileReadmeBlob, _ = commit.GetBlobByPath(ctx, "README.md") // no need to handle this error return profileDbRepo, profileReadmeBlob } diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index d7052914b6865..f5b3c65114ddd 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -252,7 +252,7 @@ func prepareUserProfileTabData(ctx *context.Context, profileDbRepo *repo_model.R total = int(count) case "overview": - if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { + if bytes, err := profileReadme.GetBlobContent(ctx, setting.UI.MaxDisplayFileSize); err != nil { log.Error("failed to GetBlobContent: %v", err) } else { rctx := renderhelper.NewRenderContextRepoFile(ctx, profileDbRepo, renderhelper.RepoFileOptions{ diff --git a/services/actions/notifier.go b/services/actions/notifier.go index c4bfe5c11b3da..80dda894a6546 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -798,7 +798,7 @@ func (n *actionsNotifier) WorkflowRunStatusUpdate(ctx context.Context, repo *rep status := convert.ToWorkflowRunAction(run.Status) - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Error("OpenRepository: %v", err) return diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index d0d2572b0beac..76d3ea6e47c63 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -149,7 +149,7 @@ func notify(ctx context.Context, input *notifyInput) error { return nil } - gitRepo, err := gitrepo.OpenRepository(context.Background(), input.Repo) + gitRepo, err := gitrepo.OpenRepository(input.Repo) if err != nil { return fmt.Errorf("git.OpenRepository: %w", err) } @@ -168,13 +168,13 @@ func notify(ctx context.Context, input *notifyInput) error { ref = git.RefNameFromBranch(input.Repo.DefaultBranch) } - commitID, err := gitRepo.GetRefCommitID(ref.String()) + commitID, err := gitRepo.GetRefCommitID(ctx, ref.String()) if err != nil { return fmt.Errorf("gitRepo.GetRefCommitID: %w", err) } // Get the commit object for the ref - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { return fmt.Errorf("gitRepo.GetCommit: %w", err) } @@ -185,7 +185,7 @@ func notify(ctx context.Context, input *notifyInput) error { var detectedWorkflows []*actions_module.DetectedWorkflow actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig() - workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, + workflows, schedules, err := actions_module.DetectWorkflows(ctx, gitRepo, commit, input.Event, input.Payload, shouldDetectSchedules, @@ -216,11 +216,11 @@ func notify(ctx context.Context, input *notifyInput) error { if input.PullRequest != nil { // detect pull_request_target workflows baseRef := git.BranchPrefix + input.PullRequest.BaseBranch - baseCommit, err := gitRepo.GetCommit(baseRef) + baseCommit, err := gitRepo.GetCommit(ctx, baseRef) if err != nil { return fmt.Errorf("gitRepo.GetCommit: %w", err) } - baseWorkflows, _, err := actions_module.DetectWorkflows(gitRepo, baseCommit, input.Event, input.Payload, false) + baseWorkflows, _, err := actions_module.DetectWorkflows(ctx, gitRepo, baseCommit, input.Event, input.Payload, false) if err != nil { return fmt.Errorf("DetectWorkflows: %w", err) } @@ -502,7 +502,7 @@ func handleSchedules( input *notifyInput, ref string, ) error { - branch, err := commit.GetBranchName() + branch, err := commit.GetBranchName(ctx) if err != nil { return err } @@ -590,18 +590,18 @@ func DetectAndHandleSchedules(ctx context.Context, repo *repo_model.Repository) return nil } - gitRepo, err := gitrepo.OpenRepository(context.Background(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return fmt.Errorf("git.OpenRepository: %w", err) } defer gitRepo.Close() // Only detect schedule workflows on the default branch - commit, err := gitRepo.GetCommit(repo.DefaultBranch) + commit, err := gitRepo.GetCommit(ctx, repo.DefaultBranch) if err != nil { return fmt.Errorf("gitRepo.GetCommit: %w", err) } - scheduleWorkflows, err := actions_module.DetectScheduledWorkflows(gitRepo, commit) + scheduleWorkflows, err := actions_module.DetectScheduledWorkflows(ctx, gitRepo, commit) if err != nil { return fmt.Errorf("detect schedule workflows: %w", err) } diff --git a/services/actions/workflow.go b/services/actions/workflow.go index 40b34194e971b..c8d50c71fd155 100644 --- a/services/actions/workflow.go +++ b/services/actions/workflow.go @@ -77,12 +77,12 @@ func DispatchActionWorkflow(ctx reqctx.RequestContext, doer *user_model.User, re var runTargetCommit *git.Commit var err error if refName.IsTag() { - runTargetCommit, err = gitRepo.GetTagCommit(refName.TagName()) + runTargetCommit, err = gitRepo.GetTagCommit(ctx, refName.TagName()) } else if refName.IsBranch() { - runTargetCommit, err = gitRepo.GetBranchCommit(refName.BranchName()) + runTargetCommit, err = gitRepo.GetBranchCommit(ctx, refName.BranchName()) } else { refName = git.RefNameFromBranch(ref) - runTargetCommit, err = gitRepo.GetBranchCommit(ref) + runTargetCommit, err = gitRepo.GetBranchCommit(ctx, ref) } if err != nil { return util.ErrorWrapLocale( @@ -92,7 +92,7 @@ func DispatchActionWorkflow(ctx reqctx.RequestContext, doer *user_model.User, re } // get workflow entry from runTargetCommit - _, entries, err := actions.ListWorkflows(runTargetCommit) + _, entries, err := actions.ListWorkflows(ctx, runTargetCommit) if err != nil { return err } @@ -132,7 +132,7 @@ func DispatchActionWorkflow(ctx reqctx.RequestContext, doer *user_model.User, re ) } - content, err := actions.GetContentFromEntry(entry) + content, err := actions.GetContentFromEntry(ctx, entry) if err != nil { return err } diff --git a/services/agit/agit.go b/services/agit/agit.go index 8ba14f9b22632..154e79373bce6 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -115,7 +115,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. var commit *git.Commit if title == "" || description == "" { - commit, err = gitRepo.GetCommit(opts.NewCommitIDs[i]) + commit, err = gitRepo.GetCommit(ctx, opts.NewCommitIDs[i]) if err != nil { return nil, fmt.Errorf("failed to get commit %s in repository: %s Error: %w", opts.NewCommitIDs[i], repo.FullName(), err) } @@ -182,7 +182,7 @@ func ProcReceive(ctx context.Context, repo *repo_model.Repository, gitRepo *git. return nil, fmt.Errorf("unable to load base repository for PR[%d] Error: %w", pr.ID, err) } - oldCommitID, err := gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + oldCommitID, err := gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return nil, fmt.Errorf("unable to get ref commit id in base repository for PR[%d] Error: %w", pr.ID, err) } diff --git a/services/asymkey/commit.go b/services/asymkey/commit.go index 54ef052a507a9..f1a67fa7850cb 100644 --- a/services/asymkey/commit.go +++ b/services/asymkey/commit.go @@ -162,7 +162,7 @@ func parseCommitWithGPGSignature(ctx context.Context, c *git.Commit, committer * } } - defaultGPGSettings, err := c.GetRepositoryDefaultPublicGPGKey(false) + defaultGPGSettings, err := c.GetRepositoryDefaultPublicGPGKey(ctx, false) if err != nil { log.Error("Error getting default public gpg key: %v", err) } else if defaultGPGSettings == nil { diff --git a/services/asymkey/sign.go b/services/asymkey/sign.go index 61b9e56d954a2..d4194353ac4c2 100644 --- a/services/asymkey/sign.go +++ b/services/asymkey/sign.go @@ -247,12 +247,12 @@ Loop: return false, nil, nil, &ErrWontSign{twofa} } case parentSigned: - gitRepo, err := gitrepo.OpenRepository(ctx, repo.WikiStorageRepo()) + gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) if err != nil { return false, nil, nil, err } defer gitRepo.Close() - commit, err := gitRepo.GetCommit("HEAD") + commit, err := gitRepo.GetCommit(ctx, "HEAD") if err != nil { return false, nil, nil, err } @@ -300,17 +300,17 @@ Loop: return false, nil, nil, &ErrWontSign{twofa} } case parentSigned: - gitRepo, err := git.OpenRepository(ctx, tmpBasePath) + gitRepo, err := git.OpenRepository(tmpBasePath) if err != nil { return false, nil, nil, err } defer gitRepo.Close() - isEmpty, err := gitRepo.IsEmpty() + isEmpty, err := gitRepo.IsEmpty(ctx) if err != nil { return false, nil, nil, err } if !isEmpty { - commit, err := gitRepo.GetCommit(parentCommit) + commit, err := gitRepo.GetCommit(ctx, parentCommit) if err != nil { return false, nil, nil, err } @@ -380,13 +380,13 @@ Loop: } case baseSigned: if gitRepo == nil { - gitRepo, err = git.OpenRepository(ctx, tmpBasePath) + gitRepo, err = git.OpenRepository(tmpBasePath) if err != nil { return false, nil, nil, err } defer gitRepo.Close() } - commit, err := gitRepo.GetCommit(baseCommit) + commit, err := gitRepo.GetCommit(ctx, baseCommit) if err != nil { return false, nil, nil, err } @@ -396,13 +396,13 @@ Loop: } case headSigned: if gitRepo == nil { - gitRepo, err = git.OpenRepository(ctx, tmpBasePath) + gitRepo, err = git.OpenRepository(tmpBasePath) if err != nil { return false, nil, nil, err } defer gitRepo.Close() } - commit, err := gitRepo.GetCommit(headCommit) + commit, err := gitRepo.GetCommit(ctx, headCommit) if err != nil { return false, nil, nil, err } @@ -412,13 +412,13 @@ Loop: } case commitsSigned: if gitRepo == nil { - gitRepo, err = git.OpenRepository(ctx, tmpBasePath) + gitRepo, err = git.OpenRepository(tmpBasePath) if err != nil { return false, nil, nil, err } defer gitRepo.Close() } - commit, err := gitRepo.GetCommit(headCommit) + commit, err := gitRepo.GetCommit(ctx, headCommit) if err != nil { return false, nil, nil, err } @@ -427,11 +427,11 @@ Loop: return false, nil, nil, &ErrWontSign{commitsSigned} } // need to work out merge-base - mergeBaseCommit, _, err := gitRepo.GetMergeBase("", baseCommit, headCommit) + mergeBaseCommit, _, err := gitRepo.GetMergeBase(ctx, "", baseCommit, headCommit) if err != nil { return false, nil, nil, err } - commitList, err := commit.CommitsBeforeUntil(mergeBaseCommit) + commitList, err := commit.CommitsBeforeUntil(ctx, mergeBaseCommit) if err != nil { return false, nil, nil, err } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index a60883b4cc501..2ddf48ebaef6b 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -103,13 +103,13 @@ func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_m } func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) { - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return nil, err } defer gitRepo.Close() - refs, err := gitRepo.GetRefsBySha(sha, "") + refs, err := gitRepo.GetRefsBySha(ctx, sha, "") if err != nil { return nil, err } @@ -180,14 +180,14 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { } // check the sha is the same as pull request head commit id - baseGitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + baseGitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository: %v", err) return } defer baseGitRepo.Close() - headCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := baseGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Error("GetRefCommitID: %v", err) return @@ -209,7 +209,7 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { if pr.BaseRepoID == pr.HeadRepoID { headGitRepo = baseGitRepo } else { - headGitRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) + headGitRepo, err = gitrepo.OpenRepository(pr.HeadRepo) if err != nil { log.Error("OpenRepository %-v: %v", pr.HeadRepo, err) return diff --git a/services/automergequeue/automergequeue.go b/services/automergequeue/automergequeue.go index fa9c04da87492..f654fe5e690af 100644 --- a/services/automergequeue/automergequeue.go +++ b/services/automergequeue/automergequeue.go @@ -33,13 +33,13 @@ func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullReques return } - gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pull.BaseRepo) if err != nil { log.Error("OpenRepository: %v", err) return } defer gitRepo.Close() - commitID, err := gitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + commitID, err := gitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) if err != nil { log.Error("GetRefCommitID: %v", err) return diff --git a/services/context/api.go b/services/context/api.go index ab50a360f48b6..e57e9e319cba6 100644 --- a/services/context/api.go +++ b/services/context/api.go @@ -306,11 +306,11 @@ func RepoRefForAPI(next http.Handler) http.Handler { var err error switch refType { case git.RefTypeBranch: - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, refName) case git.RefTypeTag: - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(refName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(ctx, refName) case git.RefTypeCommit: - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(ctx, refName) } if ctx.Repo.Commit == nil || errors.Is(err, util.ErrNotExist) { ctx.APIErrorNotFound("unable to find a git ref") diff --git a/services/context/repo.go b/services/context/repo.go index 0ff1c7ea0337c..00074ce58bbdb 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -202,14 +202,14 @@ func (r *Repository) CanCreateIssueDependencies(ctx context.Context, user *user_ } // GetCommitsCount returns cached commit count for current view -func (r *Repository) GetCommitsCount() (int64, error) { +func (r *Repository) GetCommitsCount(ctx context.Context) (int64, error) { if r.Commit == nil { return 0, nil } contextName := r.RefFullName.ShortName() isRef := r.RefFullName.IsBranch() || r.RefFullName.IsTag() - return cache.GetInt64(r.Repository.GetCommitsCountCacheKey(contextName, isRef), func() (int64, error) { - return r.Commit.CommitsCount() + return cache.GetInt64(ctx, r.Repository.GetCommitsCountCacheKey(contextName, isRef), func(ctx context.Context) (int64, error) { + return r.Commit.CommitsCount(ctx) }) } @@ -217,7 +217,7 @@ func (r *Repository) GetCommitsCount() (int64, error) { func (r *Repository) GetCommitGraphsCount(ctx context.Context, hidePRRefs bool, branches, files []string) (int64, error) { cacheKey := fmt.Sprintf("commits-count-%d-graph-%t-%s-%s", r.Repository.ID, hidePRRefs, branches, files) - return cache.GetInt64(cacheKey, func() (int64, error) { + return cache.GetInt64(ctx, cacheKey, func(ctx context.Context) (int64, error) { if len(branches) == 0 { return git.AllCommitsCount(ctx, r.Repository.RepoPath(), hidePRRefs, files...) } @@ -241,7 +241,7 @@ func (r *Repository) RefTypeNameSubURL() string { // GetEditorconfig returns the .editorconfig definition if found in the // HEAD of the default repo branch. -func (r *Repository) GetEditorconfig(optCommit ...*git.Commit) (cfg *editorconfig.Editorconfig, warning, err error) { +func (r *Repository) GetEditorconfig(ctx context.Context, optCommit ...*git.Commit) (cfg *editorconfig.Editorconfig, warning, err error) { if r.GitRepo == nil { return nil, nil, nil } @@ -251,19 +251,19 @@ func (r *Repository) GetEditorconfig(optCommit ...*git.Commit) (cfg *editorconfi if len(optCommit) != 0 { commit = optCommit[0] } else { - commit, err = r.GitRepo.GetBranchCommit(r.Repository.DefaultBranch) + commit, err = r.GitRepo.GetBranchCommit(ctx, r.Repository.DefaultBranch) if err != nil { return nil, nil, err } } - treeEntry, err := commit.GetTreeEntryByPath(".editorconfig") + treeEntry, err := commit.GetTreeEntryByPath(ctx, ".editorconfig") if err != nil { return nil, nil, err } - if treeEntry.Blob().Size() >= setting.UI.MaxDisplayFileSize { + if treeEntry.Blob().Size(ctx) >= setting.UI.MaxDisplayFileSize { return nil, nil, git.ErrNotExist{ID: "", RelPath: ".editorconfig"} } - reader, err := treeEntry.Blob().DataAsync() + reader, err := treeEntry.Blob().DataAsync(ctx) if err != nil { return nil, nil, err } @@ -711,12 +711,12 @@ func RepoAssignment(ctx *Context) { const headRefName = "HEAD" -func getRefNameFromPath(repo *Repository, path string, isExist func(string) bool) string { +func getRefNameFromPath(base *Base, repo *Repository, path string, isExist func(context.Context, string) bool) string { refName := "" parts := strings.Split(path, "/") for i, part := range parts { refName = strings.TrimPrefix(refName+"/"+part, "/") - if isExist(refName) { + if isExist(base, refName) { repo.TreePath = strings.Join(parts[i+1:], "/") return refName } @@ -747,7 +747,7 @@ func getRefNameLegacy(ctx *Base, repo *Repository, reqPath, extraRef string) (re func getRefName(ctx *Base, repo *Repository, path string, refType git.RefType) string { switch refType { case git.RefTypeBranch: - ref := getRefNameFromPath(repo, path, repo.GitRepo.IsBranchExist) + ref := getRefNameFromPath(ctx, repo, path, repo.GitRepo.IsBranchExist) if len(ref) == 0 { // check if ref is HEAD parts := strings.Split(path, "/") @@ -757,8 +757,8 @@ func getRefName(ctx *Base, repo *Repository, path string, refType git.RefType) s } // maybe it's a renamed branch - return getRefNameFromPath(repo, path, func(s string) bool { - b, exist, err := git_model.FindRenamedBranch(ctx, repo.Repository.ID, s) + return getRefNameFromPath(ctx, repo, path, func(stdCtx context.Context, s string) bool { + b, exist, err := git_model.FindRenamedBranch(stdCtx, repo.Repository.ID, s) if err != nil { log.Error("FindRenamedBranch: %v", err) return false @@ -777,7 +777,7 @@ func getRefName(ctx *Base, repo *Repository, path string, refType git.RefType) s return ref case git.RefTypeTag: - return getRefNameFromPath(repo, path, repo.GitRepo.IsTagExist) + return getRefNameFromPath(ctx, repo, path, repo.GitRepo.IsTagExist) case git.RefTypeCommit: parts := strings.Split(path, "/") if git.IsStringLikelyCommitID(repo.GetObjectFormat(), parts[0], 7) { @@ -788,7 +788,7 @@ func getRefName(ctx *Base, repo *Repository, path string, refType git.RefType) s if parts[0] == headRefName { // HEAD ref points to last default branch commit - commit, err := repo.GitRepo.GetBranchCommit(repo.Repository.DefaultBranch) + commit, err := repo.GitRepo.GetBranchCommit(ctx, repo.Repository.DefaultBranch) if err != nil { return "" } @@ -819,8 +819,8 @@ func RepoRefByDefaultBranch() func(*Context) { return func(ctx *Context) { ctx.Repo.RefFullName = git.RefNameFromBranch(ctx.Repo.Repository.DefaultBranch) ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch - ctx.Repo.Commit, _ = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.BranchName) - ctx.Repo.CommitsCount, _ = ctx.Repo.GetCommitsCount() + ctx.Repo.Commit, _ = ctx.Repo.GitRepo.GetBranchCommit(ctx, ctx.Repo.BranchName) + ctx.Repo.CommitsCount, _ = ctx.Repo.GetCommitsCount(ctx) ctx.Data["RefFullName"] = ctx.Repo.RefFullName ctx.Data["BranchName"] = ctx.Repo.BranchName ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount @@ -853,7 +853,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { if reqPath == "" { refShortName = ctx.Repo.Repository.DefaultBranch if !gitrepo.IsBranchExist(ctx, ctx.Repo.Repository, refShortName) { - brs, _, err := ctx.Repo.GitRepo.GetBranchNames(0, 1) + brs, _, err := ctx.Repo.GitRepo.GetBranchNames(ctx, 0, 1) if err == nil && len(brs) != 0 { refShortName = brs[0] } else if len(brs) == 0 { @@ -864,7 +864,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { } ctx.Repo.RefFullName = git.RefNameFromBranch(refShortName) ctx.Repo.BranchName = refShortName - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refShortName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, refShortName) if err == nil { ctx.Repo.CommitID = ctx.Repo.Commit.ID.String() } else if strings.Contains(err.Error(), "fatal: not a git repository") || strings.Contains(err.Error(), "object does not exist") { @@ -896,7 +896,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { ctx.Repo.BranchName = refShortName ctx.Repo.RefFullName = git.RefNameFromBranch(refShortName) - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refShortName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx, refShortName) if err != nil { ctx.ServerError("GetBranchCommit", err) return @@ -905,7 +905,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { } else if refType == git.RefTypeTag && gitrepo.IsTagExist(ctx, ctx.Repo.Repository, refShortName) { ctx.Repo.RefFullName = git.RefNameFromTag(refShortName) - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(refShortName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetTagCommit(ctx, refShortName) if err != nil { if git.IsErrNotExist(err) { ctx.NotFound(err) @@ -919,7 +919,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { ctx.Repo.RefFullName = git.RefNameFromCommit(refShortName) ctx.Repo.CommitID = refShortName - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refShortName) + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(ctx, refShortName) if err != nil { ctx.NotFound(err) return @@ -969,7 +969,7 @@ func RepoRefByType(detectRefType git.RefType) func(*Context) { ctx.Data["CanCreateBranch"] = ctx.Repo.CanCreateBranch() // only used by the branch selector dropdown: AllowCreateNewRef - ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount() + ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount(ctx) if err != nil { ctx.ServerError("GetCommitsCount", err) return @@ -1000,8 +1000,8 @@ func GitHookService() func(ctx *Context) { // canWriteAsMaintainer check if the doer can write to a branch as a maintainer func canWriteAsMaintainer(ctx *Context) bool { - branchName := getRefNameFromPath(ctx.Repo, ctx.PathParam("*"), func(branchName string) bool { - return issues_model.CanMaintainerWriteToBranch(ctx, ctx.Repo.Permission, branchName, ctx.Doer) + branchName := getRefNameFromPath(ctx.Base, ctx.Repo, ctx.PathParam("*"), func(stdCtx context.Context, branchName string) bool { + return issues_model.CanMaintainerWriteToBranch(stdCtx, ctx.Repo.Permission, branchName, ctx.Doer) }) return len(branchName) > 0 } diff --git a/services/contexttest/context_tests.go b/services/contexttest/context_tests.go index 44d9f4a70f0ec..9b1e2f322a225 100644 --- a/services/contexttest/context_tests.go +++ b/services/contexttest/context_tests.go @@ -141,7 +141,7 @@ func LoadRepoCommit(t *testing.T, ctx gocontext.Context) { assert.FailNow(t, "context is not *context.Context or *context.APIContext") } - gitRepo, err := gitrepo.OpenRepository(ctx, repo.Repository) + gitRepo, err := gitrepo.OpenRepository(repo.Repository) require.NoError(t, err) defer gitRepo.Close() @@ -151,7 +151,7 @@ func LoadRepoCommit(t *testing.T, ctx gocontext.Context) { if repo.RefFullName.IsPull() { repo.BranchName = repo.RefFullName.ShortName() } - repo.Commit, err = gitRepo.GetCommit(repo.RefFullName.String()) + repo.Commit, err = gitRepo.GetCommit(ctx, repo.RefFullName.String()) require.NoError(t, err) } @@ -182,7 +182,7 @@ func LoadGitRepo(t *testing.T, ctx gocontext.Context) { } assert.NoError(t, repo.Repository.LoadOwner(ctx)) var err error - repo.GitRepo, err = gitrepo.OpenRepository(ctx, repo.Repository) + repo.GitRepo, err = gitrepo.OpenRepository(repo.Repository) assert.NoError(t, err) } diff --git a/services/convert/convert.go b/services/convert/convert.go index 0de38221409bb..9566b9d4eac42 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -394,7 +394,7 @@ func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, co cfgUnit := repo.MustGetUnit(ctx, unit.TypeActions) cfg := cfgUnit.ActionsConfig() - defaultBranch, _ := commit.GetBranchName() + defaultBranch, _ := commit.GetBranchName(ctx) workflowURL := fmt.Sprintf("%s/actions/workflows/%s", repo.APIURL(), util.PathEscapeSegments(entry.Name())) workflowRepoURL := fmt.Sprintf("%s/src/branch/%s/%s/%s", repo.HTMLURL(ctx), util.PathEscapeSegments(defaultBranch), util.PathEscapeSegments(folder), util.PathEscapeSegments(entry.Name())) @@ -420,7 +420,7 @@ func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, co createdAt := commit.Author.When updatedAt := commit.Author.When - content, err := actions.GetContentFromEntry(entry) + content, err := actions.GetContentFromEntry(ctx, entry) name := entry.Name() if err == nil { workflow, err := model.ReadWorkflow(bytes.NewReader(content)) @@ -450,12 +450,12 @@ func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, co } func ListActionWorkflows(ctx context.Context, gitrepo *git.Repository, repo *repo_model.Repository) ([]*api.ActionWorkflow, error) { - defaultBranchCommit, err := gitrepo.GetBranchCommit(repo.DefaultBranch) + defaultBranchCommit, err := gitrepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return nil, err } - folder, entries, err := actions.ListWorkflows(defaultBranchCommit) + folder, entries, err := actions.ListWorkflows(ctx, defaultBranchCommit) if err != nil { return nil, err } diff --git a/services/convert/git_commit.go b/services/convert/git_commit.go index d0228c45fb214..fd364a517ba44 100644 --- a/services/convert/git_commit.go +++ b/services/convert/git_commit.go @@ -190,7 +190,7 @@ func ToCommit(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Rep // Retrieve files affected by the commit if opts.Files { - fileStatus, err := git.GetCommitFileStatus(gitRepo.Ctx, repo.RepoPath(), commit.ID.String()) + fileStatus, err := git.GetCommitFileStatus(ctx, repo.RepoPath(), commit.ID.String()) if err != nil { return nil, err } diff --git a/services/convert/pull.go b/services/convert/pull.go index 8b783d396aee8..1e19a908821fa 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -144,7 +144,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u apiPullRequest.Closed = pr.Issue.ClosedUnix.AsTimePtr() } - gitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.BaseRepo.RelativePath(), err) return nil @@ -158,7 +158,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u } if exist { - baseCommit, err = gitRepo.GetBranchCommit(pr.BaseBranch) + baseCommit, err = gitRepo.GetBranchCommit(ctx, pr.BaseBranch) if err != nil && !git.IsErrNotExist(err) { log.Error("GetCommit[%s]: %v", baseBranch, err) return nil @@ -170,7 +170,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u } if pr.Flow == issues_model.PullRequestFlowAGit { - apiPullRequest.Head.Sha, err = gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + apiPullRequest.Head.Sha, err = gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Error("GetRefCommitID[%s]: %v", pr.GetGitHeadRefName(), err) return nil @@ -190,7 +190,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u apiPullRequest.Head.RepoID = pr.HeadRepo.ID apiPullRequest.Head.Repository = ToRepo(ctx, pr.HeadRepo, p) - headGitRepo, err := gitrepo.OpenRepository(ctx, pr.HeadRepo) + headGitRepo, err := gitrepo.OpenRepository(pr.HeadRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.HeadRepo.RelativePath(), err) return nil @@ -210,7 +210,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u ) if !exist { - headCommitID, err := headGitRepo.GetRefCommitID(apiPullRequest.Head.Ref) + headCommitID, err := headGitRepo.GetRefCommitID(ctx, apiPullRequest.Head.Ref) if err != nil && !git.IsErrNotExist(err) { log.Error("GetCommit[%s]: %v", pr.HeadBranch, err) return nil @@ -220,7 +220,7 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u endCommitID = headCommitID } } else { - commit, err := headGitRepo.GetBranchCommit(pr.HeadBranch) + commit, err := headGitRepo.GetBranchCommit(ctx, pr.HeadBranch) if err != nil && !git.IsErrNotExist(err) { log.Error("GetCommit[%s]: %v", headBranch, err) return nil @@ -246,13 +246,13 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u } if len(apiPullRequest.Head.Sha) == 0 && len(apiPullRequest.Head.Ref) != 0 { - baseGitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + baseGitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) if err != nil { log.Error("OpenRepository[%s]: %v", pr.BaseRepo.RelativePath(), err) return nil } defer baseGitRepo.Close() - refs, err := baseGitRepo.GetRefsFiltered(apiPullRequest.Head.Ref) + refs, err := baseGitRepo.GetRefsFiltered(ctx, apiPullRequest.Head.Ref) if err != nil { log.Error("GetRefsFiltered[%s]: %v", apiPullRequest.Head.Ref, err) return nil @@ -328,7 +328,7 @@ func ToAPIPullRequests(ctx context.Context, baseRepo *repo_model.Repository, prs return nil, err } - gitRepo, err := gitrepo.OpenRepository(ctx, baseRepo) + gitRepo, err := gitrepo.OpenRepository(baseRepo) if err != nil { return nil, err } @@ -450,13 +450,13 @@ func ToAPIPullRequests(ctx context.Context, baseRepo *repo_model.Repository, prs if pr.Flow == issues_model.PullRequestFlowAGit { apiPullRequest.Head.Name = "" } - apiPullRequest.Head.Sha, err = gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + apiPullRequest.Head.Sha, err = gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Error("GetRefCommitID[%s]: %v", pr.GetGitHeadRefName(), err) } if len(apiPullRequest.Head.Sha) == 0 && len(apiPullRequest.Head.Ref) != 0 { - refs, err := gitRepo.GetRefsFiltered(apiPullRequest.Head.Ref) + refs, err := gitRepo.GetRefsFiltered(ctx, apiPullRequest.Head.Ref) if err != nil { log.Error("GetRefsFiltered[%s]: %v", apiPullRequest.Head.Ref, err) return nil, err diff --git a/services/gitdiff/git_diff_tree.go b/services/gitdiff/git_diff_tree.go index 4649c24af311b..550a134095e4d 100644 --- a/services/gitdiff/git_diff_tree.go +++ b/services/gitdiff/git_diff_tree.go @@ -51,7 +51,7 @@ func GetDiffTree(ctx context.Context, gitRepo *git.Repository, useMergeBase bool } func runGitDiffTree(ctx context.Context, gitRepo *git.Repository, useMergeBase bool, baseSha, headSha string) ([]*DiffTreeRecord, error) { - useMergeBase, baseCommitID, headCommitID, err := validateGitDiffTreeArguments(gitRepo, useMergeBase, baseSha, headSha) + useMergeBase, baseCommitID, headCommitID, err := validateGitDiffTreeArguments(ctx, gitRepo, useMergeBase, baseSha, headSha) if err != nil { return nil, err } @@ -70,14 +70,14 @@ func runGitDiffTree(ctx context.Context, gitRepo *git.Repository, useMergeBase b return parseGitDiffTree(strings.NewReader(stdout)) } -func validateGitDiffTreeArguments(gitRepo *git.Repository, useMergeBase bool, baseSha, headSha string) (shouldUseMergeBase bool, resolvedBaseSha, resolvedHeadSha string, err error) { +func validateGitDiffTreeArguments(ctx context.Context, gitRepo *git.Repository, useMergeBase bool, baseSha, headSha string) (shouldUseMergeBase bool, resolvedBaseSha, resolvedHeadSha string, err error) { // if the head is empty its an error if headSha == "" { return false, "", "", errors.New("headSha is empty") } // if the head commit doesn't exist its and error - headCommit, err := gitRepo.GetCommit(headSha) + headCommit, err := gitRepo.GetCommit(ctx, headSha) if err != nil { return false, "", "", fmt.Errorf("failed to get commit headSha: %v", err) } @@ -88,7 +88,7 @@ func validateGitDiffTreeArguments(gitRepo *git.Repository, useMergeBase bool, ba // if the headCommit has no parent we should use an empty commit // this can happen when we are generating a diff against an orphaned commit if headCommit.ParentCount() == 0 { - objectFormat, err := gitRepo.GetObjectFormat() + objectFormat, err := gitRepo.GetObjectFormat(ctx) if err != nil { return false, "", "", err } @@ -97,7 +97,7 @@ func validateGitDiffTreeArguments(gitRepo *git.Repository, useMergeBase bool, ba return false, objectFormat.EmptyTree().String(), headCommitID, nil } - baseCommit, err := headCommit.Parent(0) + baseCommit, err := headCommit.Parent(ctx, 0) if err != nil { return false, "", "", fmt.Errorf("baseSha is '', attempted to use parent of commit %s, got error: %v", headCommit.ID.String(), err) } @@ -105,7 +105,7 @@ func validateGitDiffTreeArguments(gitRepo *git.Repository, useMergeBase bool, ba } // try and get the base commit - baseCommit, err := gitRepo.GetCommit(baseSha) + baseCommit, err := gitRepo.GetCommit(ctx, baseSha) // propagate the error if we couldn't get the base commit if err != nil { return useMergeBase, "", "", fmt.Errorf("failed to get base commit %s: %v", baseSha, err) diff --git a/services/gitdiff/git_diff_tree_test.go b/services/gitdiff/git_diff_tree_test.go index c6e3fbab813ee..69315f000494a 100644 --- a/services/gitdiff/git_diff_tree_test.go +++ b/services/gitdiff/git_diff_tree_test.go @@ -205,7 +205,7 @@ func TestGitDiffTree(t *testing.T) { for _, tt := range test { t.Run(tt.Name, func(t *testing.T) { - gitRepo, err := git.OpenRepository(t.Context(), tt.RepoPath) + gitRepo, err := git.OpenRepository(tt.RepoPath) assert.NoError(t, err) defer gitRepo.Close() @@ -414,7 +414,7 @@ func TestGitDiffTreeErrors(t *testing.T) { for _, tt := range test { t.Run(tt.Name, func(t *testing.T) { - gitRepo, err := git.OpenRepository(t.Context(), tt.RepoPath) + gitRepo, err := git.OpenRepository(tt.RepoPath) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index db0f565b526a0..6ccdc4c084122 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -361,17 +361,17 @@ type DiffLimitedContent struct { } // GetTailSectionAndLimitedContent creates a fake DiffLineSection if the last section is not the end of the file -func (diffFile *DiffFile) GetTailSectionAndLimitedContent(leftCommit, rightCommit *git.Commit) (_ *DiffSection, diffLimitedContent DiffLimitedContent) { +func (diffFile *DiffFile) GetTailSectionAndLimitedContent(ctx context.Context, leftCommit, rightCommit *git.Commit) (_ *DiffSection, diffLimitedContent DiffLimitedContent) { var leftLineCount, rightLineCount int diffLimitedContent = DiffLimitedContent{} if diffFile.IsBin || diffFile.IsLFSFile { return nil, diffLimitedContent } if (diffFile.Type == DiffFileDel || diffFile.Type == DiffFileChange) && leftCommit != nil { - leftLineCount, diffLimitedContent.LeftContent = getCommitFileLineCountAndLimitedContent(leftCommit, diffFile.OldName) + leftLineCount, diffLimitedContent.LeftContent = getCommitFileLineCountAndLimitedContent(ctx, leftCommit, diffFile.OldName) } if (diffFile.Type == DiffFileAdd || diffFile.Type == DiffFileChange) && rightCommit != nil { - rightLineCount, diffLimitedContent.RightContent = getCommitFileLineCountAndLimitedContent(rightCommit, diffFile.OldName) + rightLineCount, diffLimitedContent.RightContent = getCommitFileLineCountAndLimitedContent(ctx, rightCommit, diffFile.OldName) } if len(diffFile.Sections) == 0 || diffFile.Type != DiffFileChange { return nil, diffLimitedContent @@ -445,13 +445,13 @@ func (l *limitByteWriter) Write(p []byte) (n int, err error) { return l.buf.Write(p) } -func getCommitFileLineCountAndLimitedContent(commit *git.Commit, filePath string) (lineCount int, limitWriter *limitByteWriter) { - blob, err := commit.GetBlobByPath(filePath) +func getCommitFileLineCountAndLimitedContent(ctx context.Context, commit *git.Commit, filePath string) (lineCount int, limitWriter *limitByteWriter) { + blob, err := commit.GetBlobByPath(ctx, filePath) if err != nil { return 0, nil } w := &limitByteWriter{limit: MaxDiffHighlightEntireFileSize + 1} - lineCount, err = blob.GetBlobLineCount(w) + lineCount, err = blob.GetBlobLineCount(ctx, w) if err != nil { return 0, nil } @@ -1106,7 +1106,7 @@ type DiffOptions struct { DirectComparison bool } -func guessBeforeCommitForDiff(gitRepo *git.Repository, beforeCommitID string, afterCommit *git.Commit) (actualBeforeCommit *git.Commit, actualBeforeCommitID git.ObjectID, err error) { +func guessBeforeCommitForDiff(ctx context.Context, gitRepo *git.Repository, beforeCommitID string, afterCommit *git.Commit) (actualBeforeCommit *git.Commit, actualBeforeCommitID git.ObjectID, err error) { commitObjectFormat := afterCommit.ID.Type() isBeforeCommitIDEmpty := beforeCommitID == "" || beforeCommitID == commitObjectFormat.EmptyObjectID().String() @@ -1114,9 +1114,9 @@ func guessBeforeCommitForDiff(gitRepo *git.Repository, beforeCommitID string, af actualBeforeCommitID = commitObjectFormat.EmptyTree() } else { if isBeforeCommitIDEmpty { - actualBeforeCommit, err = afterCommit.Parent(0) + actualBeforeCommit, err = afterCommit.Parent(ctx, 0) } else { - actualBeforeCommit, err = gitRepo.GetCommit(beforeCommitID) + actualBeforeCommit, err = gitRepo.GetCommit(ctx, beforeCommitID) } if err != nil { return nil, nil, err @@ -1133,12 +1133,12 @@ func guessBeforeCommitForDiff(gitRepo *git.Repository, beforeCommitID string, af func getDiffBasic(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, files ...string) (_ *Diff, beforeCommit, afterCommit *git.Commit, err error) { repoPath := gitRepo.Path - afterCommit, err = gitRepo.GetCommit(opts.AfterCommitID) + afterCommit, err = gitRepo.GetCommit(ctx, opts.AfterCommitID) if err != nil { return nil, nil, nil, err } - beforeCommit, beforeCommitID, err := guessBeforeCommitForDiff(gitRepo, opts.BeforeCommitID, afterCommit) + beforeCommit, beforeCommitID, err := guessBeforeCommitForDiff(ctx, gitRepo, opts.BeforeCommitID, afterCommit) if err != nil { return nil, nil, nil, err } @@ -1202,7 +1202,7 @@ func GetDiffForRender(ctx context.Context, repoLink string, gitRepo *git.Reposit return nil, err } - checker, err := attribute.NewBatchChecker(gitRepo, opts.AfterCommitID, []string{attribute.LinguistVendored, attribute.LinguistGenerated, attribute.LinguistLanguage, attribute.GitlabLanguage, attribute.Diff}) + checker, err := attribute.NewBatchChecker(ctx, gitRepo, opts.AfterCommitID, []string{attribute.LinguistVendored, attribute.LinguistGenerated, attribute.LinguistLanguage, attribute.GitlabLanguage, attribute.Diff}) if err != nil { return nil, err } @@ -1212,7 +1212,7 @@ func GetDiffForRender(ctx context.Context, repoLink string, gitRepo *git.Reposit isVendored := optional.None[bool]() isGenerated := optional.None[bool]() attrDiff := optional.None[string]() - attrs, err := checker.CheckPath(diffFile.Name) + attrs, err := checker.CheckPath(ctx, diffFile.Name) if err == nil { isVendored, isGenerated = attrs.GetVendored(), attrs.GetGenerated() language := attrs.GetLanguage() @@ -1224,7 +1224,7 @@ func GetDiffForRender(ctx context.Context, repoLink string, gitRepo *git.Reposit // Populate Submodule URLs if diffFile.SubmoduleDiffInfo != nil { - diffFile.SubmoduleDiffInfo.PopulateURL(repoLink, diffFile, beforeCommit, afterCommit) + diffFile.SubmoduleDiffInfo.PopulateURL(ctx, repoLink, diffFile, beforeCommit, afterCommit) } if !isVendored.Has() { @@ -1236,7 +1236,7 @@ func GetDiffForRender(ctx context.Context, repoLink string, gitRepo *git.Reposit isGenerated = optional.Some(analyze.IsGenerated(diffFile.Name)) } diffFile.IsGenerated = isGenerated.Value() - tailSection, limitedContent := diffFile.GetTailSectionAndLimitedContent(beforeCommit, afterCommit) + tailSection, limitedContent := diffFile.GetTailSectionAndLimitedContent(ctx, beforeCommit, afterCommit) if tailSection != nil { diffFile.Sections = append(diffFile.Sections, tailSection) } @@ -1282,12 +1282,12 @@ type DiffShortStat struct { } func GetDiffShortStat(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, beforeCommitID, afterCommitID string) (*DiffShortStat, error) { - afterCommit, err := gitRepo.GetCommit(afterCommitID) + afterCommit, err := gitRepo.GetCommit(ctx, afterCommitID) if err != nil { return nil, err } - _, actualBeforeCommitID, err := guessBeforeCommitForDiff(gitRepo, beforeCommitID, afterCommit) + _, actualBeforeCommitID, err := guessBeforeCommitForDiff(ctx, gitRepo, beforeCommitID, afterCommit) if err != nil { return nil, err } @@ -1316,7 +1316,7 @@ func SyncUserSpecificDiff(ctx context.Context, userID int64, pull *issues_model. latestCommit = pull.HeadBranch // opts.AfterCommitID is preferred because it handles PRs from forks correctly and the branch name doesn't } - changedFiles, errIgnored := gitRepo.GetFilesChangedBetween(review.CommitSHA, latestCommit) + changedFiles, errIgnored := gitRepo.GetFilesChangedBetween(ctx, review.CommitSHA, latestCommit) // There are way too many possible errors. // Examples are various git errors such as the commit the review was based on was gc'ed and hence doesn't exist anymore as well as unrecoverable errors where we should serve a 500 response // Due to the current architecture and physical limitation of needing to compare explicit error messages, we can only choose one approach without the code getting ugly diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index 7b64b6b5f8ae2..cea4c8516fc5b 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -599,7 +599,7 @@ func TestDiffLine_GetCommentSide(t *testing.T) { } func TestGetDiffRangeWithWhitespaceBehavior(t *testing.T) { - gitRepo, err := git.OpenRepository(t.Context(), "../../modules/git/tests/repos/repo5_pulls") + gitRepo, err := git.OpenRepository("../../modules/git/tests/repos/repo5_pulls") require.NoError(t, err) defer gitRepo.Close() diff --git a/services/gitdiff/submodule.go b/services/gitdiff/submodule.go index 4347743e3d0b0..7803d51757faf 100644 --- a/services/gitdiff/submodule.go +++ b/services/gitdiff/submodule.go @@ -20,7 +20,7 @@ type SubmoduleDiffInfo struct { PreviousRefID string } -func (si *SubmoduleDiffInfo) PopulateURL(repoLink string, diffFile *DiffFile, leftCommit, rightCommit *git.Commit) { +func (si *SubmoduleDiffInfo) PopulateURL(ctx context.Context, repoLink string, diffFile *DiffFile, leftCommit, rightCommit *git.Commit) { si.SubmoduleName = diffFile.Name submoduleCommit := rightCommit // If the submodule is added or updated, check at the right commit if diffFile.IsDeleted { @@ -31,7 +31,7 @@ func (si *SubmoduleDiffInfo) PopulateURL(repoLink string, diffFile *DiffFile, le } submoduleFullPath := diffFile.GetDiffFileName() - submodule, err := submoduleCommit.GetSubModule(submoduleFullPath) + submodule, err := submoduleCommit.GetSubModule(ctx, submoduleFullPath) if err != nil { log.Error("Unable to PopulateURL for submodule %q: GetSubModule: %v", submoduleFullPath, err) return // ignore the error, do not cause 500 errors for end users diff --git a/services/issue/comments.go b/services/issue/comments.go index 9442701029b57..a5ff8b1ad2b4c 100644 --- a/services/issue/comments.go +++ b/services/issue/comments.go @@ -177,7 +177,7 @@ func LoadCommentPushCommits(ctx context.Context, c *issues_model.Comment) (err e } defer closer.Close() - c.Commits, err = git_service.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo) + c.Commits, err = git_service.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(ctx, data.CommitIDs), c.Issue.Repo) if err != nil { return err } diff --git a/services/issue/pull.go b/services/issue/pull.go index 8ee14c0a4b5ae..fe5294303cbd4 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -32,7 +32,7 @@ func getMergeBase(ctx context.Context, repo *repo_model.Repository, gitRepo *git } }() - mergeBase, _, err := gitRepo.GetMergeBase(tmpRemote, baseBranch, headBranch) + mergeBase, _, err := gitRepo.GetMergeBase(ctx, tmpRemote, baseBranch, headBranch) return mergeBase, err } @@ -69,21 +69,21 @@ func PullRequestCodeOwnersReview(ctx context.Context, pr *issues_model.PullReque return nil, nil } - repo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + repo, err := gitrepo.OpenRepository(pr.BaseRepo) if err != nil { return nil, err } defer repo.Close() - commit, err := repo.GetBranchCommit(pr.BaseRepo.DefaultBranch) + commit, err := repo.GetBranchCommit(ctx, pr.BaseRepo.DefaultBranch) if err != nil { return nil, err } var data string for _, file := range codeOwnerFiles { - if blob, err := commit.GetBlobByPath(file); err == nil { - data, err = blob.GetBlobContent(setting.UI.MaxDisplayFileSize) + if blob, err := commit.GetBlobByPath(ctx, file); err == nil { + data, err = blob.GetBlobContent(ctx, setting.UI.MaxDisplayFileSize) if err == nil { break } @@ -106,7 +106,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, pr *issues_model.PullReque // https://github.com/go-gitea/gitea/issues/29763, we need to get the files changed // between the merge base and the head commit but not the base branch and the head commit - changedFiles, err := repo.GetFilesChangedBetween(mergeBase, pr.GetGitHeadRefName()) + changedFiles, err := repo.GetFilesChangedBetween(ctx, mergeBase, pr.GetGitHeadRefName()) if err != nil { return nil, err } diff --git a/services/issue/template.go b/services/issue/template.go index 4b0f1aa987047..786d7d645be4f 100644 --- a/services/issue/template.go +++ b/services/issue/template.go @@ -4,6 +4,7 @@ package issue import ( + "context" "fmt" "io" "net/url" @@ -47,17 +48,17 @@ func GetDefaultTemplateConfig() api.IssueConfig { // GetTemplateConfig loads the given issue config file. // It never returns a nil config. -func GetTemplateConfig(gitRepo *git.Repository, path string, commit *git.Commit) (api.IssueConfig, error) { +func GetTemplateConfig(ctx context.Context, gitRepo *git.Repository, path string, commit *git.Commit) (api.IssueConfig, error) { if gitRepo == nil { return GetDefaultTemplateConfig(), nil } - treeEntry, err := commit.GetTreeEntryByPath(path) + treeEntry, err := commit.GetTreeEntryByPath(ctx, path) if err != nil { return GetDefaultTemplateConfig(), err } - reader, err := treeEntry.Blob().DataAsync() + reader, err := treeEntry.Blob().DataAsync(ctx) if err != nil { log.Debug("DataAsync: %v", err) return GetDefaultTemplateConfig(), nil @@ -109,7 +110,7 @@ func IsTemplateConfig(path string) bool { // ParseTemplatesFromDefaultBranch parses the issue templates in the repo's default branch, // returns valid templates and the errors of invalid template files (the errors map is guaranteed to be non-nil). -func ParseTemplatesFromDefaultBranch(repo *repo.Repository, gitRepo *git.Repository) (ret struct { +func ParseTemplatesFromDefaultBranch(ctx context.Context, repo *repo.Repository, gitRepo *git.Repository) (ret struct { IssueTemplates []*api.IssueTemplate TemplateErrors map[string]error }, @@ -119,18 +120,18 @@ func ParseTemplatesFromDefaultBranch(repo *repo.Repository, gitRepo *git.Reposit return ret } - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return ret } for _, dirName := range templateDirCandidates { - tree, err := commit.SubTree(dirName) + tree, err := commit.SubTree(ctx, dirName) if err != nil { log.Debug("get sub tree of %s: %v", dirName, err) continue } - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { log.Debug("list entries in %s: %v", dirName, err) return ret @@ -140,7 +141,7 @@ func ParseTemplatesFromDefaultBranch(repo *repo.Repository, gitRepo *git.Reposit continue } fullName := path.Join(dirName, entry.Name()) - if it, err := template.UnmarshalFromEntry(entry, dirName); err != nil { + if it, err := template.UnmarshalFromEntry(ctx, entry, dirName); err != nil { ret.TemplateErrors[fullName] = err } else { if !strings.HasPrefix(it.Ref, "refs/") { // Assume that the ref intended is always a branch - for tags users should use refs/tags/ @@ -155,35 +156,35 @@ func ParseTemplatesFromDefaultBranch(repo *repo.Repository, gitRepo *git.Reposit // GetTemplateConfigFromDefaultBranch returns the issue config for this repo. // It never returns a nil config. -func GetTemplateConfigFromDefaultBranch(repo *repo.Repository, gitRepo *git.Repository) (api.IssueConfig, error) { +func GetTemplateConfigFromDefaultBranch(ctx context.Context, repo *repo.Repository, gitRepo *git.Repository) (api.IssueConfig, error) { if repo.IsEmpty { return GetDefaultTemplateConfig(), nil } - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return GetDefaultTemplateConfig(), err } for _, configName := range templateConfigCandidates { - if _, err := commit.GetTreeEntryByPath(configName + ".yaml"); err == nil { - return GetTemplateConfig(gitRepo, configName+".yaml", commit) + if _, err := commit.GetTreeEntryByPath(ctx, configName+".yaml"); err == nil { + return GetTemplateConfig(ctx, gitRepo, configName+".yaml", commit) } - if _, err := commit.GetTreeEntryByPath(configName + ".yml"); err == nil { - return GetTemplateConfig(gitRepo, configName+".yml", commit) + if _, err := commit.GetTreeEntryByPath(ctx, configName+".yml"); err == nil { + return GetTemplateConfig(ctx, gitRepo, configName+".yml", commit) } } return GetDefaultTemplateConfig(), nil } -func HasTemplatesOrContactLinks(repo *repo.Repository, gitRepo *git.Repository) bool { - ret := ParseTemplatesFromDefaultBranch(repo, gitRepo) +func HasTemplatesOrContactLinks(ctx context.Context, repo *repo.Repository, gitRepo *git.Repository) bool { + ret := ParseTemplatesFromDefaultBranch(ctx, repo, gitRepo) if len(ret.IssueTemplates) > 0 { return true } - issueConfig, _ := GetTemplateConfigFromDefaultBranch(repo, gitRepo) + issueConfig, _ := GetTemplateConfigFromDefaultBranch(ctx, repo, gitRepo) return len(issueConfig.ContactLinks) > 0 } diff --git a/services/markup/renderhelper_codepreview.go b/services/markup/renderhelper_codepreview.go index fa1eb824a2f54..11547b841a655 100644 --- a/services/markup/renderhelper_codepreview.go +++ b/services/markup/renderhelper_codepreview.go @@ -50,28 +50,28 @@ func renderRepoFileCodePreview(ctx context.Context, opts markup.RenderCodePrevie return "", util.ErrPermissionDenied } - gitRepo, err := gitrepo.OpenRepository(ctx, dbRepo) + gitRepo, err := gitrepo.OpenRepository(dbRepo) if err != nil { return "", err } defer gitRepo.Close() - commit, err := gitRepo.GetCommit(opts.CommitID) + commit, err := gitRepo.GetCommit(ctx, opts.CommitID) if err != nil { return "", err } language, _ := languagestats.GetFileLanguage(ctx, gitRepo, opts.CommitID, opts.FilePath) - blob, err := commit.GetBlobByPath(opts.FilePath) + blob, err := commit.GetBlobByPath(ctx, opts.FilePath) if err != nil { return "", err } - if blob.Size() > setting.UI.MaxDisplayFileSize { + if blob.Size(ctx) > setting.UI.MaxDisplayFileSize { return "", errors.New("file is too large") } - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { return "", err } diff --git a/services/migrations/dump.go b/services/migrations/dump.go index f9309e5e6a2ea..63d64ad5692a3 100644 --- a/services/migrations/dump.go +++ b/services/migrations/dump.go @@ -186,7 +186,7 @@ func (g *RepositoryDumper) CreateRepo(ctx context.Context, repo *base.Repository } } - g.gitRepo, err = git.OpenRepository(ctx, g.gitPath()) + g.gitRepo, err = git.OpenRepository(g.gitPath()) return err } @@ -508,7 +508,7 @@ func (g *RepositoryDumper) handlePullRequest(ctx context.Context, pr *base.PullR remote = "head-pr-" + strconv.FormatInt(pr.Number, 10) } // ... now add the remote - err := g.gitRepo.AddRemote(remote, pr.Head.CloneURL, true) + err := g.gitRepo.AddRemote(ctx, remote, pr.Head.CloneURL, true) if err != nil { log.Error("PR #%d in %s/%s AddRemote[%s] failed: %v", pr.Number, g.repoOwner, g.repoName, remote, err) } else { @@ -535,10 +535,10 @@ func (g *RepositoryDumper) handlePullRequest(ctx context.Context, pr *base.PullR localRef = git.SanitizeRefPattern(oldHeadOwnerName + "/" + pr.Head.Ref) // ... Now we must assert that this does not exist - if g.gitRepo.IsBranchExist(localRef) { + if g.gitRepo.IsBranchExist(ctx, localRef) { localRef = "head-pr-" + strconv.FormatInt(pr.Number, 10) + "/" + localRef i := 0 - for g.gitRepo.IsBranchExist(localRef) { + for g.gitRepo.IsBranchExist(ctx, localRef) { if i > 5 { // ... We tried, we really tried but this is just a seriously unfriendly repo return fmt.Errorf("unable to create unique local reference from %s", pr.Head.Ref) @@ -570,7 +570,7 @@ func (g *RepositoryDumper) handlePullRequest(ctx context.Context, pr *base.PullR // 5. Now if pr.Head.SHA == "" we should recover this to the head of this branch if pr.Head.SHA == "" { - headSha, err := g.gitRepo.GetBranchCommitID(localRef) + headSha, err := g.gitRepo.GetBranchCommitID(ctx, localRef) if err != nil { log.Error("unable to get head SHA of local head for PR #%d from %s in %s/%s. Error: %v", pr.Number, pr.Head.Ref, g.repoOwner, g.repoName, err) return nil diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 4d23060661d9a..bfb22420c1c71 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -138,13 +138,13 @@ func (g *GiteaLocalUploader) CreateRepo(ctx context.Context, repo *base.Reposito if err != nil { return err } - g.gitRepo, err = gitrepo.OpenRepository(ctx, g.repo) + g.gitRepo, err = gitrepo.OpenRepository(g.repo) if err != nil { return err } // detect object format from git repository and update to database - objectFormat, err := g.gitRepo.GetObjectFormat() + objectFormat, err := g.gitRepo.GetObjectFormat(ctx) if err != nil { return err } @@ -297,13 +297,13 @@ func (g *GiteaLocalUploader) CreateReleases(ctx context.Context, releases ...*ba // calc NumCommits if possible if rel.TagName != "" { - commit, err := g.gitRepo.GetTagCommit(rel.TagName) + commit, err := g.gitRepo.GetTagCommit(ctx, rel.TagName) if !git.IsErrNotExist(err) { if err != nil { return fmt.Errorf("GetTagCommit[%v]: %w", rel.TagName, err) } rel.Sha1 = commit.ID.String() - rel.NumCommits, err = commit.CommitsCount() + rel.NumCommits, err = commit.CommitsCount(ctx) if err != nil { return fmt.Errorf("CommitsCount: %w", err) } @@ -625,7 +625,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba remote = "head-pr-" + strconv.FormatInt(pr.Number, 10) } // ... now add the remote - err := g.gitRepo.AddRemote(remote, pr.Head.CloneURL, true) + err := g.gitRepo.AddRemote(ctx, remote, pr.Head.CloneURL, true) if err != nil { log.Error("PR #%d in %s/%s AddRemote[%s] failed: %v", pr.Number, g.repoOwner, g.repoName, remote, err) } else { @@ -644,10 +644,10 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba localRef = git.SanitizeRefPattern(pr.Head.OwnerName + "/" + pr.Head.Ref) // ... Now we must assert that this does not exist - if g.gitRepo.IsBranchExist(localRef) { + if g.gitRepo.IsBranchExist(ctx, localRef) { localRef = "head-pr-" + strconv.FormatInt(pr.Number, 10) + "/" + localRef i := 0 - for g.gitRepo.IsBranchExist(localRef) { + for g.gitRepo.IsBranchExist(ctx, localRef) { if i > 5 { // ... We tried, we really tried but this is just a seriously unfriendly repo return head, nil @@ -674,7 +674,7 @@ func (g *GiteaLocalUploader) updateGitForPullRequest(ctx context.Context, pr *ba // 5. Now if pr.Head.SHA == "" we should recover this to the head of this branch if pr.Head.SHA == "" { - headSha, err := g.gitRepo.GetBranchCommitID(localRef) + headSha, err := g.gitRepo.GetBranchCommitID(ctx, localRef) if err != nil { log.Error("unable to get head SHA of local head for PR #%d from %s in %s/%s. Error: %v", pr.Number, pr.Head.Ref, g.repoOwner, g.repoName, err) return head, nil @@ -734,7 +734,7 @@ func (g *GiteaLocalUploader) newPullRequest(ctx context.Context, pr *base.PullRe if pr.Base.Ref != "" && pr.Head.SHA != "" { // A PR against a tag base does not make sense - therefore pr.Base.Ref must be a branch // TODO: should we be checking for the refs/heads/ prefix on the pr.Base.Ref? (i.e. are these actually branches or refs) - pr.Base.SHA, _, err = g.gitRepo.GetMergeBase("", git.BranchPrefix+pr.Base.Ref, pr.Head.SHA) + pr.Base.SHA, _, err = g.gitRepo.GetMergeBase(ctx, "", git.BranchPrefix+pr.Base.Ref, pr.Head.SHA) if err != nil { log.Error("Cannot determine the merge base for PR #%d in %s/%s. Error: %v", pr.Number, g.repoOwner, g.repoName, err) } @@ -879,7 +879,7 @@ func (g *GiteaLocalUploader) CreateReviews(ctx context.Context, reviews ...*base continue } - headCommitID, err := g.gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := g.gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Warn("PR #%d GetRefCommitID[%s] in %s/%s: %v, all review comments will be ignored", pr.Index, pr.GetGitHeadRefName(), g.repoOwner, g.repoName, err) continue @@ -903,7 +903,7 @@ func (g *GiteaLocalUploader) CreateReviews(ctx context.Context, reviews ...*base _ = writer.Close() }() go func(comment *base.ReviewComment) { - if err := git.GetRepoRawDiffForFile(g.gitRepo, pr.MergeBase, headCommitID, git.RawDiffNormal, comment.TreePath, writer); err != nil { + if err := git.GetRepoRawDiffForFile(ctx, g.gitRepo, pr.MergeBase, headCommitID, git.RawDiffNormal, comment.TreePath, writer); err != nil { // We should ignore the error since the commit maybe removed when force push to the pull request log.Warn("GetRepoRawDiffForFile failed when migrating [%s, %s, %s, %s]: %v", g.gitRepo.Path, pr.MergeBase, headCommitID, comment.TreePath, err) } diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go index 477b68e37e089..cf9fde3af9eb0 100644 --- a/services/migrations/gitea_uploader_test.go +++ b/services/migrations/gitea_uploader_test.go @@ -253,10 +253,10 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) { Author: &signature, Message: "Initial Commit", })) - fromGitRepo, err := gitrepo.OpenRepository(t.Context(), fromRepo) + fromGitRepo, err := gitrepo.OpenRepository(fromRepo) assert.NoError(t, err) defer fromGitRepo.Close() - baseSHA, err := fromGitRepo.GetBranchCommitID(baseRef) + baseSHA, err := fromGitRepo.GetBranchCommitID(t.Context(), baseRef) assert.NoError(t, err) // @@ -274,7 +274,7 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) { Message: "Pull request", })) assert.NoError(t, err) - headSHA, err := fromGitRepo.GetBranchCommitID(headRef) + headSHA, err := fromGitRepo.GetBranchCommitID(t.Context(), headRef) assert.NoError(t, err) fromRepoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: fromRepo.OwnerID}) @@ -296,10 +296,10 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) { Author: &signature, Message: "branch2 commit", })) - forkGitRepo, err := gitrepo.OpenRepository(t.Context(), forkRepo) + forkGitRepo, err := gitrepo.OpenRepository(forkRepo) assert.NoError(t, err) defer forkGitRepo.Close() - forkHeadSHA, err := forkGitRepo.GetBranchCommitID(forkHeadRef) + forkHeadSHA, err := forkGitRepo.GetBranchCommitID(t.Context(), forkHeadRef) assert.NoError(t, err) toRepoName := "migrated" diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index 4b19112d3c794..bba53c07cf828 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -324,7 +324,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*mirrorSyncResult, bo log.Error("SyncMirrors [repo: %-v]: %v", m.Repo, err) } - gitRepo, err := gitrepo.OpenRepository(ctx, m.Repo) + gitRepo, err := gitrepo.OpenRepository(m.Repo) if err != nil { log.Error("SyncMirrors [repo: %-v]: failed to OpenRepository: %v", m.Repo, err) return nil, false @@ -472,7 +472,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { return false } - gitRepo, err := gitrepo.OpenRepository(ctx, m.Repo) + gitRepo, err := gitrepo.OpenRepository(m.Repo) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to OpenRepository: %v", m.Repo, err) return false @@ -495,7 +495,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { // Create reference if result.oldCommitID == gitShortEmptySha { - commitID, err := gitRepo.GetRefCommitID(result.refName.String()) + commitID, err := gitRepo.GetRefCommitID(ctx, result.refName.String()) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to GetRefCommitID [ref_name: %s]: %v", m.Repo, result.refName, err) continue @@ -517,17 +517,17 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { } // Push commits - oldCommitID, err := git.GetFullCommitID(gitRepo.Ctx, gitRepo.Path, result.oldCommitID) + oldCommitID, err := git.GetFullCommitID(ctx, gitRepo.Path, result.oldCommitID) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get GetFullCommitID[%s]: %v", m.Repo, result.oldCommitID, err) continue } - newCommitID, err := git.GetFullCommitID(gitRepo.Ctx, gitRepo.Path, result.newCommitID) + newCommitID, err := git.GetFullCommitID(ctx, gitRepo.Path, result.newCommitID) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get GetFullCommitID [%s]: %v", m.Repo, result.newCommitID, err) continue } - commits, err := gitRepo.CommitsBetweenIDs(newCommitID, oldCommitID) + commits, err := gitRepo.CommitsBetweenIDs(ctx, newCommitID, oldCommitID) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get CommitsBetweenIDs [new_commit_id: %s, old_commit_id: %s]: %v", m.Repo, newCommitID, oldCommitID, err) continue @@ -538,7 +538,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { theCommits.Commits = theCommits.Commits[:setting.UI.FeedMaxCommitNum] } - newCommit, err := gitRepo.GetCommit(newCommitID) + newCommit, err := gitRepo.GetCommit(ctx, newCommitID) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get commit %s: %v", m.Repo, newCommitID, err) continue @@ -555,7 +555,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { } log.Trace("SyncMirrors [repo: %-v]: done notifying updated branches/tags - now updating last commit time", m.Repo) - isEmpty, err := gitRepo.IsEmpty() + isEmpty, err := gitRepo.IsEmpty(ctx) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to check empty git repo: %v", m.Repo, err) return false diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 9a832a13509f0..df78857d647bd 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -138,7 +138,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { if setting.LFS.StartServer { log.Trace("SyncMirrors [repo: %-v]: syncing LFS objects...", m.Repo) - gitRepo, err := gitrepo.OpenRepository(ctx, storageRepo) + gitRepo, err := gitrepo.OpenRepository(storageRepo) if err != nil { log.Error("OpenRepository: %v", err) return errors.New("Unexpected error") diff --git a/services/packages/cargo/index.go b/services/packages/cargo/index.go index ebcaa3e56dc92..cf711bf5c4252 100644 --- a/services/packages/cargo/index.go +++ b/services/packages/cargo/index.go @@ -278,7 +278,7 @@ func alterRepositoryContent(ctx context.Context, doer *user_model.User, repo *re return err } - commit, err := t.GetBranchCommit(repo.DefaultBranch) + commit, err := t.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return err } diff --git a/services/pull/check.go b/services/pull/check.go index 5b28ec9658d58..bf9e3aa0d141a 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -300,7 +300,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com return nil, fmt.Errorf("GetFullCommitID(%s) in %s: %w", prHeadRef, pr.BaseRepo.FullName(), err) } - gitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) if err != nil { return nil, fmt.Errorf("%-v OpenRepository: %w", pr.BaseRepo, err) } @@ -320,7 +320,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com } mergeCommit = strings.TrimSpace(mergeCommit) - commit, err := gitRepo.GetCommit(mergeCommit) + commit, err := gitRepo.GetCommit(ctx, mergeCommit) if err != nil { return nil, fmt.Errorf("GetMergeCommit[%s]: %w", mergeCommit, err) } diff --git a/services/pull/comment.go b/services/pull/comment.go index ca156d3d924fb..7a278265e5c1e 100644 --- a/services/pull/comment.go +++ b/services/pull/comment.go @@ -22,18 +22,18 @@ func getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldC } defer closer.Close() - oldCommit, err := gitRepo.GetCommit(oldCommitID) + oldCommit, err := gitRepo.GetCommit(ctx, oldCommitID) if err != nil { return nil, err } - newCommit, err := gitRepo.GetCommit(newCommitID) + newCommit, err := gitRepo.GetCommit(ctx, newCommitID) if err != nil { return nil, err } // Find commits between new and old commit excluding base branch commits - commits, err := gitRepo.CommitsBetweenNotBase(newCommit, oldCommit, baseBranch) + commits, err := gitRepo.CommitsBetweenNotBase(ctx, newCommit, oldCommit, baseBranch) if err != nil { return nil, err } diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index e7c14a5e7aabf..3479698736e9a 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -105,9 +105,9 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR var sha string if pr.Flow == issues_model.PullRequestFlowGithub { - sha, err = headGitRepo.GetBranchCommitID(pr.HeadBranch) + sha, err = headGitRepo.GetBranchCommitID(ctx, pr.HeadBranch) } else { - sha, err = headGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + sha, err = headGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) } if err != nil { return "", err diff --git a/services/pull/compare.go b/services/pull/compare.go index 2c4b77a77270f..fc64b8e83bfc7 100644 --- a/services/pull/compare.go +++ b/services/pull/compare.go @@ -53,7 +53,7 @@ func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Reposito compareInfo.HeadCommitID = headBranch } - compareInfo.MergeBase, remoteBranch, err = headGitRepo.GetMergeBase(tmpRemote, baseBranch, headBranch) + compareInfo.MergeBase, remoteBranch, err = headGitRepo.GetMergeBase(ctx, tmpRemote, baseBranch, headBranch) if err == nil { compareInfo.BaseCommitID, err = git.GetFullCommitID(ctx, headGitRepo.Path, remoteBranch) if err != nil { @@ -87,7 +87,7 @@ func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Reposito // Count number of changed files. // This probably should be removed as we need to use shortstat elsewhere // Now there is git diff --shortstat but this appears to be slower than simply iterating with --nameonly - compareInfo.NumFiles, err = headGitRepo.GetDiffNumChangedFiles(remoteBranch, headBranch, directComparison) + compareInfo.NumFiles, err = headGitRepo.GetDiffNumChangedFiles(ctx, remoteBranch, headBranch, directComparison) if err != nil { return nil, err } diff --git a/services/pull/merge.go b/services/pull/merge.go index f1ad8fa17d9cc..e95a7b290712c 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -68,11 +68,11 @@ func getMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issue if mergeStyle != "" { templateFilepath := fmt.Sprintf(".gitea/default_merge_message/%s_TEMPLATE.md", strings.ToUpper(string(mergeStyle))) - commit, err := baseGitRepo.GetBranchCommit(pr.BaseRepo.DefaultBranch) + commit, err := baseGitRepo.GetBranchCommit(ctx, pr.BaseRepo.DefaultBranch) if err != nil { return "", "", err } - templateContent, err := commit.GetFileContent(templateFilepath, setting.Repository.PullRequest.DefaultMergeMessageSize) + templateContent, err := commit.GetFileContent(ctx, templateFilepath, setting.Repository.PullRequest.DefaultMergeMessageSize) if err != nil { if !git.IsErrNotExist(err) { return "", "", err @@ -633,7 +633,7 @@ func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *use return errors.New("Wrong commit ID") } - commit, err := baseGitRepo.GetCommit(commitID) + commit, err := baseGitRepo.GetCommit(ctx, commitID) if err != nil { if git.IsErrNotExist(err) { return errors.New("Wrong commit ID") @@ -642,7 +642,7 @@ func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *use } commitID = commit.ID.String() - ok, err := baseGitRepo.IsCommitInBranch(commitID, pr.BaseBranch) + ok, err := baseGitRepo.IsCommitInBranch(ctx, commitID, pr.BaseBranch) if err != nil { return err } @@ -663,7 +663,7 @@ func MergedManually(ctx context.Context, pr *issues_model.PullRequest, doer *use return err } - notify_service.MergePullRequest(baseGitRepo.Ctx, doer, pr) + notify_service.MergePullRequest(ctx, doer, pr) log.Info("manuallyMerged[%d]: Marked as manually merged into %s/%s by commit id: %s", pr.ID, pr.BaseRepo.Name, pr.BaseBranch, commitID) return handleCloseCrossReferences(ctx, pr, doer) diff --git a/services/pull/merge_rebase.go b/services/pull/merge_rebase.go index 0fa4fd00f6e57..809675b7020cf 100644 --- a/services/pull/merge_rebase.go +++ b/services/pull/merge_rebase.go @@ -59,7 +59,7 @@ func doMergeRebaseFastForward(ctx *mergeContext) error { } // Original repo to read template from. - baseGitRepo, err := gitrepo.OpenRepository(ctx, ctx.pr.BaseRepo) + baseGitRepo, err := gitrepo.OpenRepository(ctx.pr.BaseRepo) if err != nil { log.Error("Unable to get Git repo for rebase: %v", err) return err diff --git a/services/pull/merge_squash.go b/services/pull/merge_squash.go index 84bd67c44503b..b1adbe5664dbc 100644 --- a/services/pull/merge_squash.go +++ b/services/pull/merge_squash.go @@ -25,14 +25,14 @@ func getAuthorSignatureSquash(ctx *mergeContext) (*git.Signature, error) { // Try to get an signature from the same user in one of the commits, as the // poster email might be private or commits might have a different signature // than the primary email address of the poster. - gitRepo, err := git.OpenRepository(ctx, ctx.tmpBasePath) + gitRepo, err := git.OpenRepository(ctx.tmpBasePath) if err != nil { log.Error("%-v Unable to open base repository: %v", ctx.pr, err) return nil, err } defer gitRepo.Close() - commits, err := gitRepo.CommitsBetweenIDs(trackingBranch, "HEAD") + commits, err := gitRepo.CommitsBetweenIDs(ctx, trackingBranch, "HEAD") if err != nil { log.Error("%-v Unable to get commits between: %s %s: %v", ctx.pr, "HEAD", trackingBranch, err) return nil, err diff --git a/services/pull/patch.go b/services/pull/patch.go index d82fe3e2251cd..733f4af4d8333 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -44,11 +44,11 @@ func DownloadDiffOrPatch(ctx context.Context, pr *issues_model.PullRequest, w io compareArg := pr.MergeBase + "..." + pr.GetGitHeadRefName() switch { case patch: - err = gitRepo.GetPatch(compareArg, w) + err = gitRepo.GetPatch(ctx, compareArg, w) case binary: - err = gitRepo.GetDiffBinary(compareArg, w) + err = gitRepo.GetDiffBinary(ctx, compareArg, w) default: - err = gitRepo.GetDiff(compareArg, w) + err = gitRepo.GetDiff(ctx, compareArg, w) } if err != nil { @@ -84,7 +84,7 @@ func testPullRequestBranchMergeable(pr *issues_model.PullRequest) error { } func testPullRequestTmpRepoBranchMergeable(ctx context.Context, prCtx *prTmpRepoContext, pr *issues_model.PullRequest) error { - gitRepo, err := git.OpenRepository(ctx, prCtx.tmpBasePath) + gitRepo, err := git.OpenRepository(prCtx.tmpBasePath) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -94,13 +94,13 @@ func testPullRequestTmpRepoBranchMergeable(ctx context.Context, prCtx *prTmpRepo pr.MergeBase, _, err = gitcmd.NewCommand("merge-base", "--", "base", "tracking").WithDir(prCtx.tmpBasePath).RunStdString(ctx) if err != nil { var err2 error - pr.MergeBase, err2 = gitRepo.GetRefCommitID(git.BranchPrefix + "base") + pr.MergeBase, err2 = gitRepo.GetRefCommitID(ctx, git.BranchPrefix+"base") if err2 != nil { return fmt.Errorf("GetMergeBase: %v and can't find commit ID for base: %w", err, err2) } } pr.MergeBase = strings.TrimSpace(pr.MergeBase) - if pr.HeadCommitID, err = gitRepo.GetRefCommitID(git.BranchPrefix + "tracking"); err != nil { + if pr.HeadCommitID, err = gitRepo.GetRefCommitID(ctx, git.BranchPrefix+"tracking"); err != nil { return fmt.Errorf("GetBranchCommitID: can't find commit ID for head: %w", err) } @@ -297,10 +297,10 @@ func AttemptThreeWayMerge(ctx context.Context, gitPath string, gitRepo *git.Repo } // Add and remove files in one command, as this is slow with many files otherwise - if err := gitRepo.RemoveFilesFromIndex(filesToRemove...); err != nil { + if err := gitRepo.RemoveFilesFromIndex(ctx, filesToRemove...); err != nil { return false, nil, err } - if err := gitRepo.AddObjectsToIndex(filesToAdd...); err != nil { + if err := gitRepo.AddObjectsToIndex(ctx, filesToAdd...); err != nil { return false, nil, err } @@ -329,7 +329,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * return false, fmt.Errorf("unable to write unconflicted tree: %w\n`git ls-files -u`:\n%s", err, lsfiles) } treeHash = strings.TrimSpace(treeHash) - baseTree, err := gitRepo.GetTree("base") + baseTree, err := gitRepo.GetTree(ctx, "base") if err != nil { return false, err } @@ -361,7 +361,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * } defer cleanup() - if err := gitRepo.GetDiffBinary(pr.MergeBase+"...tracking", tmpPatchFile); err != nil { + if err := gitRepo.GetDiffBinary(ctx, pr.MergeBase+"...tracking", tmpPatchFile); err != nil { log.Error("Unable to get patch file from %s to %s in %s Error: %v", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) return false, fmt.Errorf("unable to get patch file from %s to %s in %s Error: %w", pr.MergeBase, pr.HeadBranch, pr.BaseRepo.FullName(), err) } @@ -489,7 +489,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * return nil }). - Run(gitRepo.Ctx) + Run(ctx) // 9. Check if the found conflictedfiles is non-zero, "err" could be non-nil, so we should ignore it if we found conflicts. // Note: `"err" could be non-nil` is due that if enable 3-way merge, it doesn't return any error on found conflicts. @@ -530,11 +530,11 @@ func (err ErrFilePathProtected) Unwrap() error { } // CheckFileProtection check file Protection -func CheckFileProtection(repo *git.Repository, branchName, oldCommitID, newCommitID string, patterns []glob.Glob, limit int, env []string) ([]string, error) { +func CheckFileProtection(ctx context.Context, repo *git.Repository, branchName, oldCommitID, newCommitID string, patterns []glob.Glob, limit int, env []string) ([]string, error) { if len(patterns) == 0 { return nil, nil } - affectedFiles, err := git.GetAffectedFiles(repo, branchName, oldCommitID, newCommitID, env) + affectedFiles, err := git.GetAffectedFiles(ctx, repo, branchName, oldCommitID, newCommitID, env) if err != nil { return nil, err } @@ -560,11 +560,11 @@ func CheckFileProtection(repo *git.Repository, branchName, oldCommitID, newCommi } // CheckUnprotectedFiles check if the commit only touches unprotected files -func CheckUnprotectedFiles(repo *git.Repository, branchName, oldCommitID, newCommitID string, patterns []glob.Glob, env []string) (bool, error) { +func CheckUnprotectedFiles(ctx context.Context, repo *git.Repository, branchName, oldCommitID, newCommitID string, patterns []glob.Glob, env []string) (bool, error) { if len(patterns) == 0 { return false, nil } - affectedFiles, err := git.GetAffectedFiles(repo, branchName, oldCommitID, newCommitID, env) + affectedFiles, err := git.GetAffectedFiles(ctx, repo, branchName, oldCommitID, newCommitID, env) if err != nil { return false, err } @@ -601,7 +601,7 @@ func checkPullFilesProtection(ctx context.Context, pr *issues_model.PullRequest, return nil } - pr.ChangedProtectedFiles, err = CheckFileProtection(gitRepo, pr.HeadBranch, pr.MergeBase, "tracking", pb.GetProtectedFilePatterns(), 10, os.Environ()) + pr.ChangedProtectedFiles, err = CheckFileProtection(ctx, gitRepo, pr.HeadBranch, pr.MergeBase, "tracking", pb.GetProtectedFilePatterns(), 10, os.Environ()) if err != nil && !IsErrFilePathProtected(err) { return err } diff --git a/services/pull/pull.go b/services/pull/pull.go index 619347055b7d3..74754d50677f1 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -344,7 +344,7 @@ func checkForInvalidation(ctx context.Context, requests issues_model.PullRequest if err != nil { return fmt.Errorf("GetRepositoryByIDCtx: %w", err) } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return fmt.Errorf("gitrepo.OpenRepository: %w", err) } @@ -497,14 +497,14 @@ func checkIfPRContentChanged(ctx context.Context, pr *issues_model.PullRequest, } defer cancel() - tmpRepo, err := git.OpenRepository(ctx, prCtx.tmpBasePath) + tmpRepo, err := git.OpenRepository(prCtx.tmpBasePath) if err != nil { return false, fmt.Errorf("OpenRepository: %w", err) } defer tmpRepo.Close() // Find the merge-base - _, base, err := tmpRepo.GetMergeBase("", "base", "tracking") + _, base, err := tmpRepo.GetMergeBase(ctx, "", "base", "tracking") if err != nil { return false, fmt.Errorf("GetMergeBase: %w", err) } @@ -797,21 +797,21 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ var headCommit *git.Commit if pr.Flow == issues_model.PullRequestFlowGithub { - headCommit, err = gitRepo.GetBranchCommit(pr.HeadBranch) + headCommit, err = gitRepo.GetBranchCommit(ctx, pr.HeadBranch) } else { - pr.HeadCommitID, err = gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + pr.HeadCommitID, err = gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { log.Error("Unable to get head commit: %s Error: %v", pr.GetGitHeadRefName(), err) return "" } - headCommit, err = gitRepo.GetCommit(pr.HeadCommitID) + headCommit, err = gitRepo.GetCommit(ctx, pr.HeadCommitID) } if err != nil { log.Error("Unable to get head commit: %s Error: %v", pr.HeadBranch, err) return "" } - mergeBase, err := gitRepo.GetCommit(pr.MergeBase) + mergeBase, err := gitRepo.GetCommit(ctx, pr.MergeBase) if err != nil { log.Error("Unable to get merge base commit: %s Error: %v", pr.MergeBase, err) return "" @@ -819,7 +819,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ limit := setting.Repository.PullRequest.DefaultMergeMessageCommitsLimit - commits, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, 0) + commits, err := gitRepo.CommitsBetweenLimit(ctx, headCommit, mergeBase, limit, 0) if err != nil { log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) return "" @@ -889,7 +889,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ skip := limit limit = 30 for { - commits, err := gitRepo.CommitsBetweenLimit(headCommit, mergeBase, limit, skip) + commits, err := gitRepo.CommitsBetweenLimit(ctx, headCommit, mergeBase, limit, skip) if err != nil { log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) return "" @@ -955,7 +955,7 @@ func GetIssuesAllCommitStatus(ctx context.Context, issues issues_model.IssueList } gitRepo, ok := gitRepos[issue.RepoID] if !ok { - gitRepo, err = gitrepo.OpenRepository(ctx, issue.Repo) + gitRepo, err = gitrepo.OpenRepository(issue.Repo) if err != nil { log.Error("Cannot open git repository %-v for issue #%d[%d]. Error: %v", issue.Repo, issue.Index, issue.ID, err) continue @@ -976,7 +976,7 @@ func GetIssuesAllCommitStatus(ctx context.Context, issues issues_model.IssueList // getAllCommitStatus get pr's commit statuses. func getAllCommitStatus(ctx context.Context, gitRepo *git.Repository, pr *issues_model.PullRequest) (statuses []*git_model.CommitStatus, lastStatus *git_model.CommitStatus, err error) { - sha, shaErr := gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + sha, shaErr := gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if shaErr != nil { return nil, nil, shaErr } @@ -998,7 +998,7 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br } defer closer.Close() - baseCommit, err := baseGitRepo.GetBranchCommit(branchName) + baseCommit, err := baseGitRepo.GetBranchCommit(ctx, branchName) if err != nil { return false, err } @@ -1021,20 +1021,20 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br var headCommit *git.Commit if pr.Flow == issues_model.PullRequestFlowGithub { - headCommit, err = headGitRepo.GetBranchCommit(pr.HeadBranch) + headCommit, err = headGitRepo.GetBranchCommit(ctx, pr.HeadBranch) if err != nil { return false, err } } else { - pr.HeadCommitID, err = baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + pr.HeadCommitID, err = baseGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return false, err } - if headCommit, err = baseGitRepo.GetCommit(pr.HeadCommitID); err != nil { + if headCommit, err = baseGitRepo.GetCommit(ctx, pr.HeadCommitID); err != nil { return false, err } } - return baseCommit.HasPreviousCommit(headCommit.ID) + return baseCommit.HasPreviousCommit(ctx, headCommit.ID) } type CommitInfo struct { diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go index 1c03ab45ae29e..30291292c4ad0 100644 --- a/services/pull/pull_test.go +++ b/services/pull/pull_test.go @@ -40,7 +40,7 @@ func TestPullRequest_GetDefaultMergeMessage_InternalTracker(t *testing.T) { pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) assert.NoError(t, pr.LoadBaseRepo(t.Context())) - gitRepo, err := gitrepo.OpenRepository(t.Context(), pr.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) assert.NoError(t, err) defer gitRepo.Close() @@ -70,7 +70,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) { pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2, BaseRepo: baseRepo}) assert.NoError(t, pr.LoadBaseRepo(t.Context())) - gitRepo, err := gitrepo.OpenRepository(t.Context(), pr.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/pull/review.go b/services/pull/review.go index 357a816593da0..2e676cc422607 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -58,7 +58,7 @@ func lineBlame(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Re } objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) - return gitRepo.GetCommit(sha[:objectFormat.FullLength()]) + return gitRepo.GetCommit(ctx, sha[:objectFormat.FullLength()]) } // checkInvalidation checks if the line of code comment got changed by another commit. @@ -258,7 +258,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo // Only fetch diff if comment is review comment if len(patch) == 0 && reviewID != 0 { - headCommitID, err := gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return nil, fmt.Errorf("GetRefCommitID[%s]: %w", pr.GetGitHeadRefName(), err) } @@ -271,7 +271,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo _ = writer.Close() }() go func() { - if err := git.GetRepoRawDiffForFile(gitRepo, pr.MergeBase, headCommitID, git.RawDiffNormal, treePath, writer); err != nil { + if err := git.GetRepoRawDiffForFile(ctx, gitRepo, pr.MergeBase, headCommitID, git.RawDiffNormal, treePath, writer); err != nil { _ = writer.CloseWithError(fmt.Errorf("GetRawDiffForLine[%s, %s, %s, %s]: %w", gitRepo.Path, pr.MergeBase, headCommitID, treePath, err)) return } @@ -315,7 +315,7 @@ func SubmitReview(ctx context.Context, doer *user_model.User, gitRepo *git.Repos return nil, nil, ErrSubmitReviewOnClosedPR } - headCommitID, err := gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headCommitID, err := gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return nil, nil, err } diff --git a/services/release/release.go b/services/release/release.go index 28061ae8b180c..b91501fa448f8 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -101,13 +101,13 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel } } - commit, err := gitRepo.GetCommit(rel.Target) + commit, err := gitRepo.GetCommit(ctx, rel.Target) if err != nil { return false, err } if len(msg) > 0 { - if err = gitRepo.CreateAnnotatedTag(rel.TagName, msg, commit.ID.String()); err != nil { + if err = gitRepo.CreateAnnotatedTag(ctx, rel.TagName, msg, commit.ID.String()); err != nil { if strings.Contains(err.Error(), "is not a valid tag name") { return false, ErrInvalidTagName{ TagName: rel.TagName, @@ -115,7 +115,7 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel } return false, err } - } else if err = gitRepo.CreateTag(rel.TagName, commit.ID.String()); err != nil { + } else if err = gitRepo.CreateTag(ctx, rel.TagName, commit.ID.String()); err != nil { if strings.Contains(err.Error(), "is not a valid tag name") { return false, ErrInvalidTagName{ TagName: rel.TagName, @@ -142,13 +142,13 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel notify_service.CreateRef(ctx, rel.Publisher, rel.Repo, refFullName, commit.ID.String()) rel.CreatedUnix = timeutil.TimeStampNow() } - commit, err := gitRepo.GetTagCommit(rel.TagName) + commit, err := gitRepo.GetTagCommit(ctx, rel.TagName) if err != nil { return false, fmt.Errorf("GetTagCommit: %w", err) } rel.Sha1 = commit.ID.String() - rel.NumCommits, err = commit.CommitsCount() + rel.NumCommits, err = commit.CommitsCount(ctx) if err != nil { return false, fmt.Errorf("CommitsCount: %w", err) } @@ -166,8 +166,8 @@ func createTag(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Rel } // CreateRelease creates a new release of repository. -func CreateRelease(gitRepo *git.Repository, rel *repo_model.Release, attachmentUUIDs []string, msg string) error { - has, err := repo_model.IsReleaseExist(gitRepo.Ctx, rel.RepoID, rel.TagName) +func CreateRelease(ctx context.Context, gitRepo *git.Repository, rel *repo_model.Release, attachmentUUIDs []string, msg string) error { + has, err := repo_model.IsReleaseExist(ctx, rel.RepoID, rel.TagName) if err != nil { return err } else if has { @@ -176,22 +176,22 @@ func CreateRelease(gitRepo *git.Repository, rel *repo_model.Release, attachmentU } } - if _, err = createTag(gitRepo.Ctx, gitRepo, rel, msg); err != nil { + if _, err = createTag(ctx, gitRepo, rel, msg); err != nil { return err } rel.Title = util.EllipsisDisplayString(rel.Title, 255) rel.LowerTagName = strings.ToLower(rel.TagName) - if err = db.Insert(gitRepo.Ctx, rel); err != nil { + if err = db.Insert(ctx, rel); err != nil { return err } - if err = repo_model.AddReleaseAttachments(gitRepo.Ctx, rel.ID, attachmentUUIDs); err != nil { + if err = repo_model.AddReleaseAttachments(ctx, rel.ID, attachmentUUIDs); err != nil { return err } if !rel.IsDraft { - notify_service.NewRelease(gitRepo.Ctx, rel) + notify_service.NewRelease(ctx, rel) } return nil @@ -262,7 +262,7 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo if rel.ID == 0 { return errors.New("UpdateRelease only accepts an exist release") } - isTagCreated, err := createTag(gitRepo.Ctx, gitRepo, rel, "") + isTagCreated, err := createTag(ctx, gitRepo, rel, "") if err != nil { return err } @@ -346,10 +346,10 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo if !rel.IsDraft { if !isTagCreated && !isConvertedFromTag { - notify_service.UpdateRelease(gitRepo.Ctx, doer, rel) + notify_service.UpdateRelease(ctx, doer, rel) return nil } - notify_service.NewRelease(gitRepo.Ctx, rel) + notify_service.NewRelease(ctx, rel) } return nil } diff --git a/services/release/release_test.go b/services/release/release_test.go index ef495632a757c..1a24357baac25 100644 --- a/services/release/release_test.go +++ b/services/release/release_test.go @@ -29,11 +29,11 @@ func TestRelease_Create(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -47,7 +47,7 @@ func TestRelease_Create(t *testing.T) { IsTag: false, }, nil, "")) - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -61,7 +61,7 @@ func TestRelease_Create(t *testing.T) { IsTag: false, }, nil, "")) - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -75,7 +75,7 @@ func TestRelease_Create(t *testing.T) { IsTag: false, }, nil, "")) - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -89,7 +89,7 @@ func TestRelease_Create(t *testing.T) { IsTag: false, }, nil, "")) - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -125,7 +125,7 @@ func TestRelease_Create(t *testing.T) { IsPrerelease: false, IsTag: true, } - assert.NoError(t, CreateRelease(gitRepo, &release, []string{attach.UUID}, "test")) + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &release, []string{attach.UUID}, "test")) } func TestRelease_Update(t *testing.T) { @@ -134,12 +134,12 @@ func TestRelease_Update(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() // Test a changed release - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -163,7 +163,7 @@ func TestRelease_Update(t *testing.T) { assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) // Test a changed draft - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -187,7 +187,7 @@ func TestRelease_Update(t *testing.T) { assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) // Test a changed pre-release - assert.NoError(t, CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, @@ -225,7 +225,7 @@ func TestRelease_Update(t *testing.T) { IsPrerelease: false, IsTag: false, } - assert.NoError(t, CreateRelease(gitRepo, release, nil, "")) + assert.NoError(t, CreateRelease(t.Context(), gitRepo, release, nil, "")) assert.Positive(t, release.ID) release.IsDraft = false @@ -276,7 +276,7 @@ func TestRelease_createTag(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/repository/adopt.go b/services/repository/adopt.go index 8d8e59b0531af..be9a1c491be4a 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -142,7 +142,7 @@ func adoptRepository(ctx context.Context, repo *repo_model.Repository, defaultBr } // Don't bother looking this repo in the context it won't be there - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return fmt.Errorf("openRepository: %w", err) } diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go index b2ca74871ca2a..22c87b5b9fb63 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -74,7 +74,7 @@ func (e RepoRefNotFoundError) Is(err error) bool { // NewRequest creates an archival request, based on the URI. The // resulting ArchiveRequest is suitable for being passed to Await() // if it's determined that the request still needs to be satisfied. -func NewRequest(repo *repo_model.Repository, gitRepo *git.Repository, archiveRefExt string) (*ArchiveRequest, error) { +func NewRequest(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, archiveRefExt string) (*ArchiveRequest, error) { // here the archiveRefShortName is not a clear ref, it could be a tag, branch or commit id archiveRefShortName, archiveType := repo_model.SplitArchiveNameType(archiveRefExt) if archiveType == repo_model.ArchiveUnknown { @@ -82,7 +82,7 @@ func NewRequest(repo *repo_model.Repository, gitRepo *git.Repository, archiveRef } // Get corresponding commit. - commitID, err := gitRepo.ConvertToGitID(archiveRefShortName) + commitID, err := gitRepo.ConvertToGitID(ctx, archiveRefShortName) if err != nil { return nil, RepoRefNotFoundError{RefShortName: archiveRefShortName} } diff --git a/services/repository/archiver/archiver_test.go b/services/repository/archiver/archiver_test.go index ae5232f5a1ff7..0791ac632d70c 100644 --- a/services/repository/archiver/archiver_test.go +++ b/services/repository/archiver/archiver_test.go @@ -29,47 +29,47 @@ func TestArchive_Basic(t *testing.T) { contexttest.LoadGitRepo(t, ctx) defer ctx.Repo.GitRepo.Close() - bogusReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") + bogusReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") assert.NoError(t, err) assert.NotNil(t, bogusReq) assert.Equal(t, firstCommit+".zip", bogusReq.GetArchiveName()) // Check a series of bogus requests. // Step 1, valid commit with a bad extension. - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".unknown") + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".unknown") assert.Error(t, err) assert.Nil(t, bogusReq) // Step 2, missing commit. - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "dbffff.zip") + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "dbffff.zip") assert.Error(t, err) assert.Nil(t, bogusReq) // Step 3, doesn't look like branch/tag/commit. - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "db.zip") + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "db.zip") assert.Error(t, err) assert.Nil(t, bogusReq) - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "master.zip") + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "master.zip") assert.NoError(t, err) assert.NotNil(t, bogusReq) assert.Equal(t, "master.zip", bogusReq.GetArchiveName()) - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "test/archive.zip") + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "test/archive.zip") assert.NoError(t, err) assert.NotNil(t, bogusReq) assert.Equal(t, "test-archive.zip", bogusReq.GetArchiveName()) // Now two valid requests, firstCommit with valid extensions. - zipReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") + zipReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") assert.NoError(t, err) assert.NotNil(t, zipReq) - tgzReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz") + tgzReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz") assert.NoError(t, err) assert.NotNil(t, tgzReq) - secondReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".bundle") + secondReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".bundle") assert.NoError(t, err) assert.NotNil(t, secondReq) @@ -89,7 +89,7 @@ func TestArchive_Basic(t *testing.T) { // Sleep two seconds to make sure the queue doesn't change. time.Sleep(2 * time.Second) - zipReq2, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") + zipReq2, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") assert.NoError(t, err) // This zipReq should match what's sitting in the queue, as we haven't // let it release yet. From the consumer's point of view, this looks like @@ -104,12 +104,12 @@ func TestArchive_Basic(t *testing.T) { // Now we'll submit a request and TimedWaitForCompletion twice, before and // after we release it. We should trigger both the timeout and non-timeout // cases. - timedReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".tar.gz") + timedReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".tar.gz") assert.NoError(t, err) assert.NotNil(t, timedReq) doArchive(t.Context(), timedReq) - zipReq2, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") + zipReq2, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip") assert.NoError(t, err) // Now, we're guaranteed to have released the original zipReq from the queue. // Ensure that we don't get handed back the released entry somehow, but they diff --git a/services/repository/branch.go b/services/repository/branch.go index 5d8178375e033..719ece8a10e37 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -225,14 +225,14 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g if pr.HasMerged { baseGitRepo, ok := repoIDToGitRepo[pr.BaseRepoID] if !ok { - baseGitRepo, err = gitrepo.OpenRepository(ctx, pr.BaseRepo) + baseGitRepo, err = gitrepo.OpenRepository(pr.BaseRepo) if err != nil { return nil, fmt.Errorf("OpenRepository: %v", err) } defer baseGitRepo.Close() repoIDToGitRepo[pr.BaseRepoID] = baseGitRepo } - pullCommit, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + pullCommit, err := baseGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil && !git.IsErrNotExist(err) { return nil, fmt.Errorf("GetBranchCommitID: %v", err) } @@ -289,7 +289,7 @@ func checkBranchName(ctx context.Context, repo *repo_model.Repository, name stri // It will check whether the branches of the repository have never been synced before. // If so, it will sync all branches of the repository. // Otherwise, it will sync the branches that need to be updated. -func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames, commitIDs []string, getCommit func(commitID string) (*git.Commit, error)) error { +func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames, commitIDs []string, getCommit func(ctx context.Context, commitID string) (*git.Commit, error)) error { // Some designs that make the code look strange but are made for performance optimization purposes: // 1. Sync branches in a batch to reduce the number of DB queries. // 2. Lazy load commit information since it may be not necessary. @@ -343,7 +343,7 @@ func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames, continue } - commit, err := getCommit(commitID) + commit, err := getCommit(ctx, commitID) if err != nil { return fmt.Errorf("get commit of %s failed: %v", branchName, err) } @@ -473,7 +473,7 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m return "", err } refNameTo := git.RefNameFromBranch(to) - refID, err := gitRepo.GetRefCommitID(refNameTo.String()) + refID, err := gitRepo.GetRefCommitID(ctx, refNameTo.String()) if err != nil { return "", err } @@ -531,7 +531,7 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R // database branch record not exist or it's a deleted branch notExist := git_model.IsErrBranchNotExist(err) || rawBranch.IsDeleted - branchCommit, err := gitRepo.GetBranchCommit(branchName) + branchCommit, err := gitRepo.GetBranchCommit(ctx, branchName) if err != nil && !errors.Is(err, util.ErrNotExist) { return err } @@ -728,7 +728,7 @@ func GetBranchDivergingInfo(ctx reqctx.RequestContext, baseRepo *repo_model.Repo if err != nil { return nil, err } - headCommit, err := headGitRepo.GetCommit(headGitBranch.CommitID) + headCommit, err := headGitRepo.GetCommit(ctx, headGitBranch.CommitID) if err != nil { return nil, err } @@ -736,7 +736,7 @@ func GetBranchDivergingInfo(ctx reqctx.RequestContext, baseRepo *repo_model.Repo if err != nil { return nil, err } - hasPreviousCommit, _ := headCommit.HasPreviousCommit(baseCommitID) + hasPreviousCommit, _ := headCommit.HasPreviousCommit(ctx, baseCommitID) info.BaseHasNewCommits = !hasPreviousCommit return info, nil } diff --git a/services/repository/cache.go b/services/repository/cache.go index b0811a99fc03b..646f19a93efcd 100644 --- a/services/repository/cache.go +++ b/services/repository/cache.go @@ -13,13 +13,13 @@ import ( // CacheRef cachhe last commit information of the branch or the tag func CacheRef(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, fullRefName git.RefName) error { - commit, err := gitRepo.GetCommit(fullRefName.String()) + commit, err := gitRepo.GetCommit(ctx, fullRefName.String()) if err != nil { return err } if gitRepo.LastCommitCache == nil { - commitsCount, err := cache.GetInt64(repo.GetCommitsCountCacheKey(fullRefName.ShortName(), true), commit.CommitsCount) + commitsCount, err := cache.GetInt64(ctx, repo.GetCommitsCountCacheKey(fullRefName.ShortName(), true), commit.CommitsCount) if err != nil { return err } diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go index a1534223c3b9d..2f6e9d0a379b6 100644 --- a/services/repository/commitstatus/commitstatus.go +++ b/services/repository/commitstatus/commitstatus.go @@ -78,7 +78,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) - commit, err := gitRepo.GetCommit(sha) + commit, err := gitRepo.GetCommit(ctx, sha) if err != nil { return fmt.Errorf("GetCommit[%s]: %w", sha, err) } @@ -104,7 +104,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato notify.CreateCommitStatus(ctx, repo, repo_module.CommitToPushCommit(commit), creator, status) - defaultBranchCommit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + defaultBranchCommit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return fmt.Errorf("GetBranchCommit[%s]: %w", repo.DefaultBranch, err) } diff --git a/services/repository/contributors_graph.go b/services/repository/contributors_graph.go index 2c5c7c604fe80..acf91bd267481 100644 --- a/services/repository/contributors_graph.go +++ b/services/repository/contributors_graph.go @@ -112,8 +112,8 @@ func GetContributorStats(ctx context.Context, cache cache.StringCache, repo *rep } // getExtendedCommitStats return the list of *ExtendedCommitStats for the given revision -func getExtendedCommitStats(repo *git.Repository, revision string /*, limit int */) ([]*ExtendedCommitStats, error) { - baseCommit, err := repo.GetCommit(revision) +func getExtendedCommitStats(ctx context.Context, repo *git.Repository, revision string /*, limit int */) ([]*ExtendedCommitStats, error) { + baseCommit, err := repo.GetCommit(ctx, revision) if err != nil { return nil, err } @@ -191,7 +191,7 @@ func getExtendedCommitStats(repo *git.Repository, revision string /*, limit int _ = stdoutReader.Close() return nil }). - Run(repo.Ctx) + Run(ctx) if err != nil { return nil, fmt.Errorf("Failed to get ContributorsCommitStats for repository.\nError: %w\nStderr: %s", err, stderr) } @@ -212,7 +212,7 @@ func generateContributorStats(genDone chan struct{}, cache cache.StringCache, ca if len(revision) == 0 { revision = repo.DefaultBranch } - extendedCommitStats, err := getExtendedCommitStats(gitRepo, revision) + extendedCommitStats, err := getExtendedCommitStats(ctx, gitRepo, revision) if err != nil { _ = cache.PutJSON(cacheKey, fmt.Errorf("ExtendedCommitStats: %w", err), contributorStatsCacheTimeout) return diff --git a/services/repository/files/cherry_pick.go b/services/repository/files/cherry_pick.go index e3b6f678f8707..785efce0bcc51 100644 --- a/services/repository/files/cherry_pick.go +++ b/services/repository/files/cherry_pick.go @@ -56,7 +56,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod } // Get the commit of the original branch - commit, err := t.GetBranchCommit(opts.OldBranch) + commit, err := t.GetBranchCommit(ctx, opts.OldBranch) if err != nil { return nil, err // Couldn't get a commit for the branch } @@ -65,7 +65,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod if opts.LastCommitID == "" { opts.LastCommitID = commit.ID.String() } else { - lastCommitID, err := t.gitRepo.ConvertToGitID(opts.LastCommitID) + lastCommitID, err := t.gitRepo.ConvertToGitID(ctx, opts.LastCommitID) if err != nil { return nil, fmt.Errorf("CherryPick: Invalid last commit ID: %w", err) } @@ -78,7 +78,7 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod } } - commit, err = t.GetCommit(strings.TrimSpace(opts.Content)) + commit, err = t.GetCommit(ctx, strings.TrimSpace(opts.Content)) if err != nil { return nil, err } @@ -135,12 +135,12 @@ func CherryPick(ctx context.Context, repo *repo_model.Repository, doer *user_mod return nil, err } - commit, err = t.GetCommit(commitHash) + commit, err = t.GetCommit(ctx, commitHash) if err != nil { return nil, err } - fileCommitResponse, _ := GetFileCommitResponse(repo, commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, commit) // ok if fails, then will be nil verification := GetPayloadCommitVerification(ctx, commit) fileResponse := &structs.FileResponse{ Commit: fileCommitResponse, diff --git a/services/repository/files/content.go b/services/repository/files/content.go index 2c1e88bb59ecb..9adec4c889cef 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -46,7 +46,7 @@ type GetContentsOrListOptions struct { // GetContentsOrList gets the metadata of a file's contents (*ContentsResponse) if treePath not a tree // directory, otherwise a listing of file contents ([]*ContentsResponse). Ref can be a branch, commit or tag func GetContentsOrList(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, refCommit *utils.RefCommit, opts GetContentsOrListOptions) (ret api.ContentsExtResponse, _ error) { - entry, err := prepareGetContentsEntry(refCommit, &opts.TreePath) + entry, err := prepareGetContentsEntry(ctx, refCommit, &opts.TreePath) if repo.IsEmpty && opts.TreePath == "" { return api.ContentsExtResponse{DirContents: make([]*api.ContentsResponse, 0)}, nil } @@ -61,11 +61,11 @@ func GetContentsOrList(ctx context.Context, repo *repo_model.Repository, gitRepo } // list directory contents - gitTree, err := refCommit.Commit.SubTree(opts.TreePath) + gitTree, err := refCommit.Commit.SubTree(ctx, opts.TreePath) if err != nil { return ret, err } - entries, err := gitTree.ListEntries() + entries, err := gitTree.ListEntries(ctx) if err != nil { return ret, err } @@ -99,7 +99,7 @@ func GetObjectTypeFromTreeEntry(entry *git.TreeEntry) ContentType { } } -func prepareGetContentsEntry(refCommit *utils.RefCommit, treePath *string) (*git.TreeEntry, error) { +func prepareGetContentsEntry(ctx context.Context, refCommit *utils.RefCommit, treePath *string) (*git.TreeEntry, error) { // Check that the path given in opts.treePath is valid (not a git path) cleanTreePath := CleanGitTreePath(*treePath) if cleanTreePath == "" && *treePath != "" { @@ -113,19 +113,19 @@ func prepareGetContentsEntry(refCommit *utils.RefCommit, treePath *string) (*git return nil, util.NewNotExistErrorf("no commit found for the ref [ref: %s]", refCommit.RefName) } - return refCommit.Commit.GetTreeEntryByPath(*treePath) + return refCommit.Commit.GetTreeEntryByPath(ctx, *treePath) } // GetFileContents gets the metadata on a file's contents. Ref can be a branch, commit or tag func GetFileContents(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, refCommit *utils.RefCommit, opts GetContentsOrListOptions) (*api.ContentsResponse, error) { - entry, err := prepareGetContentsEntry(refCommit, &opts.TreePath) + entry, err := prepareGetContentsEntry(ctx, refCommit, &opts.TreePath) if err != nil { return nil, err } return getFileContentsByEntryInternal(ctx, repo, gitRepo, refCommit, entry, opts) } -func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Repository, gitRepo *git.Repository, refCommit *utils.RefCommit, entry *git.TreeEntry, opts GetContentsOrListOptions) (*api.ContentsResponse, error) { +func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, refCommit *utils.RefCommit, entry *git.TreeEntry, opts GetContentsOrListOptions) (*api.ContentsResponse, error) { refType := refCommit.RefName.RefType() commit := refCommit.Commit selfURL, err := url.Parse(repo.APIURL() + "/contents/" + util.PathEscapeSegments(opts.TreePath) + "?ref=" + url.QueryEscape(refCommit.InputRef)) @@ -139,7 +139,7 @@ func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Reposito Name: entry.Name(), Path: opts.TreePath, SHA: entry.ID.String(), - Size: entry.Size(), + Size: entry.Size(ctx), URL: &selfURLString, Links: &api.FileLinksResponse{ Self: &selfURLString, @@ -147,12 +147,12 @@ func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Reposito } if opts.IncludeCommitMetadata || opts.IncludeCommitMessage { - err = gitRepo.AddLastCommitCache(repo.GetCommitsCountCacheKey(refCommit.InputRef, refType != git.RefTypeCommit), repo.FullName(), refCommit.CommitID) + err = gitRepo.AddLastCommitCache(ctx, repo.GetCommitsCountCacheKey(refCommit.InputRef, refType != git.RefTypeCommit), repo.FullName(), refCommit.CommitID) if err != nil { return nil, err } - lastCommit, err := refCommit.Commit.GetCommitByPath(opts.TreePath) + lastCommit, err := refCommit.Commit.GetCommitByPath(ctx, opts.TreePath) if err != nil { return nil, err } @@ -178,14 +178,14 @@ func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Reposito contentsResponse.Type = string(ContentTypeRegular) // if it is listing the repo root dir, don't waste system resources on reading content if opts.IncludeSingleFileContent { - blobResponse, err := GetBlobBySHA(repo, gitRepo, entry.ID.String()) + blobResponse, err := GetBlobBySHA(ctx, repo, gitRepo, entry.ID.String()) if err != nil { return nil, err } contentsResponse.Encoding, contentsResponse.Content = blobResponse.Encoding, blobResponse.Content contentsResponse.LfsOid, contentsResponse.LfsSize = blobResponse.LfsOid, blobResponse.LfsSize } else if opts.IncludeLfsMetadata { - contentsResponse.LfsOid, contentsResponse.LfsSize, err = parsePossibleLfsPointerBlob(gitRepo, entry.ID.String()) + contentsResponse.LfsOid, contentsResponse.LfsSize, err = parsePossibleLfsPointerBlob(ctx, gitRepo, entry.ID.String()) if err != nil { return nil, err } @@ -195,14 +195,14 @@ func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Reposito } else if entry.IsLink() { contentsResponse.Type = string(ContentTypeLink) // The target of a symlink file is the content of the file - targetFromContent, err := entry.Blob().GetBlobContent(1024) + targetFromContent, err := entry.Blob().GetBlobContent(ctx, 1024) if err != nil { return nil, err } contentsResponse.Target = &targetFromContent } else if entry.IsSubModule() { contentsResponse.Type = string(ContentTypeSubmodule) - submodule, err := commit.GetSubModule(opts.TreePath) + submodule, err := commit.GetSubModule(ctx, opts.TreePath) if err != nil { return nil, err } @@ -240,7 +240,7 @@ func getFileContentsByEntryInternal(_ context.Context, repo *repo_model.Reposito return contentsResponse, nil } -func GetBlobBySHA(repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlobResponse, error) { +func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string) (*api.GitBlobResponse, error) { gitBlob, err := gitRepo.GetBlob(sha) if err != nil { return nil, err @@ -248,10 +248,10 @@ func GetBlobBySHA(repo *repo_model.Repository, gitRepo *git.Repository, sha stri ret := &api.GitBlobResponse{ SHA: gitBlob.ID.String(), URL: repo.APIURL() + "/git/blobs/" + url.PathEscape(gitBlob.ID.String()), - Size: gitBlob.Size(), + Size: gitBlob.Size(ctx), } - blobSize := gitBlob.Size() + blobSize := gitBlob.Size(ctx) if blobSize > setting.API.DefaultMaxBlobSize { return ret, nil } @@ -261,7 +261,7 @@ func GetBlobBySHA(repo *repo_model.Repository, gitRepo *git.Repository, sha stri originContent = &strings.Builder{} } - content, err := gitBlob.GetBlobContentBase64(originContent) + content, err := gitBlob.GetBlobContentBase64(ctx, originContent) if err != nil { return nil, err } @@ -281,15 +281,15 @@ func parsePossibleLfsPointerBuffer(r io.Reader) (*string, *int64) { return nil, nil } -func parsePossibleLfsPointerBlob(gitRepo *git.Repository, sha string) (*string, *int64, error) { +func parsePossibleLfsPointerBlob(ctx context.Context, gitRepo *git.Repository, sha string) (*string, *int64, error) { gitBlob, err := gitRepo.GetBlob(sha) if err != nil { return nil, nil, err } - if gitBlob.Size() > lfs.MetaFileMaxSize { + if gitBlob.Size(ctx) > lfs.MetaFileMaxSize { return nil, nil, nil // not a LFS pointer } - buf, err := gitBlob.GetBlobContent(lfs.MetaFileMaxSize) + buf, err := gitBlob.GetBlobContent(ctx, lfs.MetaFileMaxSize) if err != nil { return nil, nil, err } diff --git a/services/repository/files/content_test.go b/services/repository/files/content_test.go index d72f918074d16..fa82a723d3fec 100644 --- a/services/repository/files/content_test.go +++ b/services/repository/files/content_test.go @@ -35,7 +35,7 @@ func TestGetContents(t *testing.T) { sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d" ctx.SetPathParam("id", "1") ctx.SetPathParam("sha", sha) - gbr, err := GetBlobBySHA(ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("sha")) + gbr, err := GetBlobBySHA(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("sha")) expectedGBR := &api.GitBlobResponse{ Content: util.ToPointer("dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK"), Encoding: util.ToPointer("base64"), diff --git a/services/repository/files/file.go b/services/repository/files/file.go index f48e32b427b24..f1b014f0df938 100644 --- a/services/repository/files/file.go +++ b/services/repository/files/file.go @@ -45,7 +45,7 @@ func GetContentsListFromTreePaths(ctx context.Context, repo *repo_model.Reposito func GetFilesResponseFromCommit(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, refCommit *utils.RefCommit, treeNames []string) (*api.FilesResponse, error) { files := GetContentsListFromTreePaths(ctx, repo, gitRepo, refCommit, treeNames) - fileCommitResponse, _ := GetFileCommitResponse(repo, refCommit.Commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, refCommit.Commit) // ok if fails, then will be nil verification := GetPayloadCommitVerification(ctx, refCommit.Commit) filesResponse := &api.FilesResponse{ Files: files, @@ -70,7 +70,7 @@ func GetFileResponseFromFilesResponse(filesResponse *api.FilesResponse, index in } // GetFileCommitResponse Constructs a FileCommitResponse from a Commit object -func GetFileCommitResponse(repo *repo_model.Repository, commit *git.Commit) (*api.FileCommitResponse, error) { +func GetFileCommitResponse(ctx context.Context, repo *repo_model.Repository, commit *git.Commit) (*api.FileCommitResponse, error) { if repo == nil { return nil, errors.New("repo cannot be nil") } @@ -81,7 +81,7 @@ func GetFileCommitResponse(repo *repo_model.Repository, commit *git.Commit) (*ap commitTreeURL, _ := url.Parse(repo.APIURL() + "/git/trees/" + url.PathEscape(commit.Tree.ID.String())) parents := make([]*api.CommitMeta, commit.ParentCount()) for i := 0; i <= commit.ParentCount(); i++ { - if parent, err := commit.Parent(i); err == nil && parent != nil { + if parent, err := commit.Parent(ctx, i); err == nil && parent != nil { parentCommitURL, _ := url.Parse(repo.APIURL() + "/git/commits/" + url.PathEscape(parent.ID.String())) parents[i] = &api.CommitMeta{ SHA: parent.ID.String(), diff --git a/services/repository/files/patch.go b/services/repository/files/patch.go index 8fe6bb917ba41..271bc8df3e9b2 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -135,7 +135,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user } // Get the commit of the original branch - commit, err := t.GetBranchCommit(opts.OldBranch) + commit, err := t.GetBranchCommit(ctx, opts.OldBranch) if err != nil { return nil, err // Couldn't get a commit for the branch } @@ -144,7 +144,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user if opts.LastCommitID == "" { opts.LastCommitID = commit.ID.String() } else { - lastCommitID, err := t.gitRepo.ConvertToGitID(opts.LastCommitID) + lastCommitID, err := t.gitRepo.ConvertToGitID(ctx, opts.LastCommitID) if err != nil { return nil, fmt.Errorf("ApplyPatch: Invalid last commit ID: %w", err) } @@ -204,12 +204,12 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user return nil, err } - commit, err = t.GetCommit(commitHash) + commit, err = t.GetCommit(ctx, commitHash) if err != nil { return nil, err } - fileCommitResponse, _ := GetFileCommitResponse(repo, commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, commit) // ok if fails, then will be nil verification := GetPayloadCommitVerification(ctx, commit) fileResponse := &structs.FileResponse{ Commit: fileCommitResponse, diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index feb4811bb02ac..1889ba3bf95a3 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -75,7 +75,7 @@ func (t *TemporaryUploadRepository) Clone(ctx context.Context, branch string, ba } return fmt.Errorf("Clone: %w %s", err, stderr) } - gitRepo, err := git.OpenRepository(ctx, t.basePath) + gitRepo, err := git.OpenRepository(t.basePath) if err != nil { return err } @@ -88,7 +88,7 @@ func (t *TemporaryUploadRepository) Init(ctx context.Context, objectFormatName s if err := git.InitRepository(ctx, t.basePath, false, objectFormatName); err != nil { return err } - gitRepo, err := git.OpenRepository(ctx, t.basePath) + gitRepo, err := git.OpenRepository(t.basePath) if err != nil { return err } @@ -137,7 +137,7 @@ func (t *TemporaryUploadRepository) LsFiles(ctx context.Context, filenames ...st // RemoveFilesFromIndex removes the given files from the index func (t *TemporaryUploadRepository) RemoveFilesFromIndex(ctx context.Context, filenames ...string) error { - objFmt, err := t.gitRepo.GetObjectFormat() + objFmt, err := t.gitRepo.GetObjectFormat(ctx) if err != nil { return fmt.Errorf("unable to get object format for temporary repo: %q, error: %w", t.repo.FullName(), err) } @@ -412,17 +412,17 @@ func (t *TemporaryUploadRepository) DiffIndex(ctx context.Context) (*gitdiff.Dif } // GetBranchCommit Gets the commit object of the given branch -func (t *TemporaryUploadRepository) GetBranchCommit(branch string) (*git.Commit, error) { +func (t *TemporaryUploadRepository) GetBranchCommit(ctx context.Context, branch string) (*git.Commit, error) { if t.gitRepo == nil { return nil, errors.New("repository has not been cloned") } - return t.gitRepo.GetBranchCommit(branch) + return t.gitRepo.GetBranchCommit(ctx, branch) } // GetCommit Gets the commit object of the given commit ID -func (t *TemporaryUploadRepository) GetCommit(commitID string) (*git.Commit, error) { +func (t *TemporaryUploadRepository) GetCommit(ctx context.Context, commitID string) (*git.Commit, error) { if t.gitRepo == nil { return nil, errors.New("repository has not been cloned") } - return t.gitRepo.GetCommit(commitID) + return t.gitRepo.GetCommit(ctx, commitID) } diff --git a/services/repository/files/tree.go b/services/repository/files/tree.go index e481a3e7d2672..9ac1af46c02fd 100644 --- a/services/repository/files/tree.go +++ b/services/repository/files/tree.go @@ -42,7 +42,7 @@ func (err ErrSHANotFound) Unwrap() error { // GetTreeBySHA get the GitTreeResponse of a repository using a sha hash. func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, sha string, page, perPage int, recursive bool) (*api.GitTreeResponse, error) { - gitTree, err := gitRepo.GetTree(sha) + gitTree, err := gitRepo.GetTree(ctx, sha) if err != nil || gitTree == nil { return nil, ErrSHANotFound{ // TODO: this error has never been catch outside of this function SHA: sha, @@ -53,9 +53,9 @@ func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git tree.URL = repo.APIURL() + "/git/trees/" + url.PathEscape(tree.SHA) var entries git.Entries if recursive { - entries, err = gitTree.ListEntriesRecursiveWithSize() + entries, err = gitTree.ListEntriesRecursiveWithSize(ctx) } else { - entries, err = gitTree.ListEntries() + entries, err = gitTree.ListEntries(ctx) } if err != nil { return nil, err @@ -99,7 +99,7 @@ func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git tree.Entries[i].Path = entries[e].Name() tree.Entries[i].Mode = fmt.Sprintf("%06o", entries[e].Mode()) tree.Entries[i].Type = entries[e].Type() - tree.Entries[i].Size = entries[e].Size() + tree.Entries[i].Size = entries[e].Size(ctx) tree.Entries[i].SHA = entries[e].ID.String() if entries[e].IsDir() { @@ -158,7 +158,7 @@ func newTreeViewNodeFromEntry(ctx context.Context, repoLink string, renderedIcon FullPath: path.Join(parentDir, entry.Name()), } - entryInfo := fileicon.EntryInfoFromGitTreeEntry(commit, node.FullPath, entry) + entryInfo := fileicon.EntryInfoFromGitTreeEntry(ctx, commit, node.FullPath, entry) node.EntryIcon = fileicon.RenderEntryIconHTML(renderedIconPool, entryInfo) if entryInfo.EntryMode.IsDir() { entryInfo.IsOpen = true @@ -166,7 +166,7 @@ func newTreeViewNodeFromEntry(ctx context.Context, repoLink string, renderedIcon } if node.EntryMode == "commit" { - if subModule, err := commit.GetSubModule(node.FullPath); err != nil { + if subModule, err := commit.GetSubModule(ctx, node.FullPath); err != nil { log.Error("GetSubModule: %v", err) } else if subModule != nil { submoduleFile := git.NewCommitSubmoduleFile(repoLink, node.FullPath, subModule.URL, entry.ID.String()) @@ -192,7 +192,7 @@ func sortTreeViewNodes(nodes []*TreeViewNode) { } func listTreeNodes(ctx context.Context, repoLink string, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, tree *git.Tree, treePath, subPath string) ([]*TreeViewNode, error) { - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { return nil, err } @@ -207,7 +207,7 @@ func listTreeNodes(ctx context.Context, repoLink string, renderedIconPool *filei if subTreePath[0] == '/' { subTreePath = subTreePath[1:] } - subNodes, err := listTreeNodes(ctx, repoLink, renderedIconPool, commit, entry.Tree(), subTreePath, subPathRemaining) + subNodes, err := listTreeNodes(ctx, repoLink, renderedIconPool, commit, entry.Tree(ctx), subTreePath, subPathRemaining) if err != nil { log.Error("listTreeNodes: %v", err) } else { @@ -220,9 +220,9 @@ func listTreeNodes(ctx context.Context, repoLink string, renderedIconPool *filei } func GetTreeViewNodes(ctx context.Context, repoLink string, renderedIconPool *fileicon.RenderedIconPool, commit *git.Commit, treePath, subPath string) ([]*TreeViewNode, error) { - entry, err := commit.GetTreeEntryByPath(treePath) + entry, err := commit.GetTreeEntryByPath(ctx, treePath) if err != nil { return nil, err } - return listTreeNodes(ctx, repoLink, renderedIconPool, commit, entry.Tree(), treePath, subPath) + return listTreeNodes(ctx, repoLink, renderedIconPool, commit, entry.Tree(ctx), treePath, subPath) } diff --git a/services/repository/files/update.go b/services/repository/files/update.go index b07055d57aaa6..9e8d5f8ebaf4d 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -237,7 +237,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use if hasOldBranch { // Get the commit of the original branch - commit, err := t.GetBranchCommit(opts.OldBranch) + commit, err := t.GetBranchCommit(ctx, opts.OldBranch) if err != nil { return nil, err // Couldn't get a commit for the branch } @@ -246,7 +246,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use if opts.LastCommitID == "" { opts.LastCommitID = commit.ID.String() } else { - lastCommitID, err := t.gitRepo.ConvertToGitID(opts.LastCommitID) + lastCommitID, err := t.gitRepo.ConvertToGitID(ctx, opts.LastCommitID) if err != nil { return nil, fmt.Errorf("ConvertToSHA1: Invalid last commit ID: %w", err) } @@ -254,7 +254,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use } for _, file := range opts.Files { - if err = handleCheckErrors(file, commit, opts); err != nil { + if err = handleCheckErrors(ctx, file, commit, opts); err != nil { return nil, err } } @@ -311,7 +311,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use return nil, err } - commit, err := t.GetCommit(commitHash) + commit, err := t.GetCommit(ctx, commitHash) if err != nil { return nil, err } @@ -324,7 +324,7 @@ func ChangeRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use } if repo.IsEmpty { - if isEmpty, err := gitRepo.IsEmpty(); err == nil && !isEmpty { + if isEmpty, err := gitRepo.IsEmpty(ctx); err == nil && !isEmpty { _ = repo_model.UpdateRepositoryColsWithAutoTime(ctx, &repo_model.Repository{ID: repo.ID, IsEmpty: false, DefaultBranch: opts.NewBranch}, "is_empty", "default_branch") } } @@ -390,12 +390,12 @@ func (err ErrSHAOrCommitIDNotProvided) Error() string { } // handles the check for various issues for ChangeRepoFiles -func handleCheckErrors(file *ChangeRepoFile, commit *git.Commit, opts *ChangeRepoFilesOptions) error { +func handleCheckErrors(ctx context.Context, file *ChangeRepoFile, commit *git.Commit, opts *ChangeRepoFilesOptions) error { // check old entry (fromTreePath/fromEntry) if file.Operation == "update" || file.Operation == "upload" || file.Operation == "delete" || file.Operation == "rename" { var fromEntryIDString string { - fromEntry, err := commit.GetTreeEntryByPath(file.Options.fromTreePath) + fromEntry, err := commit.GetTreeEntryByPath(ctx, file.Options.fromTreePath) if file.Operation == "upload" && git.IsErrNotExist(err) { fromEntry = nil } else if err != nil { @@ -420,7 +420,7 @@ func handleCheckErrors(file *ChangeRepoFile, commit *git.Commit, opts *ChangeRep // If a lastCommitID given doesn't match the branch head's commitID throw // an error, but only if we aren't creating a new branch. if commit.ID.String() != opts.LastCommitID && opts.OldBranch == opts.NewBranch { - if changed, err := commit.FileChangedSinceCommit(file.Options.treePath, opts.LastCommitID); err != nil { + if changed, err := commit.FileChangedSinceCommit(ctx, file.Options.treePath, opts.LastCommitID); err != nil { return err } else if changed { return ErrCommitIDDoesNotMatch{ @@ -446,7 +446,7 @@ func handleCheckErrors(file *ChangeRepoFile, commit *git.Commit, opts *ChangeRep subTreePath := "" for index, part := range treePathParts { subTreePath = path.Join(subTreePath, part) - entry, err := commit.GetTreeEntryByPath(subTreePath) + entry, err := commit.GetTreeEntryByPath(ctx, subTreePath) if err != nil { if git.IsErrNotExist(err) { // Means there is no item with that name, so we're good @@ -621,11 +621,11 @@ func writeRepoObjectForRename(ctx context.Context, t *TemporaryUploadRepository, if err != nil { return nil, err } - commit, err := t.GetCommit(lastCommitID) + commit, err := t.GetCommit(ctx, lastCommitID) if err != nil { return nil, err } - oldEntry, err := commit.GetTreeEntryByPath(file.Options.fromTreePath) + oldEntry, err := commit.GetTreeEntryByPath(ctx, file.Options.fromTreePath) if err != nil { return nil, err } @@ -648,7 +648,7 @@ func writeRepoObjectForRename(ctx context.Context, t *TemporaryUploadRepository, } oldEntryBlobPointerBy := func(f func(r io.Reader) (lfs.Pointer, error)) (lfsPointer lfs.Pointer, err error) { - r, err := oldEntry.Blob().DataAsync() + r, err := oldEntry.Blob().DataAsync(ctx) if err != nil { return lfsPointer, err } @@ -674,7 +674,7 @@ func writeRepoObjectForRename(ctx context.Context, t *TemporaryUploadRepository, if err != nil { return nil, err } - ret.LfsContent, err = oldEntry.Blob().DataAsync() + ret.LfsContent, err = oldEntry.Blob().DataAsync(ctx) if err != nil { return nil, err } diff --git a/services/repository/fork.go b/services/repository/fork.go index 2380666afbfe6..79665ee0694cc 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -171,7 +171,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork // 6 - Sync the repository branches and tags var gitRepo *git.Repository - gitRepo, err = gitrepo.OpenRepository(ctx, repo) + gitRepo, err = gitrepo.OpenRepository(repo) if err != nil { return nil, fmt.Errorf("OpenRepository: %w", err) } diff --git a/services/repository/gitgraph/graph.go b/services/repository/gitgraph/graph.go index f89d9a095a125..7594eac3c4555 100644 --- a/services/repository/gitgraph/graph.go +++ b/services/repository/gitgraph/graph.go @@ -16,7 +16,7 @@ import ( ) // GetCommitGraph return a list of commit (GraphItems) from all branches -func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { +func GetCommitGraph(ctx context.Context, r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { format := "DATA:%D|%H|%ad|%h|%s" if page == 0 { @@ -110,7 +110,7 @@ func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bo } return scanner.Err() }). - Run(r.Ctx); err != nil { + Run(ctx); err != nil { return graph, err } return graph, nil diff --git a/services/repository/gitgraph/graph_models.go b/services/repository/gitgraph/graph_models.go index fc2eb85b87fd1..07a92ff1ddef2 100644 --- a/services/repository/gitgraph/graph_models.go +++ b/services/repository/gitgraph/graph_models.go @@ -102,7 +102,7 @@ func (graph *Graph) LoadAndProcessCommits(ctx context.Context, repository *repo_ if len(c.Rev) == 0 { continue } - c.Commit, err = gitRepo.GetCommit(c.Rev) + c.Commit, err = gitRepo.GetCommit(ctx, c.Rev) if err != nil { return fmt.Errorf("GetCommit: %s Error: %w", c.Rev, err) } diff --git a/services/repository/gitgraph/graph_test.go b/services/repository/gitgraph/graph_test.go index eda499840b330..49a79e8b2e512 100644 --- a/services/repository/gitgraph/graph_test.go +++ b/services/repository/gitgraph/graph_test.go @@ -16,14 +16,14 @@ import ( ) func BenchmarkGetCommitGraph(b *testing.B) { - currentRepo, err := git.OpenRepository(b.Context(), ".") + currentRepo, err := git.OpenRepository(".") if err != nil || currentRepo == nil { b.Error("Could not open repository") } defer currentRepo.Close() for b.Loop() { - graph, err := GetCommitGraph(currentRepo, 1, 0, false, nil, nil) + graph, err := GetCommitGraph(b.Context(), currentRepo, 1, 0, false, nil, nil) if err != nil { b.Error("Could get commit graph") } diff --git a/services/repository/hooks.go b/services/repository/hooks.go index c5bd3b8a7ea24..e71630f1e82c8 100644 --- a/services/repository/hooks.go +++ b/services/repository/hooks.go @@ -52,13 +52,13 @@ func SyncRepositoryHooks(ctx context.Context) error { // GenerateGitHooks generates git hooks from a template repository func GenerateGitHooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error { - generateGitRepo, err := gitrepo.OpenRepository(ctx, generateRepo) + generateGitRepo, err := gitrepo.OpenRepository(generateRepo) if err != nil { return err } defer generateGitRepo.Close() - templateGitRepo, err := gitrepo.OpenRepository(ctx, templateRepo) + templateGitRepo, err := gitrepo.OpenRepository(templateRepo) if err != nil { return err } diff --git a/services/repository/lfs.go b/services/repository/lfs.go index 4d48881b87f63..3a37aa0b9dfbf 100644 --- a/services/repository/lfs.go +++ b/services/repository/lfs.go @@ -70,7 +70,7 @@ func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.R } }() - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Error("Unable to open git repository %-v: %v", repo, err) return err @@ -88,7 +88,7 @@ func GarbageCollectLFSMetaObjectsForRepo(ctx context.Context, repo *repo_model.R total++ pointerSha := git.ComputeBlobHash(objectFormat, []byte(metaObject.Pointer.StringContent())) - if gitRepo.IsObjectExist(pointerSha.String()) { + if gitRepo.IsObjectExist(ctx, pointerSha.String()) { return git_model.MarkLFSMetaObject(ctx, metaObject.ID) } orphaned++ diff --git a/services/repository/license.go b/services/repository/license.go index 8622911fa24aa..ace9252b0fc8f 100644 --- a/services/repository/license.go +++ b/services/repository/license.go @@ -72,14 +72,14 @@ func repoLicenseUpdater(items ...*LicenseUpdaterOptions) []*LicenseUpdaterOption continue } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Error("repoLicenseUpdater [%d] failed: OpenRepository: %v", opts.RepoID, err) continue } defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { log.Error("repoLicenseUpdater [%d] failed: GetBranchCommit: %v", opts.RepoID, err) continue @@ -120,7 +120,7 @@ func UpdateRepoLicenses(ctx context.Context, repo *repo_model.Repository, commit return nil } - b, err := commit.GetBlobByPath(LicenseFileName) + b, err := commit.GetBlobByPath(ctx, LicenseFileName) if err != nil && !git.IsErrNotExist(err) { return fmt.Errorf("GetBlobByPath: %w", err) } @@ -131,7 +131,7 @@ func UpdateRepoLicenses(ctx context.Context, repo *repo_model.Repository, commit licenses := make([]string, 0) if b != nil { - r, err := b.DataAsync() + r, err := b.DataAsync(ctx) if err != nil { return err } diff --git a/services/repository/migrate.go b/services/repository/migrate.go index 9873d5deeb4f8..66662bf2fdb97 100644 --- a/services/repository/migrate.go +++ b/services/repository/migrate.go @@ -123,13 +123,13 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, return nil, fmt.Errorf("updateGitRepoAfterCreate: %w", err) } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return repo, fmt.Errorf("OpenRepository: %w", err) } defer gitRepo.Close() - repo.IsEmpty, err = gitRepo.IsEmpty() + repo.IsEmpty, err = gitRepo.IsEmpty(ctx) if err != nil { return repo, fmt.Errorf("git.IsEmpty: %w", err) } diff --git a/services/repository/push.go b/services/repository/push.go index 7c68a7f176308..b282df21d26ee 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -87,7 +87,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { return fmt.Errorf("GetRepositoryByOwnerAndName failed: %w", err) } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return fmt.Errorf("OpenRepository[%s]: %w", repo.FullName(), err) } @@ -132,7 +132,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { delTags = append(delTags, tagName) notify_service.DeleteRef(ctx, pusher, repo, opts.RefFullName) } else { // is new tag - newCommit, err := gitRepo.GetCommit(opts.NewCommitID) + newCommit, err := gitRepo.GetCommit(ctx, opts.NewCommitID) if err != nil { // in case there is dirty data, for example, the "github.com/git/git" repository has tags pointing to non-existing commits if !errors.Is(err, util.ErrNotExist) { @@ -172,7 +172,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { log.Trace("TriggerTask '%s/%s' by %s", repo.Name, branch, pusher.Name) - newCommit, err := gitRepo.GetCommit(opts.NewCommitID) + newCommit, err := gitRepo.GetCommit(ctx, opts.NewCommitID) if err != nil { return fmt.Errorf("gitRepo.GetCommit(%s) in %s/%s[%d]: %w", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) } @@ -206,7 +206,7 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { log.Error("updateIssuesCommit: %v", err) } - commits.CompareURL = getCompareURL(repo, gitRepo, objectFormat, commits.Commits, opts) + commits.CompareURL = getCompareURL(ctx, repo, gitRepo, objectFormat, commits.Commits, opts) if len(commits.Commits) > setting.UI.FeedMaxCommitNum { commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum] @@ -245,10 +245,10 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { return nil } -func getCompareURL(repo *repo_model.Repository, gitRepo *git.Repository, objectFormat git.ObjectFormat, commits []*repo_module.PushCommit, opts *repo_module.PushUpdateOptions) string { +func getCompareURL(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, objectFormat git.ObjectFormat, commits []*repo_module.PushCommit, opts *repo_module.PushUpdateOptions) string { oldCommitID := opts.OldCommitID if oldCommitID == objectFormat.EmptyObjectID().String() && len(commits) > 0 { - oldCommit, err := gitRepo.GetCommit(commits[len(commits)-1].Sha1) + oldCommit, err := gitRepo.GetCommit(ctx, commits[len(commits)-1].Sha1) if err != nil && !git.IsErrNotExist(err) { log.Error("unable to GetCommit %s from %-v: %v", oldCommitID, repo, err) } @@ -288,7 +288,7 @@ func pushNewBranch(ctx context.Context, repo *repo_model.Repository, pusher *use } } - l, err := newCommit.CommitsBeforeLimit(10) + l, err := newCommit.CommitsBeforeLimit(ctx, 10) if err != nil { return nil, fmt.Errorf("newCommit.CommitsBeforeLimit: %w", err) } @@ -296,15 +296,15 @@ func pushNewBranch(ctx context.Context, repo *repo_model.Repository, pusher *use return l, nil } -func pushUpdateBranch(_ context.Context, repo *repo_model.Repository, pusher *user_model.User, opts *repo_module.PushUpdateOptions, newCommit *git.Commit) ([]*git.Commit, error) { - l, err := newCommit.CommitsBeforeUntil(opts.OldCommitID) +func pushUpdateBranch(ctx context.Context, repo *repo_model.Repository, pusher *user_model.User, opts *repo_module.PushUpdateOptions, newCommit *git.Commit) ([]*git.Commit, error) { + l, err := newCommit.CommitsBeforeUntil(ctx, opts.OldCommitID) if err != nil { return nil, fmt.Errorf("newCommit.CommitsBeforeUntil: %w", err) } branch := opts.RefFullName.BranchName() - isForcePush, err := newCommit.IsForcePush(opts.OldCommitID) + isForcePush, err := newCommit.IsForcePush(ctx, opts.OldCommitID) if err != nil { log.Error("IsForcePush %s:%s failed: %v", repo.FullName(), branch, err) } @@ -379,11 +379,11 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo newReleases := make([]*repo_model.Release, 0, len(lowerTags)-len(relMap)) for i, lowerTag := range lowerTags { - tag, err := gitRepo.GetTag(tags[i]) + tag, err := gitRepo.GetTag(ctx, tags[i]) if err != nil { return fmt.Errorf("GetTag: %w", err) } - commit, err := gitRepo.GetTagCommit(tag.Name) + commit, err := gitRepo.GetTagCommit(ctx, tag.Name) if err != nil { return fmt.Errorf("Commit: %w", err) } diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go index 80de6b00fdbd1..73bb75aaff2e2 100644 --- a/services/webhook/notifier.go +++ b/services/webhook/notifier.go @@ -1025,7 +1025,7 @@ func (*webhookNotifier) WorkflowRunStatusUpdate(ctx context.Context, repo *repo_ status := convert.ToWorkflowRunAction(run.Status) - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { log.Error("OpenRepository: %v", err) return diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index 25c33b57fc770..13687418913f5 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -54,12 +54,12 @@ func InitWiki(ctx context.Context, repo *repo_model.Repository) error { // prepareGitPath try to find a suitable file path with file name by the given raw wiki name. // return: existence, prepared file path with name, error -func prepareGitPath(gitRepo *git.Repository, defaultWikiBranch string, wikiPath WebPath) (bool, string, error) { +func prepareGitPath(ctx context.Context, gitRepo *git.Repository, defaultWikiBranch string, wikiPath WebPath) (bool, string, error) { unescaped := string(wikiPath) + ".md" gitPath := WebPathToGitPath(wikiPath) // Look for both files - filesInIndex, err := gitRepo.LsTree(defaultWikiBranch, unescaped, gitPath) + filesInIndex, err := gitRepo.LsTree(ctx, defaultWikiBranch, unescaped, gitPath) if err != nil { if strings.Contains(err.Error(), "Not a valid object name") { return false, gitPath, nil // branch doesn't exist @@ -125,7 +125,7 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return fmt.Errorf("failed to clone repository: %s (%w)", repo.FullName(), err) } - gitRepo, err := git.OpenRepository(ctx, basePath) + gitRepo, err := git.OpenRepository(basePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", basePath, err) return fmt.Errorf("failed to open new temporary repository in: %s %w", basePath, err) @@ -133,13 +133,13 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model defer gitRepo.Close() if hasDefaultBranch { - if err := gitRepo.ReadTreeToIndex("HEAD"); err != nil { + if err := gitRepo.ReadTreeToIndex(ctx, "HEAD"); err != nil { log.Error("Unable to read HEAD tree to index in: %s %v", basePath, err) return fmt.Errorf("fnable to read HEAD tree to index in: %s %w", basePath, err) } } - isWikiExist, newWikiPath, err := prepareGitPath(gitRepo, repo.DefaultWikiBranch, newWikiName) + isWikiExist, newWikiPath, err := prepareGitPath(ctx, gitRepo, repo.DefaultWikiBranch, newWikiName) if err != nil { return err } @@ -155,14 +155,14 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model isOldWikiExist := true oldWikiPath := newWikiPath if oldWikiName != newWikiName { - isOldWikiExist, oldWikiPath, err = prepareGitPath(gitRepo, repo.DefaultWikiBranch, oldWikiName) + isOldWikiExist, oldWikiPath, err = prepareGitPath(ctx, gitRepo, repo.DefaultWikiBranch, oldWikiName) if err != nil { return err } } if isOldWikiExist { - err := gitRepo.RemoveFilesFromIndex(oldWikiPath) + err := gitRepo.RemoveFilesFromIndex(ctx, oldWikiPath) if err != nil { log.Error("RemoveFilesFromIndex failed: %v", err) return err @@ -172,18 +172,18 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model // FIXME: The wiki doesn't have lfs support at present - if this changes need to check attributes here - objectHash, err := gitRepo.HashObject(strings.NewReader(content)) + objectHash, err := gitRepo.HashObject(ctx, strings.NewReader(content)) if err != nil { log.Error("HashObject failed: %v", err) return err } - if err := gitRepo.AddObjectToIndex("100644", objectHash, newWikiPath); err != nil { + if err := gitRepo.AddObjectToIndex(ctx, "100644", objectHash, newWikiPath); err != nil { log.Error("AddObjectToIndex failed: %v", err) return err } - tree, err := gitRepo.WriteTree() + tree, err := gitRepo.WriteTree(ctx) if err != nil { log.Error("WriteTree failed: %v", err) return err @@ -208,13 +208,13 @@ func updateWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model commitTreeOpts.Parents = []string{"HEAD"} } - commitHash, err := gitRepo.CommitTree(doer.NewGitSig(), committer, tree, commitTreeOpts) + commitHash, err := gitRepo.CommitTree(ctx, doer.NewGitSig(), committer, tree, commitTreeOpts) if err != nil { log.Error("CommitTree failed: %v", err) return err } - if err := git.Push(gitRepo.Ctx, basePath, git.PushOptions{ + if err := git.Push(ctx, basePath, git.PushOptions{ Remote: DefaultRemote, Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, repo.DefaultWikiBranch), Env: repo_module.FullPushingEnvironment( @@ -278,24 +278,24 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model return fmt.Errorf("failed to clone repository: %s (%w)", repo.FullName(), err) } - gitRepo, err := git.OpenRepository(ctx, basePath) + gitRepo, err := git.OpenRepository(basePath) if err != nil { log.Error("Unable to open temporary repository: %s (%v)", basePath, err) return fmt.Errorf("failed to open new temporary repository in: %s %w", basePath, err) } defer gitRepo.Close() - if err := gitRepo.ReadTreeToIndex("HEAD"); err != nil { + if err := gitRepo.ReadTreeToIndex(ctx, "HEAD"); err != nil { log.Error("Unable to read HEAD tree to index in: %s %v", basePath, err) return fmt.Errorf("unable to read HEAD tree to index in: %s %w", basePath, err) } - found, wikiPath, err := prepareGitPath(gitRepo, repo.DefaultWikiBranch, wikiName) + found, wikiPath, err := prepareGitPath(ctx, gitRepo, repo.DefaultWikiBranch, wikiName) if err != nil { return err } if found { - err := gitRepo.RemoveFilesFromIndex(wikiPath) + err := gitRepo.RemoveFilesFromIndex(ctx, wikiPath) if err != nil { return err } @@ -305,7 +305,7 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model // FIXME: The wiki doesn't have lfs support at present - if this changes need to check attributes here - tree, err := gitRepo.WriteTree() + tree, err := gitRepo.WriteTree(ctx) if err != nil { return err } @@ -327,12 +327,12 @@ func DeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model commitTreeOpts.NoGPGSign = true } - commitHash, err := gitRepo.CommitTree(doer.NewGitSig(), committer, tree, commitTreeOpts) + commitHash, err := gitRepo.CommitTree(ctx, doer.NewGitSig(), committer, tree, commitTreeOpts) if err != nil { return err } - if err := git.Push(gitRepo.Ctx, basePath, git.PushOptions{ + if err := git.Push(ctx, basePath, git.PushOptions{ Remote: DefaultRemote, Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, repo.DefaultWikiBranch), Env: repo_module.FullPushingEnvironment( diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go index e571e093b6fe3..eb5ebbd14a150 100644 --- a/services/wiki/wiki_test.go +++ b/services/wiki/wiki_test.go @@ -167,14 +167,14 @@ func TestRepository_AddWikiPage(t *testing.T) { webPath := UserTitleToWebPath("", userTitle) assert.NoError(t, AddWikiPage(t.Context(), doer, repo, webPath, wikiContent, commitMsg)) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() - masterTree, err := gitRepo.GetTree(repo.DefaultWikiBranch) + masterTree, err := gitRepo.GetTree(t.Context(), repo.DefaultWikiBranch) assert.NoError(t, err) gitPath := WebPathToGitPath(webPath) - entry, err := masterTree.GetTreeEntryByPath(gitPath) + entry, err := masterTree.GetTreeEntryByPath(t.Context(), gitPath) assert.NoError(t, err) assert.Equal(t, gitPath, entry.Name(), "%s not added correctly", userTitle) }) @@ -214,17 +214,17 @@ func TestRepository_EditWikiPage(t *testing.T) { assert.NoError(t, EditWikiPage(t.Context(), doer, repo, "Home", webPath, newWikiContent, commitMsg)) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) assert.NoError(t, err) - masterTree, err := gitRepo.GetTree(repo.DefaultWikiBranch) + masterTree, err := gitRepo.GetTree(t.Context(), repo.DefaultWikiBranch) assert.NoError(t, err) gitPath := WebPathToGitPath(webPath) - entry, err := masterTree.GetTreeEntryByPath(gitPath) + entry, err := masterTree.GetTreeEntryByPath(t.Context(), gitPath) assert.NoError(t, err) assert.Equal(t, gitPath, entry.Name(), "%s not edited correctly", newWikiName) if newWikiName != "Home" { - _, err := masterTree.GetTreeEntryByPath("Home.md") + _, err := masterTree.GetTreeEntryByPath(t.Context(), "Home.md") assert.Error(t, err) } gitRepo.Close() @@ -238,21 +238,21 @@ func TestRepository_DeleteWikiPage(t *testing.T) { assert.NoError(t, DeleteWikiPage(t.Context(), doer, repo, "Home")) // Now need to show that the page has been added: - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() - masterTree, err := gitRepo.GetTree(repo.DefaultWikiBranch) + masterTree, err := gitRepo.GetTree(t.Context(), repo.DefaultWikiBranch) assert.NoError(t, err) gitPath := WebPathToGitPath("Home") - _, err = masterTree.GetTreeEntryByPath(gitPath) + _, err = masterTree.GetTreeEntryByPath(t.Context(), gitPath) assert.Error(t, err) } func TestPrepareWikiFileName(t *testing.T) { unittest.PrepareTestEnv(t) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + gitRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) require.NoError(t, err) defer gitRepo.Close() @@ -279,7 +279,7 @@ func TestPrepareWikiFileName(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { webPath := UserTitleToWebPath("", tt.arg) - existence, newWikiPath, err := prepareGitPath(gitRepo, repo.DefaultWikiBranch, webPath) + existence, newWikiPath, err := prepareGitPath(t.Context(), gitRepo, repo.DefaultWikiBranch, webPath) if (err != nil) != tt.wantErr { assert.NoError(t, err) return @@ -305,12 +305,12 @@ func TestPrepareWikiFileName_FirstPage(t *testing.T) { err := git.InitRepository(t.Context(), tmpDir, true, git.Sha1ObjectFormat.Name()) assert.NoError(t, err) - gitRepo, err := git.OpenRepository(t.Context(), tmpDir) + gitRepo, err := git.OpenRepository(tmpDir) require.NoError(t, err) defer gitRepo.Close() - existence, newWikiPath, err := prepareGitPath(gitRepo, "master", "Home") + existence, newWikiPath, err := prepareGitPath(t.Context(), gitRepo, "master", "Home") assert.False(t, existence) assert.NoError(t, err) assert.Equal(t, "Home.md", newWikiPath) diff --git a/tests/integration/actions_trigger_test.go b/tests/integration/actions_trigger_test.go index 3edb6017b4047..80d06915fee90 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -405,7 +405,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -530,7 +530,7 @@ jobs: // create a new branch testBranch := "test-branch" - gitRepo, err := git.OpenRepository(t.Context(), ".") + gitRepo, err := git.OpenRepository(".") assert.NoError(t, err) err = repo_service.CreateNewBranch(t.Context(), user2, repo, gitRepo, "main", testBranch) assert.NoError(t, err) @@ -751,7 +751,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -831,7 +831,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -922,7 +922,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1008,7 +1008,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1138,10 +1138,10 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the dispatch branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit("dispatch") + commit, err := gitRepo.GetBranchCommit(t.Context(), "dispatch") assert.NoError(t, err) inputs := &api.CreateActionWorkflowDispatch{ Ref: "refs/heads/dispatch", @@ -1336,7 +1336,7 @@ jobs: assert.Equal(t, workflows.Workflows[0].State, workflow.State) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1507,7 +1507,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) @@ -1584,7 +1584,7 @@ jobs: assert.NotEmpty(t, addWorkflowToBaseResp) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) diff --git a/tests/integration/api_packages_cargo_test.go b/tests/integration/api_packages_cargo_test.go index d7a89e446d7cd..acfa8ad472588 100644 --- a/tests/integration/api_packages_cargo_test.go +++ b/tests/integration/api_packages_cargo_test.go @@ -76,17 +76,17 @@ func testPackageCargo(t *testing.T, _ *neturl.URL) { assert.NoError(t, err) readGitContent := func(t *testing.T, path string) string { - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) assert.NoError(t, err) - blob, err := commit.GetBlobByPath(path) + blob, err := commit.GetBlobByPath(t.Context(), path) assert.NoError(t, err) - content, err := blob.GetBlobContent(1024) + content, err := blob.GetBlobContent(t.Context(), 1024) assert.NoError(t, err) return content diff --git a/tests/integration/api_releases_test.go b/tests/integration/api_releases_test.go index 1a04bec64ea13..682dd5ba2d674 100644 --- a/tests/integration/api_releases_test.go +++ b/tests/integration/api_releases_test.go @@ -109,14 +109,14 @@ func TestAPICreateAndUpdateRelease(t *testing.T) { session := loginUser(t, owner.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - err = gitRepo.CreateTag("v0.0.1", "master") + err = gitRepo.CreateTag(t.Context(), "v0.0.1", "master") assert.NoError(t, err) - target, err := gitRepo.GetTagCommitID("v0.0.1") + target, err := gitRepo.GetTagCommitID(t.Context(), "v0.0.1") assert.NoError(t, err) newRelease := createNewReleaseUsingAPI(t, token, owner, repo, "v0.0.1", target, "v0.0.1", "test") @@ -161,11 +161,11 @@ func TestAPICreateProtectedTagRelease(t *testing.T) { session := loginUser(t, writer.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit("master") + commit, err := gitRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/releases", repo.OwnerName, repo.Name), &api.CreateReleaseOption{ @@ -197,11 +197,11 @@ func TestAPICreateReleaseToDefaultBranchOnExistingTag(t *testing.T) { session := loginUser(t, owner.LowerName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - err = gitRepo.CreateTag("v0.0.1", "master") + err = gitRepo.CreateTag(t.Context(), "v0.0.1", "master") assert.NoError(t, err) createNewReleaseUsingAPI(t, token, owner, repo, "v0.0.1", "", "v0.0.1", "test") diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index af3bc546803a1..403d8e529eab1 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -183,10 +183,10 @@ func TestAPICreateFile(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &createFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(repo1) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName) - lastCommit, _ := gitRepo.GetCommitByPath(treePath) + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), createFileOptions.NewBranchName) + lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) expectedFileResponse := getExpectedFileResponseForCreate(apiFileResponseInfo{ repoFullName: "user2/repo1", commitID: commitID, @@ -309,10 +309,10 @@ func TestAPICreateFile(t *testing.T) { AddTokenAuth(token2) resp = MakeRequest(t, req, http.StatusCreated) emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "empty-repo"}) // public repo - gitRepo, _ := gitrepo.OpenRepository(t.Context(), emptyRepo) + gitRepo, _ := gitrepo.OpenRepository(emptyRepo) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName) - latestCommit, _ := gitRepo.GetCommitByPath(treePath) + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), createFileOptions.NewBranchName) + latestCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) expectedFileResponse := getExpectedFileResponseForCreate(apiFileResponseInfo{ repoFullName: "user2/empty-repo", commitID: commitID, diff --git a/tests/integration/api_repo_file_update_test.go b/tests/integration/api_repo_file_update_test.go index 9a56711da6a1d..2bc4021c815d6 100644 --- a/tests/integration/api_repo_file_update_test.go +++ b/tests/integration/api_repo_file_update_test.go @@ -139,10 +139,10 @@ func TestAPIUpdateFile(t *testing.T) { req := NewRequestWithJSON(t, "PUT", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &updateFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusOK) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(repo1) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(updateFileOptions.NewBranchName) - lasCommit, _ := gitRepo.GetCommitByPath(treePath) + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), updateFileOptions.NewBranchName) + lasCommit, _ := gitRepo.GetCommitByPath(t.Context(), treePath) expectedFileResponse := getExpectedFileResponseForUpdate(apiFileResponseInfo{ commitID: commitID, treePath: treePath, diff --git a/tests/integration/api_repo_files_change_test.go b/tests/integration/api_repo_files_change_test.go index 47fe5066a7138..293fc432bb5e3 100644 --- a/tests/integration/api_repo_files_change_test.go +++ b/tests/integration/api_repo_files_change_test.go @@ -93,11 +93,11 @@ func TestAPIChangeFiles(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents", user2.Name, repo1.Name), &changeFilesOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(repo1) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(changeFilesOptions.NewBranchName) - createLasCommit, _ := gitRepo.GetCommitByPath(createTreePath) - updateLastCommit, _ := gitRepo.GetCommitByPath(updateTreePath) + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), changeFilesOptions.NewBranchName) + createLasCommit, _ := gitRepo.GetCommitByPath(t.Context(), createTreePath) + updateLastCommit, _ := gitRepo.GetCommitByPath(t.Context(), updateTreePath) expectedCreateFileResponse := getExpectedFileResponseForCreate(apiFileResponseInfo{ repoFullName: fmt.Sprintf("%s/%s", user2.Name, repo1.Name), commitID: commitID, diff --git a/tests/integration/api_repo_files_get_test.go b/tests/integration/api_repo_files_get_test.go index edf4f390634e4..58f8b9bfac728 100644 --- a/tests/integration/api_repo_files_get_test.go +++ b/tests/integration/api_repo_files_get_test.go @@ -42,10 +42,10 @@ func TestAPIGetRequestedFiles(t *testing.T) { session = loginUser(t, user4.Name) token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() - lastCommit, _ := gitRepo.GetCommitByPath("README.md") + lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), "README.md") requestFiles := func(t *testing.T, url string, files []string, expectedStatusCode ...int) (ret []*api.ContentsResponse) { req := NewRequestWithJSON(t, "POST", url, &api.GetFilesOptions{Files: files}) diff --git a/tests/integration/api_repo_get_contents_list_test.go b/tests/integration/api_repo_get_contents_list_test.go index 5a53b0eca9ed2..d9e0f4f04c0d1 100644 --- a/tests/integration/api_repo_get_contents_list_test.go +++ b/tests/integration/api_repo_get_contents_list_test.go @@ -74,7 +74,7 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() @@ -83,10 +83,10 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { err = repo_service.CreateNewBranch(t.Context(), user2, repo1, gitRepo, repo1.DefaultBranch, newBranch) assert.NoError(t, err) - commitID, _ := gitRepo.GetBranchCommitID(repo1.DefaultBranch) + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), repo1.DefaultBranch) // Make a new tag in repo1 newTag := "test_tag" - err = gitRepo.CreateTag(newTag, commitID) + err = gitRepo.CreateTag(t.Context(), newTag, commitID) assert.NoError(t, err) /*** END SETUP ***/ @@ -98,7 +98,7 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { var contentsListResponse []*api.ContentsResponse DecodeJSON(t, resp, &contentsListResponse) assert.NotNil(t, contentsListResponse) - lastCommit, err := gitRepo.GetCommitByPath("README.md") + lastCommit, err := gitRepo.GetCommitByPath(t.Context(), "README.md") assert.NoError(t, err) expectedContentsListResponse := getExpectedContentsListResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, expectedContentsListResponse, contentsListResponse) @@ -120,9 +120,9 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &contentsListResponse) assert.NotNil(t, contentsListResponse) - branchCommit, err := gitRepo.GetBranchCommit(ref) + branchCommit, err := gitRepo.GetBranchCommit(t.Context(), ref) assert.NoError(t, err) - lastCommit, err = branchCommit.GetCommitByPath("README.md") + lastCommit, err = branchCommit.GetCommitByPath(t.Context(), "README.md") assert.NoError(t, err) expectedContentsListResponse = getExpectedContentsListResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, expectedContentsListResponse, contentsListResponse) @@ -134,9 +134,9 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &contentsListResponse) assert.NotNil(t, contentsListResponse) - tagCommit, err := gitRepo.GetTagCommit(ref) + tagCommit, err := gitRepo.GetTagCommit(t.Context(), ref) assert.NoError(t, err) - lastCommit, err = tagCommit.GetCommitByPath("README.md") + lastCommit, err = tagCommit.GetCommitByPath(t.Context(), "README.md") assert.NoError(t, err) expectedContentsListResponse = getExpectedContentsListResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, expectedContentsListResponse, contentsListResponse) diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index 3e863eed6ff7e..d247277226c8c 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -79,7 +79,7 @@ func testAPIGetContents(t *testing.T, u *url.URL) { token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) // Get the commit ID of the default branch - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) require.NoError(t, err) defer gitRepo.Close() @@ -88,11 +88,11 @@ func testAPIGetContents(t *testing.T, u *url.URL) { err = repo_service.CreateNewBranch(t.Context(), user2, repo1, gitRepo, repo1.DefaultBranch, newBranch) require.NoError(t, err) - commitID, err := gitRepo.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo.GetBranchCommitID(t.Context(), repo1.DefaultBranch) require.NoError(t, err) // Make a new tag in repo1 newTag := "test_tag" - err = gitRepo.CreateTag(newTag, commitID) + err = gitRepo.CreateTag(t.Context(), newTag, commitID) require.NoError(t, err) /*** END SETUP ***/ @@ -108,7 +108,7 @@ func testAPIGetContents(t *testing.T, u *url.URL) { resp = MakeRequest(t, req, http.StatusOK) var contentsResponse api.ContentsResponse DecodeJSON(t, resp, &contentsResponse) - lastCommit, _ := gitRepo.GetCommitByPath("README.md") + lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), "README.md") expectedContentsResponse := getExpectedContentsResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, *expectedContentsResponse, contentsResponse) @@ -126,8 +126,8 @@ func testAPIGetContents(t *testing.T, u *url.URL) { req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/contents/%s?ref=%s", user2.Name, repo1.Name, treePath, ref) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &contentsResponse) - branchCommit, _ := gitRepo.GetBranchCommit(ref) - lastCommit, _ = branchCommit.GetCommitByPath("README.md") + branchCommit, _ := gitRepo.GetBranchCommit(t.Context(), ref) + lastCommit, _ = branchCommit.GetCommitByPath(t.Context(), "README.md") expectedContentsResponse = getExpectedContentsResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, *expectedContentsResponse, contentsResponse) @@ -137,8 +137,8 @@ func testAPIGetContents(t *testing.T, u *url.URL) { req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/contents/%s?ref=%s", user2.Name, repo1.Name, treePath, ref) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &contentsResponse) - tagCommit, _ := gitRepo.GetTagCommit(ref) - lastCommit, _ = tagCommit.GetCommitByPath("README.md") + tagCommit, _ := gitRepo.GetTagCommit(t.Context(), ref) + lastCommit, _ = tagCommit.GetCommitByPath(t.Context(), "README.md") expectedContentsResponse = getExpectedContentsResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, *expectedContentsResponse, contentsResponse) diff --git a/tests/integration/api_repo_git_tags_test.go b/tests/integration/api_repo_git_tags_test.go index a0445bb80011a..e0752f045397e 100644 --- a/tests/integration/api_repo_git_tags_test.go +++ b/tests/integration/api_repo_git_tags_test.go @@ -32,17 +32,17 @@ func TestAPIGitTags(t *testing.T) { _ = gitrepo.GitConfigSet(t.Context(), repo, "user.name", user.Name) _ = gitrepo.GitConfigSet(t.Context(), repo, "user.email", user.Email) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit("master") + commit, _ := gitRepo.GetBranchCommit(t.Context(), "master") lTagName := "lightweightTag" - gitRepo.CreateTag(lTagName, commit.ID.String()) + gitRepo.CreateTag(t.Context(), lTagName, commit.ID.String()) aTagName := "annotatedTag" aTagMessage := "my annotated message" - gitRepo.CreateAnnotatedTag(aTagName, aTagMessage, commit.ID.String()) - aTag, _ := gitRepo.GetTag(aTagName) + gitRepo.CreateAnnotatedTag(t.Context(), aTagName, aTagMessage, commit.ID.String()) + aTag, _ := gitRepo.GetTag(t.Context(), aTagName) // SHOULD work for annotated tags req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/git/tags/%s", user.Name, repo.Name, aTag.ID.String()). diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index 05c7b272abcd4..495d3d5dd78f2 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -188,10 +188,10 @@ func testEditorWebGitCommitEmail(t *testing.T) { require.True(t, user.KeepEmailPrivate) repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(repo1) defer gitRepo.Close() getLastCommit := func(t *testing.T) *git.Commit { - c, err := gitRepo.GetBranchCommit("master") + c, err := gitRepo.GetBranchCommit(t.Context(), "master") require.NoError(t, err) return c } @@ -319,9 +319,9 @@ index 0000000000..bbbbbbbbbb }, ) - commit1, err := gitRepo.GetCommitByPath("patch-file-1.txt") + commit1, err := gitRepo.GetCommitByPath(t.Context(), "patch-file-1.txt") require.NoError(t, err) - commit2, err := gitRepo.GetCommitByPath("patch-file-2.txt") + commit2, err := gitRepo.GetCommitByPath(t.Context(), "patch-file-2.txt") require.NoError(t, err) resp1, _ := testWebGit(t, "/user2/repo1/_cherrypick/"+commit1.ID.String()+"/master", map[string]string{"revert": "true"}, diff --git a/tests/integration/git_general_test.go b/tests/integration/git_general_test.go index a726f0349f5cb..6636bf162dcf5 100644 --- a/tests/integration/git_general_test.go +++ b/tests/integration/git_general_test.go @@ -807,7 +807,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string return } - gitRepo, err := git.OpenRepository(t.Context(), dstPath) + gitRepo, err := git.OpenRepository(dstPath) require.NoError(t, err) defer gitRepo.Close() @@ -844,7 +844,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string Message: "Testing commit 1", }) assert.NoError(t, err) - commit, err = gitRepo.GetRefCommitID("HEAD") + commit, err = gitRepo.GetRefCommitID(t.Context(), "HEAD") assert.NoError(t, err) }) @@ -916,7 +916,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, headBranch string Message: "Testing commit 2", }) assert.NoError(t, err) - commit, err = gitRepo.GetRefCommitID("HEAD") + commit, err = gitRepo.GetRefCommitID(t.Context(), "HEAD") assert.NoError(t, err) }) diff --git a/tests/integration/git_misc_test.go b/tests/integration/git_misc_test.go index c830086e3fa11..bb93fdd1d28bc 100644 --- a/tests/integration/git_misc_test.go +++ b/tests/integration/git_misc_test.go @@ -44,20 +44,20 @@ func TestDataAsyncDoubleRead_Issue29101(t *testing.T) { sha := resp.Commit.SHA - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) - commit, err := gitRepo.GetCommit(sha) + commit, err := gitRepo.GetCommit(t.Context(), sha) assert.NoError(t, err) - entry, err := commit.GetTreeEntryByPath("test.txt") + entry, err := commit.GetTreeEntryByPath(t.Context(), "test.txt") assert.NoError(t, err) b := entry.Blob() - r1, err := b.DataAsync() + r1, err := b.DataAsync(t.Context()) assert.NoError(t, err) defer r1.Close() - r2, err := b.DataAsync() + r2, err := b.DataAsync(t.Context()) assert.NoError(t, err) defer r2.Close() @@ -90,7 +90,7 @@ func TestAgitPullPush(t *testing.T) { dstPath := t.TempDir() doGitClone(dstPath, u)(t) - gitRepo, err := git.OpenRepository(t.Context(), dstPath) + gitRepo, err := git.OpenRepository(dstPath) assert.NoError(t, err) defer gitRepo.Close() @@ -153,7 +153,7 @@ func TestAgitReviewStaleness(t *testing.T) { dstPath := t.TempDir() doGitClone(dstPath, u)(t) - gitRepo, err := git.OpenRepository(t.Context(), dstPath) + gitRepo, err := git.OpenRepository(dstPath) assert.NoError(t, err) defer gitRepo.Close() @@ -222,11 +222,11 @@ func TestAgitReviewStaleness(t *testing.T) { // For AGit PRs, HeadCommitID must be loaded from git references baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - baseGitRepo, err := gitrepo.OpenRepository(t.Context(), baseRepo) + baseGitRepo, err := gitrepo.OpenRepository(baseRepo) assert.NoError(t, err) defer baseGitRepo.Close() - updatedCommitID, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + updatedCommitID, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) t.Logf("Updated commit ID: %s", updatedCommitID) diff --git a/tests/integration/git_push_test.go b/tests/integration/git_push_test.go index 5d54eaed122ec..3c6660e751b77 100644 --- a/tests/integration/git_push_test.go +++ b/tests/integration/git_push_test.go @@ -167,7 +167,7 @@ func runTestGitPush(t *testing.T, u *url.URL, gitOperation func(t *testing.T, gi doGitAddRemote(gitPath, "origin", u)(t) - gitRepo, err := git.OpenRepository(t.Context(), gitPath) + gitRepo, err := git.OpenRepository(gitPath) require.NoError(t, err) defer gitRepo.Close() @@ -191,7 +191,7 @@ func runTestGitPush(t *testing.T, u *url.URL, gitOperation func(t *testing.T, gi deleted := deletedBranchesMap[branchName] assert.True(t, ok, "branch %s not found in database", branchName) assert.Equal(t, deleted, branch.IsDeleted, "IsDeleted of %s is %v, but it's expected to be %v", branchName, branch.IsDeleted, deleted) - commitID, err := gitRepo.GetBranchCommitID(branchName) + commitID, err := gitRepo.GetBranchCommitID(t.Context(), branchName) require.NoError(t, err) assert.Equal(t, commitID, branch.CommitID) } diff --git a/tests/integration/mirror_pull_test.go b/tests/integration/mirror_pull_test.go index 7902dc10cbffe..a5d19b956bbde 100644 --- a/tests/integration/mirror_pull_test.go +++ b/tests/integration/mirror_pull_test.go @@ -60,7 +60,7 @@ func TestMirrorPull(t *testing.T) { assert.True(t, slices.ContainsFunc(mirrorRepo.Units, func(u *repo_model.RepoUnit) bool { return u.Type == unit.TypeReleases })) assert.True(t, slices.ContainsFunc(mirrorRepo.Units, func(u *repo_model.RepoUnit) bool { return u.Type == unit.TypeWiki })) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -73,7 +73,7 @@ func TestMirrorPull(t *testing.T) { assert.NoError(t, err) assert.Zero(t, initCount) // no sync yet, so even though there is a tag in source repo, the mirror's release table is still empty - assert.NoError(t, release_service.CreateRelease(gitRepo, &repo_model.Release{ + assert.NoError(t, release_service.CreateRelease(t.Context(), gitRepo, &repo_model.Release{ RepoID: repo.ID, Repo: repo, PublisherID: user.ID, diff --git a/tests/integration/mirror_push_test.go b/tests/integration/mirror_push_test.go index c468228b82f17..b3e70a6f8ae58 100644 --- a/tests/integration/mirror_push_test.go +++ b/tests/integration/mirror_push_test.go @@ -54,18 +54,18 @@ func testMirrorPush(t *testing.T, u *url.URL) { ok := mirror_service.SyncPushMirror(t.Context(), mirrors[0].ID) assert.True(t, ok) - srcGitRepo, err := gitrepo.OpenRepository(t.Context(), srcRepo) + srcGitRepo, err := gitrepo.OpenRepository(srcRepo) assert.NoError(t, err) defer srcGitRepo.Close() - srcCommit, err := srcGitRepo.GetBranchCommit("master") + srcCommit, err := srcGitRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) - mirrorGitRepo, err := gitrepo.OpenRepository(t.Context(), mirrorRepo) + mirrorGitRepo, err := gitrepo.OpenRepository(mirrorRepo) assert.NoError(t, err) defer mirrorGitRepo.Close() - mirrorCommit, err := mirrorGitRepo.GetBranchCommit("master") + mirrorCommit, err := mirrorGitRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) assert.Equal(t, srcCommit.ID, mirrorCommit.ID) diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 7670aebab5349..c3e07f68952c9 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -263,7 +263,7 @@ func TestCantMergeConflict(t *testing.T) { BaseBranch: "base", }) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) err = pull_service.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "CONFLICT", false) @@ -361,7 +361,7 @@ func TestCantMergeUnrelated(t *testing.T) { session.MakeRequest(t, req, http.StatusCreated) // Now this PR could be marked conflict - or at least a race may occur - so drop down to pure code at this point... - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ HeadRepoID: repo1.ID, @@ -407,7 +407,7 @@ func TestFastForwardOnlyMerge(t *testing.T) { BaseBranch: "master", }) - gitRepo, err := git.OpenRepository(t.Context(), repo_model.RepoPath(user1.Name, repo1.Name)) + gitRepo, err := git.OpenRepository(repo_model.RepoPath(user1.Name, repo1.Name)) assert.NoError(t, err) err = pull_service.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "FAST-FORWARD-ONLY", false) @@ -449,7 +449,7 @@ func TestCantFastForwardOnlyMergeDiverging(t *testing.T) { BaseBranch: "master", }) - gitRepo, err := git.OpenRepository(t.Context(), repo_model.RepoPath(user1.Name, repo1.Name)) + gitRepo, err := git.OpenRepository(repo_model.RepoPath(user1.Name, repo1.Name)) assert.NoError(t, err) err = pull_service.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "DIVERGING", false) @@ -696,10 +696,10 @@ func TestPullMergeIndexerNotifier(t *testing.T) { func testResetRepo(t *testing.T, repo *repo_model.Repository, branch, commitID string) { assert.NoError(t, gitrepo.UpdateRef(t.Context(), repo, git.BranchPrefix+branch, commitID)) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() - id, err := gitRepo.GetBranchCommitID(branch) + id, err := gitRepo.GetBranchCommitID(t.Context(), branch) assert.NoError(t, err) assert.Equal(t, commitID, id) } @@ -766,14 +766,14 @@ func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(t.Context(), baseRepo) + baseGitRepo, err := gitrepo.OpenRepository(baseRepo) assert.NoError(t, err) - sha, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) - masterCommitID, err := baseGitRepo.GetBranchCommitID("master") + masterCommitID, err := baseGitRepo.GetBranchCommitID(t.Context(), "master") assert.NoError(t, err) - branches, _, err := baseGitRepo.GetBranchNames(0, 100) + branches, _, err := baseGitRepo.GetBranchNames(t.Context(), 0, 100) assert.NoError(t, err) assert.ElementsMatch(t, []string{"sub-home-md-img-check", "home-md-img-check", "pr-to-update", "branch2", "DefaultBranch", "develop", "feature/1", "master"}, branches) baseGitRepo.Close() @@ -848,11 +848,11 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) { assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(t.Context(), baseRepo) + baseGitRepo, err := gitrepo.OpenRepository(baseRepo) assert.NoError(t, err) - sha, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) - masterCommitID, err := baseGitRepo.GetBranchCommitID("master") + masterCommitID, err := baseGitRepo.GetBranchCommitID(t.Context(), "master") assert.NoError(t, err) baseGitRepo.Close() defer func() { @@ -979,11 +979,11 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing. assert.Empty(t, pr.MergedCommitID) // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(t.Context(), baseRepo) + baseGitRepo, err := gitrepo.OpenRepository(baseRepo) assert.NoError(t, err) - sha, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + sha, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) assert.NoError(t, err) - masterCommitID, err := baseGitRepo.GetBranchCommitID("master") + masterCommitID, err := baseGitRepo.GetBranchCommitID(t.Context(), "master") assert.NoError(t, err) baseGitRepo.Close() defer func() { diff --git a/tests/integration/repo_webhook_test.go b/tests/integration/repo_webhook_test.go index d54a604655561..2a8861321fd45 100644 --- a/tests/integration/repo_webhook_test.go +++ b/tests/integration/repo_webhook_test.go @@ -408,17 +408,17 @@ func Test_WebhookPushDevBranch(t *testing.T) { assert.Empty(t, payloads) repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() - beforeCommitID, err := gitRepo.GetBranchCommitID("develop") + beforeCommitID, err := gitRepo.GetBranchCommitID(t.Context(), "develop") assert.NoError(t, err) // 3. trigger the webhook testCreateFile(t, session, "user2", "repo1", "develop", "", "test_webhook_push.md", "# a test file for webhook push") - afterCommitID, err := gitRepo.GetBranchCommitID("develop") + afterCommitID, err := gitRepo.GetBranchCommitID(t.Context(), "develop") assert.NoError(t, err) // 4. validate the webhook is triggered @@ -459,17 +459,17 @@ func Test_WebhookPushToNewBranch(t *testing.T) { testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "push", "new_branch") repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) defer gitRepo.Close() - beforeCommitID, err := gitRepo.GetBranchCommitID("master") + beforeCommitID, err := gitRepo.GetBranchCommitID(t.Context(), "master") assert.NoError(t, err) // 2. trigger the webhook testCreateFile(t, session, "user2", "repo1", "master", "new_branch", "test_webhook_push.md", "# a new push from new branch") - afterCommitID, err := gitRepo.GetBranchCommitID("new_branch") + afterCommitID, err := gitRepo.GetBranchCommitID(t.Context(), "new_branch") assert.NoError(t, err) emptyCommitID := git.Sha1ObjectFormat.EmptyObjectID().String() @@ -907,9 +907,9 @@ func Test_WebhookStatus(t *testing.T) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 2. trigger the webhook @@ -985,7 +985,7 @@ func Test_WebhookWorkflowJob(t *testing.T) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) runner := newMockRunner() @@ -1013,7 +1013,7 @@ jobs: opts := getWorkflowCreateFileOptions(user2, repo1.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", "repo1", wfTreePath, opts) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered @@ -1173,7 +1173,7 @@ func testWorkflowRunEvents(t *testing.T, webhookData *workflowRunWebhook) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1250,7 +1250,7 @@ jobs: opts := getWorkflowCreateFileOptions(user2, repo1.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", "repo1", wfTreePath, opts) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered @@ -1300,7 +1300,7 @@ func testWorkflowRunEventsOnRerun(t *testing.T, webhookData *workflowRunWebhook) repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1377,7 +1377,7 @@ jobs: opts := getWorkflowCreateFileOptions(user2, repo1.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", "repo1", wfTreePath, opts) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered @@ -1449,7 +1449,7 @@ func testWorkflowRunEventsOnCancellingAbandonedRun(t *testing.T, webhookData *wo testAPICreateWebhookForRepo(t, session, "user2", repoName, webhookData.URL, "workflow_run") ctx := t.Context() - gitRepo, err := gitrepo.OpenRepository(ctx, testRepo) + gitRepo, err := gitrepo.OpenRepository(testRepo) assert.NoError(t, err) // 2.2 trigger the webhooks @@ -1528,7 +1528,7 @@ jobs: opts := getWorkflowCreateFileOptions(user2, testRepo.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", repoName, wfTreePath, opts) - commitID, err := gitRepo.GetBranchCommitID(testRepo.DefaultBranch) + commitID, err := gitRepo.GetBranchCommitID(t.Context(), testRepo.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered @@ -1574,7 +1574,7 @@ func testWebhookWorkflowRun(t *testing.T, webhookData *workflowRunWebhook) { repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) runner := newMockRunner() @@ -1618,7 +1618,7 @@ jobs: opts = getWorkflowCreateFileOptions(user2, repo1.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", "repo1", wfTreePath, opts) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered @@ -1672,7 +1672,7 @@ func testWebhookWorkflowRunDepthLimit(t *testing.T, webhookData *workflowRunWebh repo1 := unittest.AssertExistsAndLoadBean(t, &repo.Repository{ID: 1}) - gitRepo1, err := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo1, err := gitrepo.OpenRepository(repo1) assert.NoError(t, err) // 2. trigger the webhooks @@ -1695,7 +1695,7 @@ jobs: opts := getWorkflowCreateFileOptions(user2, repo1.DefaultBranch, "create "+wfTreePath, wfFileContent) createWorkflowFile(t, token, "user2", "repo1", wfTreePath, opts) - commitID, err := gitRepo1.GetBranchCommitID(repo1.DefaultBranch) + commitID, err := gitRepo1.GetBranchCommitID(t.Context(), repo1.DefaultBranch) assert.NoError(t, err) // 3. validate the webhook is triggered diff --git a/tests/integration/repofiles_change_test.go b/tests/integration/repofiles_change_test.go index 6821f8bf61175..6b473134b7f0c 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -411,11 +411,11 @@ func TestChangeRepoFilesForCreate(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(opts.NewBranch) - lastCommit, _ := gitRepo.GetCommitByPath("new/file.txt") + commitID, _ := gitRepo.GetBranchCommitID(t.Context(), opts.NewBranch) + lastCommit, _ := gitRepo.GetCommitByPath(t.Context(), "new/file.txt") expectedFileResponse := getExpectedFileResponseForRepoFilesCreate(commitID, lastCommit) assert.NotNil(t, expectedFileResponse) if expectedFileResponse != nil { @@ -448,11 +448,11 @@ func TestChangeRepoFilesForUpdate(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), opts.Files[0].TreePath) expectedFileResponse := getExpectedFileResponseForRepoFilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String(), lastCommit.Committer.When, lastCommit.Author.When) assert.Equal(t, expectedFileResponse.Content, filesResponse.Files[0]) assert.Equal(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) @@ -484,21 +484,21 @@ func TestChangeRepoFilesForUpdateWithFileMove(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), opts.Files[0].TreePath) expectedFileResponse := getExpectedFileResponseForRepoFilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String(), lastCommit.Committer.When, lastCommit.Author.When) // assert that the old file no longer exists in the last commit of the branch - fromEntry, err := commit.GetTreeEntryByPath(opts.Files[0].FromTreePath) + fromEntry, err := commit.GetTreeEntryByPath(t.Context(), opts.Files[0].FromTreePath) switch err.(type) { case git.ErrNotExist: // correct, continue default: t.Fatalf("expected git.ErrNotExist, got:%v", err) } - toEntry, err := commit.GetTreeEntryByPath(opts.Files[0].TreePath) + toEntry, err := commit.GetTreeEntryByPath(t.Context(), opts.Files[0].TreePath) assert.NoError(t, err) assert.Nil(t, fromEntry) // Should no longer exist here assert.NotNil(t, toEntry) // Should exist here @@ -530,11 +530,11 @@ func TestChangeRepoFilesForUpdateWithFileRename(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), opts.Files[0].TreePath) expectedFileResponse := getExpectedFileResponseForRepoFilesUpdateRename(commit.ID.String(), lastCommit.ID.String()) for _, file := range filesResponse.Files { file.LastCommitterDate, file.LastAuthorDate = nil, nil // there might be different time in one operation, so we ignore them @@ -567,11 +567,11 @@ func TestChangeRepoFilesWithoutBranchNames(t *testing.T) { // asserts assert.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, _ := gitrepo.OpenRepository(repo) defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), opts.Files[0].TreePath) expectedFileResponse := getExpectedFileResponseForRepoFilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String(), lastCommit.Committer.When, lastCommit.Author.When) assert.Equal(t, expectedFileResponse.Content, filesResponse.Files[0]) }) From 0fa7917c44b10e0f3849005dbe726bf3d54c0060 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 7 Oct 2025 19:03:37 -0700 Subject: [PATCH 2/2] fix gogit build --- modules/git/blob_gogit.go | 5 +++-- modules/git/commit_info_gogit.go | 8 ++++---- modules/git/languagestats/language_stats_gogit.go | 7 ++++--- modules/git/last_commit_cache_gogit.go | 4 ++-- modules/git/notes_gogit.go | 2 +- modules/git/pipeline/lfs_gogit.go | 5 +++-- modules/git/repo_base_gogit.go | 5 +---- modules/git/repo_branch_gogit.go | 13 +++++++------ modules/git/repo_commit_gogit.go | 15 ++++++++------- modules/git/repo_ref_gogit.go | 5 +++-- modules/git/repo_tag_gogit.go | 14 ++++++++------ modules/git/repo_tree_gogit.go | 11 ++++++----- modules/git/tree_blob_gogit.go | 7 ++++--- modules/git/tree_entry_gogit.go | 4 +++- modules/git/tree_gogit.go | 9 +++++---- 15 files changed, 62 insertions(+), 52 deletions(-) diff --git a/modules/git/blob_gogit.go b/modules/git/blob_gogit.go index 8c79c067c1749..6404c9ca11a03 100644 --- a/modules/git/blob_gogit.go +++ b/modules/git/blob_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "io" "github.com/go-git/go-git/v5/plumbing" @@ -22,11 +23,11 @@ type Blob struct { // DataAsync gets a ReadCloser for the contents of a blob without reading it all. // Calling the Close function on the result will discard all unread output. -func (b *Blob) DataAsync() (io.ReadCloser, error) { +func (b *Blob) DataAsync(ctx context.Context) (io.ReadCloser, error) { return b.gogitEncodedObj.Reader() } // Size returns the uncompressed size of the blob -func (b *Blob) Size() int64 { +func (b *Blob) Size(ctx context.Context) int64 { return b.gogitEncodedObj.Size() } diff --git a/modules/git/commit_info_gogit.go b/modules/git/commit_info_gogit.go index 73227347bc71d..a74e488300627 100644 --- a/modules/git/commit_info_gogit.go +++ b/modules/git/commit_info_gogit.go @@ -37,7 +37,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, commit * var revs map[string]*Commit if commit.repo.LastCommitCache != nil { var unHitPaths []string - revs, unHitPaths, err = getLastCommitForPathsByCache(commit.ID.String(), treePath, entryPaths, commit.repo.LastCommitCache) + revs, unHitPaths, err = getLastCommitForPathsByCache(ctx, commit.ID.String(), treePath, entryPaths, commit.repo.LastCommitCache) if err != nil { return nil, nil, err } @@ -73,7 +73,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, commit * // If the entry is a submodule, add a submodule file for this if entry.IsSubModule() { - commitsInfo[i].SubmoduleFile, err = GetCommitInfoSubmoduleFile(repoLink, path.Join(treePath, entry.Name()), commit, entry.ID) + commitsInfo[i].SubmoduleFile, err = GetCommitInfoSubmoduleFile(ctx, repoLink, path.Join(treePath, entry.Name()), commit, entry.ID) if err != nil { return nil, nil, err } @@ -143,11 +143,11 @@ func getFileHashes(c cgobject.CommitNode, treePath string, paths []string) (map[ return hashes, nil } -func getLastCommitForPathsByCache(commitID, treePath string, paths []string, cache *LastCommitCache) (map[string]*Commit, []string, error) { +func getLastCommitForPathsByCache(ctx context.Context, commitID, treePath string, paths []string, cache *LastCommitCache) (map[string]*Commit, []string, error) { var unHitEntryPaths []string results := make(map[string]*Commit) for _, p := range paths { - lastCommit, err := cache.Get(commitID, path.Join(treePath, p)) + lastCommit, err := cache.Get(ctx, commitID, path.Join(treePath, p)) if err != nil { return nil, nil, err } diff --git a/modules/git/languagestats/language_stats_gogit.go b/modules/git/languagestats/language_stats_gogit.go index 418c05b15789f..7e5d3896488f9 100644 --- a/modules/git/languagestats/language_stats_gogit.go +++ b/modules/git/languagestats/language_stats_gogit.go @@ -7,6 +7,7 @@ package languagestats import ( "bytes" + "context" "io" "code.gitea.io/gitea/modules/analyze" @@ -21,7 +22,7 @@ import ( ) // GetLanguageStats calculates language stats for git repository at specified commit -func GetLanguageStats(repo *git_module.Repository, commitID string) (map[string]int64, error) { +func GetLanguageStats(ctx context.Context, repo *git_module.Repository, commitID string) (map[string]int64, error) { r, err := git.PlainOpen(repo.Path) if err != nil { return nil, err @@ -42,7 +43,7 @@ func GetLanguageStats(repo *git_module.Repository, commitID string) (map[string] return nil, err } - checker, err := attribute.NewBatchChecker(repo, commitID, attribute.LinguistAttributes) + checker, err := attribute.NewBatchChecker(ctx, repo, commitID, attribute.LinguistAttributes) if err != nil { return nil, err } @@ -67,7 +68,7 @@ func GetLanguageStats(repo *git_module.Repository, commitID string) (map[string] isDocumentation := optional.None[bool]() isDetectable := optional.None[bool]() - attrs, err := checker.CheckPath(f.Name) + attrs, err := checker.CheckPath(ctx, f.Name) if err == nil { isVendored = attrs.GetVendored() if isVendored.ValueOrDefault(false) { diff --git a/modules/git/last_commit_cache_gogit.go b/modules/git/last_commit_cache_gogit.go index 3afc213094225..6099d88cf6e6b 100644 --- a/modules/git/last_commit_cache_gogit.go +++ b/modules/git/last_commit_cache_gogit.go @@ -32,7 +32,7 @@ func (c *Commit) recursiveCache(ctx context.Context, index cgobject.CommitNode, return nil } - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { return err } @@ -51,7 +51,7 @@ func (c *Commit) recursiveCache(ctx context.Context, index cgobject.CommitNode, for entry := range commits { if entryMap[entry].IsDir() { - subTree, err := tree.SubTree(entry) + subTree, err := tree.SubTree(ctx, entry) if err != nil { return err } diff --git a/modules/git/notes_gogit.go b/modules/git/notes_gogit.go index f802443b00e5b..3a02704873519 100644 --- a/modules/git/notes_gogit.go +++ b/modules/git/notes_gogit.go @@ -19,7 +19,7 @@ import ( // FIXME: Add LastCommitCache support func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) error { log.Trace("Searching for git note corresponding to the commit %q in the repository %q", commitID, repo.Path) - notes, err := repo.GetCommit(NotesRef) + notes, err := repo.GetCommit(ctx, NotesRef) if err != nil { if IsErrNotExist(err) { return err diff --git a/modules/git/pipeline/lfs_gogit.go b/modules/git/pipeline/lfs_gogit.go index adcf8ed09cb64..0033205f23625 100644 --- a/modules/git/pipeline/lfs_gogit.go +++ b/modules/git/pipeline/lfs_gogit.go @@ -7,6 +7,7 @@ package pipeline import ( "bufio" + "context" "io" "sort" "strings" @@ -20,7 +21,7 @@ import ( ) // FindLFSFile finds commits that contain a provided pointer file hash -func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { +func FindLFSFile(ctx context.Context, repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { resultsMap := map[string]*LFSResult{} results := make([]*LFSResult, 0) @@ -105,7 +106,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err i++ } }() - go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath) + go NameRevStdin(ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath) go func() { defer wg.Done() defer shasToNameWriter.Close() diff --git a/modules/git/repo_base_gogit.go b/modules/git/repo_base_gogit.go index e0d0b45372b43..3b7416f5398f7 100644 --- a/modules/git/repo_base_gogit.go +++ b/modules/git/repo_base_gogit.go @@ -7,7 +7,6 @@ package git import ( - "context" "path/filepath" gitealog "code.gitea.io/gitea/modules/log" @@ -34,13 +33,12 @@ type Repository struct { gogitStorage *filesystem.Storage gpgSettings *GPGSettings - Ctx context.Context LastCommitCache *LastCommitCache objectFormat ObjectFormat } // OpenRepository opens the repository at the given path within the context.Context -func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { +func OpenRepository(repoPath string) (*Repository, error) { repoPath, err := filepath.Abs(repoPath) if err != nil { return nil, err @@ -80,7 +78,6 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { gogitRepo: gogitRepo, gogitStorage: storage, tagCache: newObjectCache[*Tag](), - Ctx: ctx, objectFormat: ParseGogitHash(plumbing.ZeroHash).Type(), }, nil } diff --git a/modules/git/repo_branch_gogit.go b/modules/git/repo_branch_gogit.go index 77aecb21ebd27..27fcd9c015111 100644 --- a/modules/git/repo_branch_gogit.go +++ b/modules/git/repo_branch_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "sort" "strings" @@ -17,9 +18,9 @@ import ( // IsObjectExist returns true if the given object exists in the repository. // FIXME: Inconsistent behavior with nogogit edition // Unlike the implementation of IsObjectExist in nogogit edition, it does not support short hashes here. -// For example, IsObjectExist("153f451") will return false, but it will return true in nogogit edition. +// For example, IsObjectExist(ctx, "153f451") will return false, but it will return true in nogogit edition. // To fix this, the solution could be adding support for short hashes in gogit edition if it's really needed. -func (repo *Repository) IsObjectExist(name string) bool { +func (repo *Repository) IsObjectExist(ctx context.Context, name string) bool { if name == "" { return false } @@ -33,7 +34,7 @@ func (repo *Repository) IsObjectExist(name string) bool { // Unlike the implementation of IsObjectExist in nogogit edition, it does not support blob hashes here. // For example, IsObjectExist([existing_blob_hash]) will return false, but it will return true in nogogit edition. // To fix this, the solution could be refusing to support blob hashes in nogogit edition since a blob hash is not a reference. -func (repo *Repository) IsReferenceExist(name string) bool { +func (repo *Repository) IsReferenceExist(ctx context.Context, name string) bool { if name == "" { return false } @@ -44,7 +45,7 @@ func (repo *Repository) IsReferenceExist(name string) bool { } // IsBranchExist returns true if given branch exists in current repository. -func (repo *Repository) IsBranchExist(name string) bool { +func (repo *Repository) IsBranchExist(ctx context.Context, name string) bool { if name == "" { return false } @@ -60,7 +61,7 @@ func (repo *Repository) IsBranchExist(name string) bool { // Branches are returned with sort of `-committerdate` as the nogogit // implementation. This requires full fetch, sort and then the // skip/limit applies later as gogit returns in undefined order. -func (repo *Repository) GetBranchNames(skip, limit int) ([]string, int, error) { +func (repo *Repository) GetBranchNames(ctx context.Context, skip, limit int) ([]string, int, error) { type BranchData struct { name string committerDate int64 @@ -136,7 +137,7 @@ func (repo *Repository) WalkReferences(arg ObjectType, skip, limit int, walkfn f } // GetRefsBySha returns all references filtered with prefix that belong to a sha commit hash -func (repo *Repository) GetRefsBySha(sha, prefix string) ([]string, error) { +func (repo *Repository) GetRefsBySha(ctx context.Context, sha, prefix string) ([]string, error) { var revList []string iter, err := repo.gogitRepo.References() if err != nil { diff --git a/modules/git/repo_commit_gogit.go b/modules/git/repo_commit_gogit.go index 896d65603971d..4a913339a0817 100644 --- a/modules/git/repo_commit_gogit.go +++ b/modules/git/repo_commit_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "strings" "code.gitea.io/gitea/modules/git/gitcmd" @@ -17,7 +18,7 @@ import ( ) // GetRefCommitID returns the last commit ID string of given reference. -func (repo *Repository) GetRefCommitID(name string) (string, error) { +func (repo *Repository) GetRefCommitID(ctx context.Context, name string) (string, error) { if plumbing.IsHash(name) { return name, nil } @@ -39,8 +40,8 @@ func (repo *Repository) GetRefCommitID(name string) (string, error) { } // ConvertToHash returns a Hash object from a potential ID string -func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) ConvertToGitID(ctx context.Context, commitID string) (ObjectID, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -54,7 +55,7 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { actualCommitID, _, err := gitcmd.NewCommand("rev-parse", "--verify"). AddDynamicArguments(commitID). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) actualCommitID = strings.TrimSpace(actualCommitID) if err != nil { if strings.Contains(err.Error(), "unknown revision or path") || @@ -68,8 +69,8 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { } // IsCommitExist returns true if given commit exists in current repository. -func (repo *Repository) IsCommitExist(name string) bool { - hash, err := repo.ConvertToGitID(name) +func (repo *Repository) IsCommitExist(ctx context.Context, name string) bool { + hash, err := repo.ConvertToGitID(ctx, name) if err != nil { return false } @@ -77,7 +78,7 @@ func (repo *Repository) IsCommitExist(name string) bool { return err == nil } -func (repo *Repository) getCommit(id ObjectID) (*Commit, error) { +func (repo *Repository) getCommit(ctx context.Context, id ObjectID) (*Commit, error) { var tagObject *object.Tag commitID := plumbing.Hash(id.RawValue()) diff --git a/modules/git/repo_ref_gogit.go b/modules/git/repo_ref_gogit.go index fc43ce5545d5b..2c2407e980bd3 100644 --- a/modules/git/repo_ref_gogit.go +++ b/modules/git/repo_ref_gogit.go @@ -6,6 +6,7 @@ package git import ( + "context" "strings" "github.com/go-git/go-git/v5" @@ -13,7 +14,7 @@ import ( ) // GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with. -func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { +func (repo *Repository) GetRefsFiltered(ctx context.Context, pattern string) ([]*Reference, error) { r, err := git.PlainOpen(repo.Path) if err != nil { return nil, err @@ -30,7 +31,7 @@ func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { refType := string(ObjectCommit) if ref.Name().IsTag() { // tags can be of type `commit` (lightweight) or `tag` (annotated) - if tagType, _ := repo.GetTagType(ParseGogitHash(ref.Hash())); err == nil { + if tagType, _ := repo.GetTagType(ctx, ParseGogitHash(ref.Hash())); err == nil { refType = tagType } } diff --git a/modules/git/repo_tag_gogit.go b/modules/git/repo_tag_gogit.go index 878ab55bf20a5..4712ad5f03808 100644 --- a/modules/git/repo_tag_gogit.go +++ b/modules/git/repo_tag_gogit.go @@ -7,19 +7,21 @@ package git import ( + "context" + "code.gitea.io/gitea/modules/log" "github.com/go-git/go-git/v5/plumbing" ) // IsTagExist returns true if given tag exists in the repository. -func (repo *Repository) IsTagExist(name string) bool { +func (repo *Repository) IsTagExist(ctx context.Context, name string) bool { _, err := repo.gogitRepo.Reference(plumbing.ReferenceName(TagPrefix+name), true) return err == nil } // GetTagType gets the type of the tag, either commit (simple) or tag (annotated) -func (repo *Repository) GetTagType(id ObjectID) (string, error) { +func (repo *Repository) GetTagType(ctx context.Context, id ObjectID) (string, error) { // Get tag type obj, err := repo.gogitRepo.Object(plumbing.AnyObject, plumbing.Hash(id.RawValue())) if err != nil { @@ -32,7 +34,7 @@ func (repo *Repository) GetTagType(id ObjectID) (string, error) { return obj.Type().String(), nil } -func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { +func (repo *Repository) getTag(ctx context.Context, tagID ObjectID, name string) (*Tag, error) { t, ok := repo.tagCache.Get(tagID.String()) if ok { log.Debug("Hit cache: %s", tagID) @@ -41,13 +43,13 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { return &tagClone, nil } - tp, err := repo.GetTagType(tagID) + tp, err := repo.GetTagType(ctx, tagID) if err != nil { return nil, err } // Get the commit ID and tag ID (may be different for annotated tag) for the returned tag object - commitIDStr, err := repo.GetTagCommitID(name) + commitIDStr, err := repo.GetTagCommitID(ctx, name) if err != nil { // every tag should have a commit ID so return all errors return nil, err @@ -59,7 +61,7 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { // If type is "commit, the tag is a lightweight tag if ObjectType(tp) == ObjectCommit { - commit, err := repo.GetCommit(commitIDStr) + commit, err := repo.GetCommit(ctx, commitIDStr) if err != nil { return nil, err } diff --git a/modules/git/repo_tree_gogit.go b/modules/git/repo_tree_gogit.go index e15663a32a7ac..5a34d93c59792 100644 --- a/modules/git/repo_tree_gogit.go +++ b/modules/git/repo_tree_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "errors" "code.gitea.io/gitea/modules/git/gitcmd" @@ -14,7 +15,7 @@ import ( "github.com/go-git/go-git/v5/plumbing" ) -func (repo *Repository) getTree(id ObjectID) (*Tree, error) { +func (repo *Repository) getTree(ctx context.Context, id ObjectID) (*Tree, error) { gogitTree, err := repo.gogitRepo.TreeObject(plumbing.Hash(id.RawValue())) if err != nil { if errors.Is(err, plumbing.ErrObjectNotFound) { @@ -31,8 +32,8 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) { } // GetTree find the tree object in the repository. -func (repo *Repository) GetTree(idStr string) (*Tree, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) GetTree(ctx context.Context, idStr string) (*Tree, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -41,7 +42,7 @@ func (repo *Repository) GetTree(idStr string) (*Tree, error) { res, _, err := gitcmd.NewCommand("rev-parse", "--verify"). AddDynamicArguments(idStr). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } @@ -58,7 +59,7 @@ func (repo *Repository) GetTree(idStr string) (*Tree, error) { if err == nil { id = ParseGogitHash(commitObject.TreeHash) } - treeObject, err := repo.getTree(id) + treeObject, err := repo.getTree(ctx, id) if err != nil { return nil, err } diff --git a/modules/git/tree_blob_gogit.go b/modules/git/tree_blob_gogit.go index f29e8f8b9e874..6e0d27bc206b0 100644 --- a/modules/git/tree_blob_gogit.go +++ b/modules/git/tree_blob_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "path" "strings" @@ -16,7 +17,7 @@ import ( ) // GetTreeEntryByPath get the tree entries according the sub dir -func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) { +func (t *Tree) GetTreeEntryByPath(ctx context.Context, relpath string) (*TreeEntry, error) { if len(relpath) == 0 { return &TreeEntry{ ID: t.ID, @@ -36,7 +37,7 @@ func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) { tree := t for i, name := range parts { if i == len(parts)-1 { - entries, err := tree.ListEntries() + entries, err := tree.ListEntries(ctx) if err != nil { if err == plumbing.ErrObjectNotFound { return nil, ErrNotExist{ @@ -51,7 +52,7 @@ func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) { } } } else { - tree, err = tree.SubTree(name) + tree, err = tree.SubTree(ctx, name) if err != nil { if err == plumbing.ErrObjectNotFound { return nil, ErrNotExist{ diff --git a/modules/git/tree_entry_gogit.go b/modules/git/tree_entry_gogit.go index e6845f1c776fe..de3ac3cfdf0ba 100644 --- a/modules/git/tree_entry_gogit.go +++ b/modules/git/tree_entry_gogit.go @@ -7,6 +7,8 @@ package git import ( + "context" + "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/filemode" "github.com/go-git/go-git/v5/plumbing/object" @@ -34,7 +36,7 @@ func (te *TreeEntry) Mode() EntryMode { } // Size returns the size of the entry -func (te *TreeEntry) Size() int64 { +func (te *TreeEntry) Size(ctx context.Context) int64 { if te.IsDir() { return 0 } else if te.sized { diff --git a/modules/git/tree_gogit.go b/modules/git/tree_gogit.go index 272b018ffdd18..ed3adc1b576e8 100644 --- a/modules/git/tree_gogit.go +++ b/modules/git/tree_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "io" "github.com/go-git/go-git/v5/plumbing" @@ -36,7 +37,7 @@ func (t *Tree) loadTreeObject() error { } // ListEntries returns all entries of current tree. -func (t *Tree) ListEntries() (Entries, error) { +func (t *Tree) ListEntries(ctx context.Context) (Entries, error) { if t.gogitTree == nil { err := t.loadTreeObject() if err != nil { @@ -57,7 +58,7 @@ func (t *Tree) ListEntries() (Entries, error) { } // ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees -func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) { +func (t *Tree) ListEntriesRecursiveWithSize(ctx context.Context) (Entries, error) { if t.gogitTree == nil { err := t.loadTreeObject() if err != nil { @@ -92,6 +93,6 @@ func (t *Tree) ListEntriesRecursiveWithSize() (Entries, error) { } // ListEntriesRecursiveFast is the alias of ListEntriesRecursiveWithSize for the gogit version -func (t *Tree) ListEntriesRecursiveFast() (Entries, error) { - return t.ListEntriesRecursiveWithSize() +func (t *Tree) ListEntriesRecursiveFast(ctx context.Context) (Entries, error) { + return t.ListEntriesRecursiveWithSize(ctx) }