diff --git a/cmd/admin.go b/cmd/admin.go index 2396bbb47c9..11837107f04 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -129,7 +129,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 fd6a1630e51..bce46eea6a8 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -73,7 +73,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) } @@ -90,7 +90,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 bb0858c44ed..ca6402be7d0 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 e1078f4bd05..028b74fe177 100644 --- a/models/migrations/v1_14/v156.go +++ b/models/migrations/v1_14/v156.go @@ -108,14 +108,14 @@ func FixPublisherIDforTagReleases(ctx context.Context, x db.EngineMigration) err 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) @@ -127,7 +127,7 @@ func FixPublisherIDforTagReleases(ctx context.Context, x db.EngineMigration) err 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 9e8b47e8829..fe37a8c4d3a 100644 --- a/models/migrations/v1_9/v82.go +++ b/models/migrations/v1_9/v82.go @@ -87,7 +87,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x db.EngineMigration) err userCache[repo.OwnerID] = user } - gitRepo, err = gitrepo.OpenRepository(ctx, repo_model.StorageRepo(repo_model.RelativePath(user.Name, repo.Name))) + gitRepo, err = gitrepo.OpenRepository(repo_model.StorageRepo(repo_model.RelativePath(user.Name, repo.Name))) if err != nil { return err } @@ -95,7 +95,7 @@ func FixReleaseSha1OnReleaseTable(ctx context.Context, x db.EngineMigration) err 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 faf2d94eb0a..59a2fe12e8b 100644 --- a/models/renderhelper/commit_checker.go +++ b/models/renderhelper/commit_checker.go @@ -41,13 +41,13 @@ func (c *commitChecker) IsCommitIDExisting(commitID string) bool { if c.gitRepo == nil { r, closer, err := gitrepo.RepositoryFromContextOrOpen(c.ctx, c.gitRepoFacade) if err != nil { - log.Error("unable to open repository: %s Error: %v", gitrepo.RepoGitURL(c.gitRepoFacade), err) + log.Error("Unable to open repository: %s Error: %v", c.gitRepoFacade.RelativePath(), err) return false } 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/scoped_workflows.go b/modules/actions/scoped_workflows.go index e2b4ceecfb1..3e3cd47da91 100644 --- a/modules/actions/scoped_workflows.go +++ b/modules/actions/scoped_workflows.go @@ -36,7 +36,7 @@ func ParseScopedWorkflows(ctx context.Context, gitRepo *git.Repository, sourceCo parsed := make([]*ParsedScopedWorkflow, 0, len(entries)) for _, entry := range entries { - content, err := GetContentFromEntry(gitRepo, entry) + content, err := GetContentFromEntry(ctx, gitRepo, entry) if err != nil { return nil, err } @@ -60,6 +60,7 @@ func ParseScopedWorkflows(ctx context.Context, gitRepo *git.Repository, sourceCo // MatchScopedWorkflows evaluates already-parsed scoped workflows against one consuming event. // It returns the workflows whose `on:` matches, and those that matched the event but were excluded by a branch/paths filter (filtered). func MatchScopedWorkflows( + ctx context.Context, parsed []*ParsedScopedWorkflow, consumerGitRepo *git.Repository, consumerCommit *git.Commit, @@ -77,7 +78,7 @@ func MatchScopedWorkflows( TriggerEvent: evt, Content: p.Content, } - switch detectWorkflowMatch(consumerGitRepo, consumerCommit, triggedEvent, payload, evt) { + switch detectWorkflowMatch(ctx, consumerGitRepo, consumerCommit, triggedEvent, payload, evt) { case detectMatched: matched = append(matched, dwf) case detectFilteredOut: diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index 6414efc9dd9..aabf95c44b6 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -105,8 +105,8 @@ func listWorkflowsInDirs(ctx context.Context, gitRepo *git.Repository, commit *g return workflowDir, ret, nil } -func GetContentFromEntry(gitRepo *git.Repository, entry *git.TreeEntry) ([]byte, error) { - f, err := entry.Blob(gitRepo).DataAsync() +func GetContentFromEntry(ctx context.Context, gitRepo *git.Repository, entry *git.TreeEntry) ([]byte, error) { + f, err := entry.Blob(gitRepo).DataAsync(ctx) if err != nil { return nil, err } @@ -189,7 +189,7 @@ func DetectWorkflows( } for _, entry := range entries { - content, err := GetContentFromEntry(gitRepo, entry) + content, err := GetContentFromEntry(ctx, gitRepo, entry) if err != nil { return nil, nil, nil, err } @@ -217,7 +217,7 @@ func DetectWorkflows( TriggerEvent: evt, Content: content, } - switch detectWorkflowMatch(gitRepo, commit, triggedEvent, payload, evt) { + switch detectWorkflowMatch(ctx, gitRepo, commit, triggedEvent, payload, evt) { case detectMatched: workflows = append(workflows, dwf) case detectFilteredOut: @@ -239,7 +239,7 @@ func DetectScheduledWorkflows(ctx context.Context, gitRepo *git.Repository, comm wfs := make([]*DetectedWorkflow, 0, len(entries)) for _, entry := range entries { - content, err := GetContentFromEntry(gitRepo, entry) + content, err := GetContentFromEntry(ctx, gitRepo, entry) if err != nil { return nil, err } @@ -266,7 +266,7 @@ func DetectScheduledWorkflows(ctx context.Context, gitRepo *git.Repository, comm return wfs, nil } -func detectWorkflowMatch(gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) detectResult { +func detectWorkflowMatch(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader, evt *jobparser.Event) detectResult { if !canGithubEventMatch(evt.Name, triggedEvent) { return detectNotApplicable } @@ -286,7 +286,7 @@ func detectWorkflowMatch(gitRepo *git.Repository, commit *git.Commit, triggedEve case // push webhook_module.HookEventPush: - return matchPushEvent(gitRepo, commit, payload.(*api.PushPayload), evt) + return matchPushEvent(ctx, gitRepo, commit, payload.(*api.PushPayload), evt) case // issues webhook_module.HookEventIssues, @@ -315,7 +315,7 @@ func detectWorkflowMatch(gitRepo *git.Repository, commit *git.Commit, triggedEve 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, @@ -359,7 +359,7 @@ func detectWorkflowMatch(gitRepo *git.Repository, commit *git.Commit, triggedEve } } -func matchPushEvent(gitRepo *git.Repository, commit *git.Commit, pushPayload *api.PushPayload, evt *jobparser.Event) detectResult { +func matchPushEvent(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, pushPayload *api.PushPayload, evt *jobparser.Event) detectResult { // with no special filter parameters if len(evt.Acts()) == 0 { return detectMatched @@ -425,7 +425,7 @@ func matchPushEvent(gitRepo *git.Repository, commit *git.Commit, pushPayload *ap matchTimes++ break } - filesChanged, err := commit.GetFilesChangedSinceCommit(gitRepo, pushPayload.Before) + filesChanged, err := commit.GetFilesChangedSinceCommit(ctx, gitRepo, pushPayload.Before) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err) return detectNotApplicable @@ -442,7 +442,7 @@ func matchPushEvent(gitRepo *git.Repository, commit *git.Commit, pushPayload *ap matchTimes++ break } - filesChanged, err := commit.GetFilesChangedSinceCommit(gitRepo, pushPayload.Before) + filesChanged, err := commit.GetFilesChangedSinceCommit(ctx, gitRepo, pushPayload.Before) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", commit.ID.String(), err) return detectNotApplicable @@ -516,7 +516,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) detectResult { +func matchPullRequestEvent(ctx context.Context, gitRepo *git.Repository, commit *git.Commit, prPayload *api.PullRequestPayload, evt *jobparser.Event) detectResult { acts := evt.Acts() activityTypeMatched := false matchTimes := 0 @@ -560,7 +560,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 detectNotApplicable @@ -592,7 +592,7 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa matchTimes++ } case "paths": - filesChanged, err := headCommit.GetFilesChangedSinceCommit(gitRepo, prPayload.PullRequest.MergeBase) + filesChanged, err := headCommit.GetFilesChangedSinceCommit(ctx, gitRepo, prPayload.PullRequest.MergeBase) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", headCommit.ID.String(), err) return detectNotApplicable @@ -605,7 +605,7 @@ func matchPullRequestEvent(gitRepo *git.Repository, commit *git.Commit, prPayloa matchTimes++ } case "paths-ignore": - filesChanged, err := headCommit.GetFilesChangedSinceCommit(gitRepo, prPayload.PullRequest.MergeBase) + filesChanged, err := headCommit.GetFilesChangedSinceCommit(ctx, gitRepo, prPayload.PullRequest.MergeBase) if err != nil { log.Error("GetFilesChangedSinceCommit [commit_sha1: %s]: %v", headCommit.ID.String(), err) return detectNotApplicable diff --git a/modules/actions/workflows_test.go b/modules/actions/workflows_test.go index 4577e52a11d..190d7e15951 100644 --- a/modules/actions/workflows_test.go +++ b/modules/actions/workflows_test.go @@ -243,7 +243,7 @@ func TestDetectMatched(t *testing.T) { evts, err := GetEventsFromContent(fullWorkflowContent(tc.yamlOn)) assert.NoError(t, err) assert.Len(t, evts, 1) - assert.Equal(t, tc.expected, detectWorkflowMatch(nil, tc.commit, tc.triggedEvent, tc.payload, evts[0])) + assert.Equal(t, tc.expected, detectWorkflowMatch(t.Context(), nil, tc.commit, tc.triggedEvent, tc.payload, evts[0])) }) } } diff --git a/modules/git/attribute/batch.go b/modules/git/attribute/batch.go index 96d63a910f8..1e596077077 100644 --- a/modules/git/attribute/batch.go +++ b/modules/git/attribute/batch.go @@ -29,15 +29,15 @@ type BatchChecker struct { // 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 } diff --git a/modules/git/attribute/batch_test.go b/modules/git/attribute/batch_test.go index a71a73b3026..0b396d93bdf 100644 --- a/modules/git/attribute/batch_test.go +++ b/modules/git/attribute/batch_test.go @@ -118,7 +118,8 @@ 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) + ctx := t.Context() + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() @@ -126,7 +127,7 @@ 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(ctx, gitRepo, commitID, LinguistAttributes) assert.NoError(t, err) defer checker.Close() attributes, err := checker.CheckPath("i-am-a-python.p") @@ -143,11 +144,11 @@ 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") @@ -161,7 +162,7 @@ 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(ctx, gitRepo, commitID, LinguistAttributes) assert.NoError(t, err) defer checker.Close() diff --git a/modules/git/attribute/checker.go b/modules/git/attribute/checker.go index 0be610994c4..f4d3e23c9c8 100644 --- a/modules/git/attribute/checker.go +++ b/modules/git/attribute/checker.go @@ -14,7 +14,7 @@ import ( "gitea.dev/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 ca102143519..20329c44af0 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/blob.go b/modules/git/blob.go index eca9e37d95e..2f3e56529fe 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_gogit.go b/modules/git/blob_gogit.go index 4b96c692535..e67b6c2a39f 100644 --- a/modules/git/blob_gogit.go +++ b/modules/git/blob_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "io" "gitea.dev/modules/log" @@ -27,7 +28,7 @@ func (b *Blob) gogitEncodedObj() (plumbing.EncodedObject, error) { // 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(_ context.Context) (io.ReadCloser, error) { obj, err := b.gogitEncodedObj() if err != nil { return nil, err @@ -36,7 +37,7 @@ func (b *Blob) DataAsync() (io.ReadCloser, error) { } // Size returns the uncompressed size of the blob -func (b *Blob) Size() int64 { +func (b *Blob) Size(_ context.Context) int64 { obj, err := b.gogitEncodedObj() if err != nil { log.Error("Error getting gogit encoded object for blob %s(%s): %v", b.name, b.ID.String(), err) diff --git a/modules/git/blob_nogogit.go b/modules/git/blob_nogogit.go index 102faf2a5f0..4803a50efeb 100644 --- a/modules/git/blob_nogogit.go +++ b/modules/git/blob_nogogit.go @@ -6,6 +6,7 @@ package git import ( + "context" "io" "gitea.dev/modules/log" @@ -23,8 +24,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, retErr error) { - batch, cancel, err := b.repo.CatFileBatch(b.repo.Ctx) +func (b *Blob) DataAsync(ctx context.Context) (_ io.ReadCloser, retErr error) { + batch, cancel, err := b.repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -50,12 +51,12 @@ func (b *Blob) DataAsync() (_ io.ReadCloser, retErr 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 } - batch, cancel, err := b.repo.CatFileBatch(b.repo.Ctx) + batch, cancel, err := b.repo.CatFileBatch(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 4c86aa70ba7..17afd46ff1f 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/catfile_batch.go b/modules/git/catfile_batch.go index d13179f3ec7..ba2dc7a9e28 100644 --- a/modules/git/catfile_batch.go +++ b/modules/git/catfile_batch.go @@ -39,6 +39,7 @@ type CatFileBatch interface { type CatFileBatchCloser interface { CatFileBatch + Context() context.Context Close() } diff --git a/modules/git/catfile_batch_command.go b/modules/git/catfile_batch_command.go index 3cf7defa8ba..96d58334f8f 100644 --- a/modules/git/catfile_batch_command.go +++ b/modules/git/catfile_batch_command.go @@ -40,6 +40,10 @@ func (b *catFileBatchCommand) getBatch() *catFileBatchCommunicator { return b.batch } +func (b *catFileBatchCommand) Context() context.Context { + return b.ctx +} + func (b *catFileBatchCommand) QueryContent(obj string) (*CatFileObject, BufferedReader, error) { if strings.Contains(obj, "\n") { setting.PanicInDevOrTesting("invalid object name with newline: %q", obj) diff --git a/modules/git/catfile_batch_legacy.go b/modules/git/catfile_batch_legacy.go index 05c55f3008a..79f12a9f433 100644 --- a/modules/git/catfile_batch_legacy.go +++ b/modules/git/catfile_batch_legacy.go @@ -51,6 +51,10 @@ func (b *catFileBatchLegacy) getBatchCheck() *catFileBatchCommunicator { return b.batchCheck } +func (b *catFileBatchLegacy) Context() context.Context { + return b.ctx +} + func (b *catFileBatchLegacy) QueryContent(obj string) (*CatFileObject, BufferedReader, error) { if strings.Contains(obj, "\n") { setting.PanicInDevOrTesting("invalid object name with newline: %q", obj) diff --git a/modules/git/commit.go b/modules/git/commit.go index d43bd6800a4..3e46987aae8 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -46,12 +46,12 @@ func (c *Commit) ParentID(n int) (ObjectID, error) { } // Parent returns n-th parent (0-based index) of the commit. -func (c *Commit) Parent(gitRepo *Repository, n int) (*Commit, error) { +func (c *Commit) Parent(ctx context.Context, gitRepo *Repository, n int) (*Commit, error) { id, err := c.ParentID(n) if err != nil { return nil, err } - parent, err := gitRepo.getCommit(id) + parent, err := gitRepo.getCommit(ctx, id) if err != nil { return nil, err } @@ -65,11 +65,11 @@ func (c *Commit) ParentCount() int { } // GetCommitByPath return the commit of relative path object. -func (c *Commit) GetCommitByPath(gitRepo *Repository, relpath string) (*Commit, error) { +func (c *Commit) GetCommitByPath(ctx context.Context, gitRepo *Repository, relpath string) (*Commit, error) { if gitRepo.LastCommitCache != nil { - return gitRepo.LastCommitCache.GetCommitByPath(c.ID.String(), relpath) + return gitRepo.LastCommitCache.GetCommitByPath(ctx, c.ID.String(), relpath) } - return gitRepo.getCommitByPathWithID(c.ID, relpath) + return gitRepo.getCommitByPathWithID(ctx, c.ID, relpath) } func (c *Commit) Tree() *Tree { @@ -92,13 +92,13 @@ func (c *Commit) SubTree(ctx context.Context, gitRepo *Repository, relpath strin } // CommitsByRange returns the specific page commits before current revision, every page's number default by CommitsRangeSize -func (c *Commit) CommitsByRange(gitRepo *Repository, page, pageSize int, not, since, until string) ([]*Commit, error) { - return gitRepo.commitsByRangeWithTime(c.ID, page, pageSize, not, since, until) +func (c *Commit) CommitsByRange(ctx context.Context, gitRepo *Repository, page, pageSize int, not, since, until string) ([]*Commit, error) { + return gitRepo.commitsByRangeWithTime(ctx, c.ID, page, pageSize, not, since, until) } // CommitsBefore returns all the commits before current revision -func (c *Commit) CommitsBefore(gitRepo *Repository) ([]*Commit, error) { - return gitRepo.getCommitsBefore(c.ID) +func (c *Commit) CommitsBefore(ctx context.Context, gitRepo *Repository) ([]*Commit, error) { + return gitRepo.getCommitsBefore(ctx, c.ID) } // HasPreviousCommit returns true if a given commitHash is contained in commit's parents @@ -128,7 +128,7 @@ func (c *Commit) HasPreviousCommit(ctx context.Context, gitRepo *Repository, obj // IsForcePush returns true if a push from oldCommitHash to this is a force push func (c *Commit) IsForcePush(ctx context.Context, gitRepo *Repository, oldCommitID string) (bool, error) { - objectFormat, err := gitRepo.GetObjectFormat() + objectFormat, err := gitRepo.GetObjectFormat(ctx) if err != nil { return false, err } @@ -136,7 +136,7 @@ func (c *Commit) IsForcePush(ctx context.Context, gitRepo *Repository, oldCommit return false, nil } - oldCommit, err := gitRepo.GetCommit(oldCommitID) + oldCommit, err := gitRepo.GetCommit(ctx, oldCommitID) if err != nil { return false, err } @@ -145,13 +145,13 @@ func (c *Commit) IsForcePush(ctx context.Context, gitRepo *Repository, oldCommit } // CommitsBeforeLimit returns num commits before current revision -func (c *Commit) CommitsBeforeLimit(gitRepo *Repository, num int) ([]*Commit, error) { - return gitRepo.getCommitsBeforeLimit(c.ID, num) +func (c *Commit) CommitsBeforeLimit(ctx context.Context, gitRepo *Repository, num int) ([]*Commit, error) { + return gitRepo.getCommitsBeforeLimit(ctx, c.ID, num) } // CommitsBeforeUntil returns the commits in range "[cur, ref)" -func (c *Commit) CommitsBeforeUntil(gitRepo *Repository, ref RefName) ([]*Commit, error) { - return gitRepo.CommitsBetween(c.ID.RefName(), ref, -1) +func (c *Commit) CommitsBeforeUntil(ctx context.Context, gitRepo *Repository, ref RefName) ([]*Commit, error) { + return gitRepo.CommitsBetween(ctx, c.ID.RefName(), ref, -1) } // SearchCommitsOptions specify the parameters for SearchCommits @@ -194,19 +194,19 @@ func NewSearchCommitsOptions(searchString string, forAllRefs bool) SearchCommits } // SearchCommits returns the commits match the keyword before current revision -func (c *Commit) SearchCommits(gitRepo *Repository, opts SearchCommitsOptions) ([]*Commit, error) { - return gitRepo.searchCommits(c.ID, opts) +func (c *Commit) SearchCommits(ctx context.Context, gitRepo *Repository, opts SearchCommitsOptions) ([]*Commit, error) { + return gitRepo.searchCommits(ctx, c.ID, opts) } // GetFilesChangedSinceCommit get all changed file names between pastCommit to current revision -func (c *Commit) GetFilesChangedSinceCommit(gitRepo *Repository, pastCommit string) ([]string, error) { - return gitRepo.GetFilesChangedBetween(pastCommit, c.ID.String()) +func (c *Commit) GetFilesChangedSinceCommit(ctx context.Context, gitRepo *Repository, pastCommit string) ([]string, error) { + return gitRepo.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(gitRepo *Repository, filename, pastCommit string) (bool, error) { - return gitRepo.FileChangedBetweenCommits(filename, pastCommit, c.ID.String()) +func (c *Commit) FileChangedSinceCommit(ctx context.Context, gitRepo *Repository, filename, pastCommit string) (bool, error) { + return gitRepo.FileChangedBetweenCommits(ctx, filename, pastCommit, c.ID.String()) } // GetFileContent reads a file content as a string or returns false if this was not possible @@ -216,7 +216,7 @@ func (c *Commit) GetFileContent(ctx context.Context, gitRepo *Repository, filena return "", err } - r, err := entry.Blob(gitRepo).DataAsync() + r, err := entry.Blob(gitRepo).DataAsync(ctx) if err != nil { return "", err } diff --git a/modules/git/commit_info_gogit.go b/modules/git/commit_info_gogit.go index 6922cb92ff5..f5c01ad2ccc 100644 --- a/modules/git/commit_info_gogit.go +++ b/modules/git/commit_info_gogit.go @@ -29,7 +29,7 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, gitRepo var err error if gitRepo.LastCommitCache != nil { var unHitPaths []string - revs, unHitPaths, err = getLastCommitForPathsByCache(commit.ID.String(), treePath, entryPaths, gitRepo.LastCommitCache) + revs, unHitPaths, err = getLastCommitForPathsByCache(ctx, commit.ID.String(), treePath, entryPaths, gitRepo.LastCommitCache) if err != nil { return nil, nil, err } @@ -132,11 +132,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/commit_info_nogogit.go b/modules/git/commit_info_nogogit.go index 9141d993410..24753882733 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, gitRepo var revs map[string]*Commit if gitRepo.LastCommitCache != nil { var unHitPaths []string - revs, unHitPaths, err = getLastCommitForPathsByCache(commit.ID.String(), treePath, entryPaths, gitRepo.LastCommitCache) + revs, unHitPaths, err = getLastCommitForPathsByCache(ctx, commit.ID.String(), treePath, entryPaths, gitRepo.LastCommitCache) if err != nil { return nil, nil, err } @@ -83,11 +83,11 @@ func (tes Entries) GetCommitsInfo(ctx context.Context, repoLink string, gitRepo 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 } @@ -125,7 +125,7 @@ func GetLastCommitForPaths(ctx context.Context, gitRepo *Repository, commit *Com continue } - c, err := gitRepo.GetCommit(commitID) // Ensure the commit exists in the repository + c, err := gitRepo.GetCommit(ctx, commitID) // Ensure the commit exists in the repository if err != nil { return nil, err } diff --git a/modules/git/commit_info_nogogit_test.go b/modules/git/commit_info_nogogit_test.go index 278c7c1b37e..087011bbf65 100644 --- a/modules/git/commit_info_nogogit_test.go +++ b/modules/git/commit_info_nogogit_test.go @@ -18,11 +18,11 @@ import ( ) func TestEntries_GetCommitsInfo_ContextErr(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() - commit, err := repo.GetCommit("feaf4ba6bc635fec442f46ddd4512416ec43c2c2") + commit, err := repo.GetCommit(t.Context(), "feaf4ba6bc635fec442f46ddd4512416ec43c2c2") require.NoError(t, err) entries, err := commit.Tree().ListEntries(t.Context(), repo) require.NoError(t, err) diff --git a/modules/git/commit_info_test.go b/modules/git/commit_info_test.go index 97d27932b58..15b92316151 100644 --- a/modules/git/commit_info_test.go +++ b/modules/git/commit_info_test.go @@ -84,7 +84,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. @@ -132,7 +132,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() @@ -142,7 +142,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) } @@ -151,7 +151,7 @@ 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(t.Context(), bareRepo1, "file1.txt") require.NoError(t, err) diff --git a/modules/git/commit_sha256_test.go b/modules/git/commit_sha256_test.go index b4975aa4257..6d5d8ad91df 100644 --- a/modules/git/commit_sha256_test.go +++ b/modules/git/commit_sha256_test.go @@ -60,7 +60,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() @@ -103,14 +103,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") diff --git a/modules/git/commit_submodule.go b/modules/git/commit_submodule.go index d8103f46d4f..4936bf0f712 100644 --- a/modules/git/commit_submodule.go +++ b/modules/git/commit_submodule.go @@ -23,7 +23,7 @@ func (c *Commit) GetSubModules(ctx context.Context, gitRepo *Repository) (*Objec return nil, err } - rd, err := entry.Blob(gitRepo).DataAsync() + rd, err := entry.Blob(gitRepo).DataAsync(ctx) if err != nil { return nil, err } diff --git a/modules/git/commit_test.go b/modules/git/commit_test.go index 8ec641909b9..7b152ba0562 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -56,7 +56,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() @@ -120,7 +120,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() @@ -162,11 +162,11 @@ 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") @@ -187,14 +187,14 @@ func TestHasPreviousCommit(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 1077c102e70..fbe3988ac69 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -27,20 +27,20 @@ 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) (retErr error) { - cmd, err := getRepoRawDiffForFileCmd(repo.Ctx, repo, "", commitID, diffType, "") +func GetRawDiff(ctx context.Context, repo *Repository, commitID string, diffType RawDiffType, writer io.Writer) (retErr error) { + cmd, err := getRepoRawDiffForFileCmd(ctx, repo, "", commitID, diffType, "") if err != nil { return fmt.Errorf("getRepoRawDiffForFileCmd: %w", err) } - return cmd.WithStdoutCopy(writer).RunWithStderr(repo.Ctx) + return cmd.WithStdoutCopy(writer).RunWithStderr(ctx) } // GetFileDiffCutAroundLine cuts the old or new part of the diff of a file around a specific line number func GetFileDiffCutAroundLine( - repo *Repository, startCommit, endCommit, treePath string, + ctx context.Context, repo *Repository, startCommit, endCommit, treePath string, line int64, old bool, numbersOfLine int, ) (ret string, retErr error) { - cmd, err := getRepoRawDiffForFileCmd(repo.Ctx, repo, startCommit, endCommit, RawDiffNormal, treePath) + cmd, err := getRepoRawDiffForFileCmd(ctx, repo, startCommit, endCommit, RawDiffNormal, treePath) if err != nil { return "", fmt.Errorf("getRepoRawDiffForFileCmd: %w", err) } @@ -50,13 +50,13 @@ func GetFileDiffCutAroundLine( ret, err = CutDiffAroundLine(stdoutReader, line, old, numbersOfLine) return err }) - return ret, cmd.RunWithStderr(repo.Ctx) + return ret, cmd.RunWithStderr(ctx) } // getRepoRawDiffForFile returns an io.Reader for the diff results of file in given commit ID // and a "finish" function to wait for the git command and clean up resources after reading is done. -func getRepoRawDiffForFileCmd(_ context.Context, repo *Repository, startCommit, endCommit string, diffType RawDiffType, file string) (*gitcmd.Command, error) { - commit, err := repo.GetCommit(endCommit) +func getRepoRawDiffForFileCmd(ctx context.Context, repo *Repository, startCommit, endCommit string, diffType RawDiffType, file string) (*gitcmd.Command, error) { + commit, err := repo.GetCommit(ctx, endCommit) if err != nil { return nil, err } @@ -75,7 +75,7 @@ func getRepoRawDiffForFileCmd(_ context.Context, repo *Repository, startCommit, } else if commit.ParentCount() == 0 { cmd.AddArguments("show").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, err := commit.Parent(repo, 0) + c, err := commit.Parent(ctx, repo, 0) if err != nil { return nil, err } @@ -90,7 +90,7 @@ func getRepoRawDiffForFileCmd(_ context.Context, repo *Repository, startCommit, } else if commit.ParentCount() == 0 { cmd.AddArguments("format-patch", "--no-signature", "--stdout", "--root").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, err := commit.Parent(repo, 0) + c, err := commit.Parent(ctx, repo, 0) if err != nil { return nil, err } @@ -292,9 +292,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 } @@ -323,7 +323,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 b87ac4bea73..394e64e08e8 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() @@ -74,7 +74,7 @@ func TestGrepSearch(t *testing.T) { assert.NoError(t, err) assert.Empty(t, res) - res, err = GrepSearch(t.Context(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{}) + res, err = GrepSearch(t.Context(), &Repository{RepositoryBase: RepositoryBase{Path: "no-such-git-repo"}}, "no-such-content", GrepOptions{}) assert.Error(t, err) assert.Empty(t, res) } diff --git a/modules/git/languagestats/language_stats_gogit.go b/modules/git/languagestats/language_stats_gogit.go index d8668a43a85..5ddf9096fb5 100644 --- a/modules/git/languagestats/language_stats_gogit.go +++ b/modules/git/languagestats/language_stats_gogit.go @@ -22,7 +22,7 @@ import ( ) // GetLanguageStats calculates language stats for git repository at specified commit -func GetLanguageStats(_ context.Context, 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 @@ -43,7 +43,7 @@ func GetLanguageStats(_ context.Context, repo *git_module.Repository, commitID s 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 } diff --git a/modules/git/languagestats/language_stats_nogogit.go b/modules/git/languagestats/language_stats_nogogit.go index 1467ee9b9ec..4acff61f415 100644 --- a/modules/git/languagestats/language_stats_nogogit.go +++ b/modules/git/languagestats/language_stats_nogogit.go @@ -58,7 +58,7 @@ func GetLanguageStats(ctx context.Context, repo *git.Repository, commitID 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 } @@ -78,8 +78,6 @@ func GetLanguageStats(ctx context.Context, repo *git.Repository, commitID string for _, f := range entries { select { - case <-repo.Ctx.Done(): - return sizes, repo.Ctx.Err() case <-ctx.Done(): return sizes, ctx.Err() default: diff --git a/modules/git/languagestats/language_stats_test.go b/modules/git/languagestats/language_stats_test.go index 9776cef500f..306306499f5 100644 --- a/modules/git/languagestats/language_stats_test.go +++ b/modules/git/languagestats/language_stats_test.go @@ -18,7 +18,7 @@ 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() diff --git a/modules/git/last_commit_cache.go b/modules/git/last_commit_cache.go index a7e78ff8b3c..2de40cfd0a9 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 //nolint:nilnil // return nil when cache is not available } @@ -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/notes.go b/modules/git/notes.go index 3b7fadccd48..95bdeac8aa7 100644 --- a/modules/git/notes.go +++ b/modules/git/notes.go @@ -25,7 +25,7 @@ type Note struct { // 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 @@ -62,7 +62,7 @@ func GetNote(ctx context.Context, repo *Repository, commitID string, note *Note) } blob := entry.Blob(repo) - 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 5abb68b1023..37817c6c7f4 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_gogit.go b/modules/git/pipeline/lfs_gogit.go index c9685c053d9..add632f6942 100644 --- a/modules/git/pipeline/lfs_gogit.go +++ b/modules/git/pipeline/lfs_gogit.go @@ -6,6 +6,7 @@ package pipeline import ( + "context" "fmt" "io" "sort" @@ -19,7 +20,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) @@ -80,6 +81,6 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err } sort.Sort(lfsResultSlice(results)) - err = fillResultNameRev(repo.Ctx, repo.Path, results) + err = fillResultNameRev(ctx, repo.Path, results) return results, err } diff --git a/modules/git/pipeline/lfs_nogogit.go b/modules/git/pipeline/lfs_nogogit.go index d4862f070d2..656c38e5a6b 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" @@ -16,24 +17,24 @@ import ( ) // FindLFSFile finds commits that contain a provided pointer file hash -func FindLFSFile(repo *git.Repository, objectID git.ObjectID) (results []*LFSResult, _ error) { +func FindLFSFile(ctx context.Context, repo *git.Repository, objectID git.ObjectID) (results []*LFSResult, _ error) { cmd := gitcmd.NewCommand("rev-list", "--all") revListReader, revListReaderClose := cmd.MakeStdoutPipe() defer revListReaderClose() err := cmd.WithDir(repo.Path). WithPipelineFunc(func(context gitcmd.Context) (err error) { - results, err = findLFSFileFunc(repo, objectID, revListReader) + results, err = findLFSFileFunc(ctx, repo, objectID, revListReader) return err - }).RunWithStderr(repo.Ctx) + }).RunWithStderr(ctx) return results, err } -func findLFSFileFunc(repo *git.Repository, objectID git.ObjectID, revListReader io.Reader) ([]*LFSResult, error) { +func findLFSFileFunc(ctx context.Context, repo *git.Repository, objectID git.ObjectID, revListReader io.Reader) ([]*LFSResult, error) { resultsMap := map[string]*LFSResult{} results := make([]*LFSResult, 0) // 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 - batch, cancel, err := repo.CatFileBatch(repo.Ctx) + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -145,6 +146,6 @@ func findLFSFileFunc(repo *git.Repository, objectID git.ObjectID, revListReader } sort.Sort(lfsResultSlice(results)) - err = fillResultNameRev(repo.Ctx, repo.Path, results) + err = fillResultNameRev(ctx, repo.Path, results) return results, err } diff --git a/modules/git/pipeline/lfs_test.go b/modules/git/pipeline/lfs_test.go index 97cdbea5ca4..b06bbb5f0a2 100644 --- a/modules/git/pipeline/lfs_test.go +++ b/modules/git/pipeline/lfs_test.go @@ -15,13 +15,13 @@ import ( func TestFindLFSFile(t *testing.T) { repoPath := "../../../tests/gitea-repositories-meta/user2/lfs.git" - gitRepo, err := git.OpenRepository(t.Context(), repoPath) + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() objectID := git.MustIDFromString("2b6c6c4eaefa24b22f2092c3d54b263ff26feb58") - stats, err := FindLFSFile(gitRepo, objectID) + stats, err := FindLFSFile(t.Context(), gitRepo, objectID) require.NoError(t, err) tm, err := time.Parse(time.RFC3339, "2022-12-21T17:56:42-05:00") diff --git a/modules/git/ref.go b/modules/git/ref.go index ba69cf87ff3..ec6e237eb2d 100644 --- a/modules/git/ref.go +++ b/modules/git/ref.go @@ -4,6 +4,7 @@ package git import ( + "context" "regexp" "strings" @@ -50,8 +51,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 289033332bf..7760a804472 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -19,6 +19,23 @@ import ( "gitea.dev/modules/proxy" ) +type RepositoryFacade interface { + RelativePath() string +} + +type RepositoryBase struct { + Path string + + LastCommitCache *LastCommitCache + + tagCache *ObjectCache[*Tag] + objectFormatCache ObjectFormat +} + +func prepareRepositoryBase(repoPath string) RepositoryBase { + return RepositoryBase{Path: repoPath, tagCache: newObjectCache[*Tag]()} +} + const prettyLogFormat = `--pretty=format:%H` func (repo *Repository) ShowPrettyFormatLogToList(ctx context.Context, revisionRange string) ([]*Commit, error) { @@ -29,10 +46,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 @@ -41,7 +58,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 } @@ -81,12 +98,12 @@ 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) { stdout, _, err := gitcmd.NewCommand(). AddOptionFormat("--git-dir=%s", repo.Path). AddArguments("rev-list", "-n", "1", "--all"). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { if (gitcmd.IsErrorExitCode(err, 1) && err.Stderr() == "") || gitcmd.IsErrorExitCode(err, 129) { // git 2.11 exits with 129 if the repo is empty diff --git a/modules/git/repo_base_gogit.go b/modules/git/repo_base_gogit.go index 83f12f3f9e7..878a8b3b6fc 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 "gitea.dev/modules/log" @@ -24,22 +23,14 @@ import ( const isGogit = true -// Repository represents a Git repository. type Repository struct { - Path string - - tagCache *ObjectCache[*Tag] + RepositoryBase gogitRepo *gogit.Repository gogitStorage *filesystem.Storage - - 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 @@ -74,14 +65,13 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { return nil, err } - return &Repository{ - Path: repoPath, - gogitRepo: gogitRepo, - gogitStorage: storage, - tagCache: newObjectCache[*Tag](), - Ctx: ctx, - objectFormat: ParseGogitHash(plumbing.ZeroHash).Type(), - }, nil + repo := &Repository{ + RepositoryBase: prepareRepositoryBase(repoPath), + gogitRepo: gogitRepo, + gogitStorage: storage, + } + repo.objectFormatCache = ParseGogitHash(plumbing.ZeroHash).Type() + return repo, nil } // Close this repository, in particular close the underlying gogitStorage if this is not nil diff --git a/modules/git/repo_base_nogogit.go b/modules/git/repo_base_nogogit.go index 2206849544e..c07fbf4d319 100644 --- a/modules/git/repo_base_nogogit.go +++ b/modules/git/repo_base_nogogit.go @@ -12,29 +12,21 @@ import ( "sync" "gitea.dev/modules/log" + "gitea.dev/modules/setting" "gitea.dev/modules/util" ) const isGogit = false -// Repository represents a Git repository. type Repository struct { - Path string - - tagCache *ObjectCache[*Tag] + RepositoryBase mu sync.Mutex catFileBatchCloser CatFileBatchCloser catFileBatchInUse bool - - 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 @@ -46,12 +38,7 @@ func OpenRepository(ctx context.Context, repoPath string) (*Repository, error) { if !exist { return nil, util.NewNotExistErrorf("no such file or directory") } - - return &Repository{ - Path: repoPath, - tagCache: newObjectCache[*Tag](), - Ctx: ctx, - }, nil + return &Repository{RepositoryBase: prepareRepositoryBase(repoPath)}, nil } // CatFileBatch obtains a "batch object provider" for this repository. @@ -60,6 +47,14 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (_ CatFileBatch, close repo.mu.Lock() defer repo.mu.Unlock() + if repo.catFileBatchCloser != nil && !repo.catFileBatchInUse { + if ctx != repo.catFileBatchCloser.Context() { + repo.catFileBatchCloser.Close() + repo.catFileBatchCloser = nil + repo.catFileBatchInUse = false + } + } + if repo.catFileBatchCloser == nil { repo.catFileBatchCloser, err = NewBatch(ctx, repo.Path) if err != nil { @@ -87,6 +82,7 @@ func (repo *Repository) CatFileBatch(ctx context.Context) (_ CatFileBatch, close func (repo *Repository) Close() error { if repo == nil { + setting.PanicInDevOrTesting("don't close a nil repository") return nil } repo.mu.Lock() diff --git a/modules/git/repo_base_nogogit_test.go b/modules/git/repo_base_nogogit_test.go index a12bbb73c20..3c183108d28 100644 --- a/modules/git/repo_base_nogogit_test.go +++ b/modules/git/repo_base_nogogit_test.go @@ -14,7 +14,7 @@ import ( func TestRepoCatFileBatch(t *testing.T) { t.Run("MissingRepoAndClose", func(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) repo.Path = "/no-such" // when the repo is missing (it usually occurs during testing because the fixtures are synced frequently) _, _, err = repo.CatFileBatch(t.Context()) diff --git a/modules/git/repo_blob_test.go b/modules/git/repo_blob_test.go index f07b31d236f..4af3de71436 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 aef09a0927d..a0a9025f1aa 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -5,6 +5,8 @@ package git import ( + "context" + "gitea.dev/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_gogit.go b/modules/git/repo_branch_gogit.go index 77aecb21ebd..a791c72b181 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" @@ -19,7 +20,7 @@ import ( // 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. // 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(_ 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(_ 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(_ 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(_ context.Context, skip, limit int) ([]string, int, error) { type BranchData struct { name string committerDate int64 @@ -100,7 +101,7 @@ func (repo *Repository) GetBranchNames(skip, limit int) ([]string, int, error) { } // WalkReferences walks all the references from the repository -func (repo *Repository) WalkReferences(arg ObjectType, skip, limit int, walkfn func(sha1, refname string) error) (int, error) { +func (repo *Repository) WalkReferences(ctx context.Context, arg ObjectType, skip, limit int, walkfn func(sha1, refname string) error) (int, error) { i := 0 var iter storer.ReferenceIter var err error @@ -130,13 +131,13 @@ func (repo *Repository) WalkReferences(arg ObjectType, skip, limit int, walkfn f if limit != 0 && i >= skip+limit { return storer.ErrStop } - return nil + return ctx.Err() }) return i, err } // 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 { @@ -146,7 +147,7 @@ func (repo *Repository) GetRefsBySha(sha, prefix string) ([]string, error) { if ref.Hash().String() == sha && strings.HasPrefix(string(ref.Name()), prefix) { revList = append(revList, string(ref.Name())) } - return nil + return ctx.Err() }) return revList, err } diff --git a/modules/git/repo_branch_nogogit.go b/modules/git/repo_branch_nogogit.go index b43b622d050..47f320d800d 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. // FIXME: this function doesn't seem right, it is only used by GarbageCollectLFSMetaObjectsForRepo -func (repo *Repository) IsObjectExist(name string) bool { +func (repo *Repository) IsObjectExist(ctx context.Context, name string) bool { if name == "" { return false } - batch, cancel, err := repo.CatFileBatch(repo.Ctx) + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { log.Debug("Error opening CatFileBatch %v", err) return false @@ -38,12 +38,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 } - batch, cancel, err := repo.CatFileBatch(repo.Ctx) + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { log.Error("Error opening CatFileBatch %v", err) return false @@ -54,23 +54,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: @@ -79,7 +79,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 @@ -172,9 +172,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 5d586954db7..8282a00e877 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,48 @@ 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")) + ctx := t.Context() + repo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) require.NoError(t, err) defer repo.Close() @@ -143,13 +144,14 @@ 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(ctx, tt.arg)) }) } } func TestRepository_IsReferenceExist(t *testing.T) { - repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "repo1_bare")) + ctx := t.Context() + repo, err := OpenRepository(filepath.Join(testReposDir, "repo1_bare")) require.NoError(t, err) defer repo.Close() @@ -195,7 +197,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(ctx, tt.arg)) }) } } diff --git a/modules/git/repo_commit.go b/modules/git/repo_commit.go index 1a93504d97b..e6d4d23bc54 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -6,6 +6,7 @@ package git import ( "bytes" + "context" "io" "strconv" "strings" @@ -15,36 +16,36 @@ 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 a commit object of by the git ref. -func (repo *Repository) GetCommit(ref string) (*Commit, error) { - id, err := repo.ConvertToGitID(ref) +func (repo *Repository) GetCommit(ctx context.Context, ref string) (*Commit, error) { + id, err := repo.ConvertToGitID(ctx, ref) 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) { - return repo.GetCommit(RefNameFromBranch(name).String()) +func (repo *Repository) GetBranchCommit(ctx context.Context, name string) (*Commit, error) { + return repo.GetCommit(ctx, RefNameFromBranch(name).String()) } // GetTagCommit get the commit of the specific tag via name -func (repo *Repository) GetTagCommit(name string) (*Commit, error) { - return repo.GetCommit(RefNameFromTag(name).String()) +func (repo *Repository) GetTagCommit(ctx context.Context, name string) (*Commit, error) { + return repo.GetCommit(ctx, RefNameFromTag(name).String()) } -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 strings.HasPrefix(relpath, ":") { relpath = `\` + relpath @@ -54,7 +55,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 } @@ -64,20 +65,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 } @@ -88,7 +89,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). @@ -105,15 +106,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 @@ -159,7 +160,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 } @@ -180,7 +181,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 } @@ -189,17 +190,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 } @@ -219,7 +220,7 @@ type CommitsByFileAndRangeOptions struct { } // CommitsByFileAndRange return the commits according revision file and the page -func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) (commits []*Commit, hasMore bool, _ error) { +func (repo *Repository) CommitsByFileAndRange(ctx context.Context, opts CommitsByFileAndRangeOptions) (commits []*Commit, hasMore bool, _ error) { limit := setting.Git.CommitsRangeSize gitCmd := gitcmd.NewCommand("--no-pager", "log"). AddArguments("--pretty=tformat:%H"). @@ -244,7 +245,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) defer stdoutReaderClose() err := gitCmd.WithDir(repo.Path). WithPipelineFunc(func(context gitcmd.Context) error { - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return err } @@ -263,14 +264,14 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) if err != nil { return err } - commit, err := repo.getCommit(objectID) + commit, err := repo.getCommit(ctx, objectID) if err != nil { return err } commits = append(commits, commit) } }). - RunWithStderr(repo.Ctx) + RunWithStderr(ctx) hasMore = len(commits) > limit if hasMore { @@ -281,7 +282,7 @@ func (repo *Repository) CommitsByFileAndRange(opts CommitsByFileAndRangeOptions) // CommitsBetween returns a list that contains commits between [after, before). After is the first item in the slice. // If "before" and "after" are not related, it returns the all commits for the "after" commit. -func (repo *Repository) CommitsBetween(afterRef, beforeRef RefName, limit int, optSkip ...int) ([]*Commit, error) { +func (repo *Repository) CommitsBetween(ctx context.Context, afterRef, beforeRef RefName, limit int, optSkip ...int) ([]*Commit, error) { gitCmd := func() *gitcmd.Command { cmd := gitcmd.NewCommand("rev-list").WithDir(repo.Path) if limit >= 0 { @@ -295,42 +296,42 @@ func (repo *Repository) CommitsBetween(afterRef, beforeRef RefName, limit int, o var stdout []byte var err error if beforeRef == "" { - stdout, _, err = gitCmd().AddDynamicArguments(afterRef.String()).RunStdBytes(repo.Ctx) + stdout, _, err = gitCmd().AddDynamicArguments(afterRef.String()).RunStdBytes(ctx) } else { - stdout, _, err = gitCmd().AddDynamicArguments(beforeRef.String() + ".." + afterRef.String()).RunStdBytes(repo.Ctx) + stdout, _, err = gitCmd().AddDynamicArguments(beforeRef.String() + ".." + afterRef.String()).RunStdBytes(ctx) if gitcmd.IsStderr(err, gitcmd.StderrNoMergeBase) { // future versions of git >= 2.28 are likely to return an error if before and last have become unrelated. // if the beforeRef and afterRef are not related (no merge base), just get all commits pushed by afterRef - stdout, _, err = gitCmd().AddDynamicArguments(afterRef.String()).RunStdBytes(repo.Ctx) + stdout, _, err = gitCmd().AddDynamicArguments(afterRef.String()).RunStdBytes(ctx) } } if err != nil { return nil, err } - return repo.parsePrettyFormatLogToList(bytes.TrimSpace(stdout)) + return repo.parsePrettyFormatLogToList(ctx, bytes.TrimSpace(stdout)) } // 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(nil, commit.ID.String(), 2) + branches, err := repo.getBranches(ctx, nil, commit.ID.String(), 2) if err != nil { return nil, err } @@ -345,22 +346,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) { stdout, _, err := gitcmd.NewCommand("for-each-ref", "--format=%(refname:strip=2)"). AddOptionFormat("--count=%d", limit). AddOptionValues("--contains", commitID). AddArguments(BranchPrefix). WithEnv(env). WithDir(repo.Path). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } @@ -368,11 +369,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) } @@ -382,11 +383,11 @@ 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 } @@ -394,13 +395,13 @@ func (repo *Repository) IsCommitInBranch(commitID, branch string) (r bool, err e } // 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 } @@ -411,7 +412,7 @@ func (repo *Repository) GetCommitBranchStart(env []string, branch, endCommitID s // and we think this commit is the divergence point for part := range parts { commitID := string(part) - branches, err := repo.getBranches(env, commitID, 2) + branches, err := repo.getBranches(ctx, env, commitID, 2) if err != nil { return "", err } diff --git a/modules/git/repo_commit_gogit.go b/modules/git/repo_commit_gogit.go index b1f0a20d5ad..551b668165a 100644 --- a/modules/git/repo_commit_gogit.go +++ b/modules/git/repo_commit_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "strings" "gitea.dev/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(_ context.Context, name string) (string, error) { if plumbing.IsHash(name) { return name, nil } @@ -42,8 +43,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 } @@ -57,7 +58,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") || @@ -70,7 +71,7 @@ func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) { return NewIDFromString(actualCommitID) } -func (repo *Repository) getCommit(id ObjectID) (*Commit, error) { +func (repo *Repository) getCommit(_ context.Context, id ObjectID) (*Commit, error) { var tagObject *object.Tag commitID := plumbing.Hash(id.RawValue()) diff --git a/modules/git/repo_commit_nogogit.go b/modules/git/repo_commit_nogogit.go index 425def5234c..50eaabfe229 100644 --- a/modules/git/repo_commit_nogogit.go +++ b/modules/git/repo_commit_nogogit.go @@ -6,6 +6,7 @@ package git import ( + "context" "errors" "io" "strings" @@ -15,11 +16,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, ""} @@ -35,8 +36,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) { - batch, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) GetRefCommitID(ctx context.Context, name string) (string, error) { + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return "", err } @@ -50,8 +51,8 @@ func (repo *Repository) GetRefCommitID(name string) (string, error) { return info.ID, nil } -func (repo *Repository) getCommit(id ObjectID) (*Commit, error) { - batch, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) getCommit(ctx context.Context, id ObjectID) (*Commit, error) { + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -110,8 +111,8 @@ func (repo *Repository) getCommitWithBatch(batch CatFileBatch, id ObjectID) (*Co } // ConvertToGitID returns a git object ID from the git ref, it doesn't guarantee the returned ID really exists -func (repo *Repository) ConvertToGitID(ref string) (ObjectID, error) { - objectFormat, err := repo.GetObjectFormat() +func (repo *Repository) ConvertToGitID(ctx context.Context, ref string) (ObjectID, error) { + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -122,7 +123,7 @@ func (repo *Repository) ConvertToGitID(ref string) (ObjectID, error) { } } - batch, cancel, err := repo.CatFileBatch(repo.Ctx) + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_commit_test.go b/modules/git/repo_commit_test.go index c57dec95030..3fcfea6b0ea 100644 --- a/modules/git/repo_commit_test.go +++ b/modules/git/repo_commit_test.go @@ -18,7 +18,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() @@ -35,9 +35,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(nil, commit.ID.String(), 2) + branches, err := bareRepo1.getBranches(t.Context(), nil, commit.ID.String(), 2) assert.NoError(t, err) assert.Equal(t, testCase.ExpectedBranches, branches) } @@ -45,12 +45,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) @@ -60,11 +60,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)) @@ -72,22 +72,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_CommitsBetween(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() @@ -101,7 +101,7 @@ func TestRepository_CommitsBetween(t *testing.T) { {"78a445db1eac62fe15e624e1137965969addf344", "a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca", 1}, // com2 -> com2_new } for i, c := range cases { - commits, err := bareRepo1.CommitsBetween(c.NewID, c.OldID, -1) + commits, err := bareRepo1.CommitsBetween(t.Context(), c.NewID, c.OldID, -1) assert.NoError(t, err) assert.Len(t, commits, c.ExpectedCommits, "case %d", i) } @@ -109,7 +109,7 @@ func TestRepository_CommitsBetween(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() @@ -125,7 +125,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) } @@ -136,17 +136,17 @@ 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, hasMore, err := bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 1}) + commits, hasMore, err := bareRepo1.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 1}) require.NoError(t, err) assert.True(t, hasMore) assert.Len(t, commits, 2) - commits, hasMore, err = bareRepo1.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 2}) + commits, hasMore, err = bareRepo1.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "foo", Page: 2}) require.NoError(t, err) assert.Len(t, commits, 1) assert.False(t, hasMore) @@ -179,14 +179,14 @@ M 100644 :1 b.txt `))).RunStdString(t.Context()) require.NoError(t, runErr) - repoFollowRename, err := OpenRepository(t.Context(), repoFollowRenameDir) + repoFollowRename, err := OpenRepository(repoFollowRenameDir) require.NoError(t, err) defer repoFollowRename.Close() - commits, _, err = repoFollowRename.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "b.txt", Page: 1}) + commits, _, err = repoFollowRename.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "b.txt", Page: 1}) require.NoError(t, err) assert.Len(t, commits, 1) - commits, _, err = repoFollowRename.CommitsByFileAndRange(CommitsByFileAndRangeOptions{Revision: "master", File: "b.txt", Page: 1, FollowRename: true}) + commits, _, err = repoFollowRename.CommitsByFileAndRange(t.Context(), CommitsByFileAndRangeOptions{Revision: "master", File: "b.txt", Page: 1, FollowRename: true}) require.NoError(t, err) assert.Len(t, commits, 2) } diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 1754a19b4bd..6c268b52a75 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" @@ -31,7 +32,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{} @@ -45,7 +46,7 @@ func (repo *Repository) GetDiffNumChangedFiles(base, head string, directComparis AddArguments("--"). WithDir(repo.Path). WithStdoutCopy(w). - RunWithStderr(repo.Ctx); err != nil { + RunWithStderr(ctx); err != nil { if gitcmd.IsStderr(err, gitcmd.StderrNoMergeBase) { // git >= 2.28 now returns an error if base and head have become unrelated. // it doesn't make sense to count the changed files in this case because UI won't display such diff @@ -59,35 +60,35 @@ 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 { return gitcmd.NewCommand("diff", "-p").AddDynamicArguments(compareArg). WithDir(repo.Path). WithStdoutCopy(w). - 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). WithStdoutCopy(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 { return gitcmd.NewCommand("format-patch", "--binary", "--stdout").AddDynamicArguments(compareArg). WithDir(repo.Path). WithStdoutCopy(w). - 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 } @@ -97,7 +98,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 21c1e2a4326..2d432956b1e 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_index.go b/modules/git/repo_index.go index 96958e384e4..78c27514f54 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 } @@ -111,7 +111,7 @@ func (repo *Repository) RemoveFilesFromIndex(filenames ...string) error { return cmd. WithDir(repo.Path). WithStdinBytes(input.Bytes()). - RunWithStderr(repo.Ctx) + RunWithStderr(ctx) } type IndexObjectInfo struct { @@ -121,7 +121,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") input := new(bytes.Buffer) for _, object := range objects { @@ -131,17 +131,17 @@ func (repo *Repository) AddObjectsToIndex(objects ...IndexObjectInfo) error { return cmd. WithDir(repo.Path). WithStdinBytes(input.Bytes()). - RunWithStderr(repo.Ctx) + RunWithStderr(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 5398973ef60..c139d2a69e3 100644 --- a/modules/git/repo_object.go +++ b/modules/git/repo_object.go @@ -5,6 +5,7 @@ package git import ( + "context" "strings" "gitea.dev/modules/git/gitcmd" @@ -31,12 +32,12 @@ func (o ObjectType) Bytes() []byte { return []byte(o) } -func (repo *Repository) GetObjectFormat() (ObjectFormat, error) { - if repo != nil && repo.objectFormat != nil { - return repo.objectFormat, nil +func (repo *Repository) GetObjectFormat(ctx context.Context) (ObjectFormat, error) { + if repo.objectFormatCache != nil { + return repo.objectFormatCache, nil } - str, err := repo.hashObjectBytes(nil, false) + str, err := repo.hashObjectBytes(ctx, nil, false) if err != nil { return nil, err } @@ -45,21 +46,21 @@ func (repo *Repository) GetObjectFormat() (ObjectFormat, error) { return nil, err } - repo.objectFormat = hash.Type() + repo.objectFormatCache = hash.Type() - return repo.objectFormat, nil + return repo.objectFormatCache, nil } // HashObjectBytes returns hash for the content -func (repo *Repository) HashObjectBytes(buf []byte) (ObjectID, error) { - idStr, err := repo.hashObjectBytes(buf, true) +func (repo *Repository) HashObjectBytes(ctx context.Context, buf []byte) (ObjectID, error) { + idStr, err := repo.hashObjectBytes(ctx, buf, true) if err != nil { return nil, err } return NewIDFromString(idStr) } -func (repo *Repository) hashObjectBytes(buf []byte, save bool) (string, error) { +func (repo *Repository) hashObjectBytes(ctx context.Context, buf []byte, save bool) (string, error) { var cmd *gitcmd.Command if save { cmd = gitcmd.NewCommand("hash-object", "-w", "--stdin") @@ -69,7 +70,7 @@ func (repo *Repository) hashObjectBytes(buf []byte, save bool) (string, error) { stdout, _, err := cmd. WithDir(repo.Path). WithStdinBytes(buf). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return "", err } diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go index 11235c71b15..974dcf1829d 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -13,8 +13,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 @@ -72,19 +72,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() // make sure the "shortName" is either partial commit ID, or it is HEAD diff --git a/modules/git/repo_ref_gogit.go b/modules/git/repo_ref_gogit.go index fc43ce5545d..2c2407e980b 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_ref_nogogit.go b/modules/git/repo_ref_nogogit.go index 918581e06ab..d3fcb057688 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) { refs := make([]*Reference, 0) cmd := gitcmd.NewCommand("for-each-ref") stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe() @@ -70,6 +71,6 @@ func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) { } } return nil - }).RunWithStderr(repo.Ctx) + }).RunWithStderr(ctx) return refs, err } diff --git a/modules/git/repo_ref_test.go b/modules/git/repo_ref_test.go index 29c255098f1..02c30605f92 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 716bf0ba05b..8190b454a2b 100644 --- a/modules/git/repo_stats.go +++ b/modules/git/repo_stats.go @@ -5,6 +5,7 @@ package git import ( "bufio" + "context" "fmt" "sort" "strconv" @@ -34,7 +35,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) @@ -42,7 +43,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 } @@ -131,7 +132,7 @@ func (repo *Repository) GetCodeActivityStats(fromTime time.Time, branch string) stats.Authors = a return nil }). - RunWithStderr(repo.Ctx) + RunWithStderr(ctx) if err != nil { return nil, fmt.Errorf("GetCodeActivityStats: %w", err) } diff --git a/modules/git/repo_stats_test.go b/modules/git/repo_stats_test.go index 538283111bd..176bd7405b6 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 0a424016115..ab404ce390f 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -5,6 +5,7 @@ package git import ( + "context" "fmt" "strings" @@ -17,28 +18,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 } @@ -60,8 +61,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 } @@ -76,8 +77,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 } @@ -87,7 +88,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 } @@ -95,13 +96,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 } @@ -109,7 +110,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") @@ -147,7 +148,7 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) { } return nil }). - RunWithStderr(repo.Ctx) + RunWithStderr(ctx) return tags, tagsTotal, err } @@ -194,14 +195,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 @@ -209,12 +210,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_gogit.go b/modules/git/repo_tag_gogit.go index bcb58266232..4e256189c78 100644 --- a/modules/git/repo_tag_gogit.go +++ b/modules/git/repo_tag_gogit.go @@ -7,19 +7,21 @@ package git import ( + "context" + "gitea.dev/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(_ 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(_ 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_tag_nogogit.go b/modules/git/repo_tag_nogogit.go index 184e125a8f2..ecb5bc8f5f3 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) { - batch, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) GetTagType(ctx context.Context, id ObjectID) (string, error) { + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return "", err } @@ -39,7 +40,7 @@ func (repo *Repository) GetTagType(id ObjectID) (string, error) { return info.Type, 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) @@ -48,13 +49,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 @@ -66,7 +67,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 } @@ -84,7 +85,7 @@ func (repo *Repository) getTag(tagID ObjectID, name string) (*Tag, error) { } // The tag is an annotated tag with a message. - batch, cancel, err := repo.CatFileBatch(repo.Ctx) + batch, 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 50c6ab50361..4a92631018a 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 be0a21a83db..9e65e3932e4 100644 --- a/modules/git/repo_test.go +++ b/modules/git/repo_test.go @@ -15,10 +15,10 @@ import ( 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 aa750d3e1ec..b2c251a01a3 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 @@ -61,7 +62,7 @@ func (repo *Repository) CommitTree(author, committer *Signature, tree *Tree, opt stdout, _, err := cmd.WithEnv(env). WithDir(repo.Path). WithStdinBytes(messageBytes.Bytes()). - RunStdString(repo.Ctx) + RunStdString(ctx) if err != nil { return nil, err } diff --git a/modules/git/repo_tree_gogit.go b/modules/git/repo_tree_gogit.go index 4f9a07d32f8..848c2fd14b1 100644 --- a/modules/git/repo_tree_gogit.go +++ b/modules/git/repo_tree_gogit.go @@ -7,6 +7,7 @@ package git import ( + "context" "errors" "gitea.dev/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(_ 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 } @@ -57,7 +58,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/repo_tree_nogogit.go b/modules/git/repo_tree_nogogit.go index 2527897bd34..4d90bccdbe8 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) { - batch, cancel, err := repo.CatFileBatch(repo.Ctx) +func (repo *Repository) getTree(ctx context.Context, id ObjectID) (*Tree, error) { + batch, cancel, err := repo.CatFileBatch(ctx) if err != nil { return nil, err } @@ -50,7 +51,7 @@ func (repo *Repository) getTree(id ObjectID) (*Tree, error) { return tree, nil case "tree": tree := newTree(id) - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(ctx) if err != nil { return nil, err } @@ -71,13 +72,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 } @@ -90,5 +91,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 f19c6dbc023..b22e20a5ac1 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -39,7 +39,7 @@ func (t *Tree) SubTree(ctx context.Context, gitRepo *Repository, rpath string) ( return nil, err } - g, err = gitRepo.getTree(te.ID) + g, err = gitRepo.getTree(ctx, te.ID) if err != nil { return nil, err } @@ -49,11 +49,11 @@ func (t *Tree) SubTree(ctx context.Context, gitRepo *Repository, rpath string) ( } // 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 +66,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_entry.go b/modules/git/tree_entry.go index 690e1965660..5d1c0e3d774 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -86,11 +86,11 @@ func EntryFollowLink(ctx context.Context, gitRepo *Repository, commit *Commit, f // 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(gitRepo).Size() > maxSymlinkSize { + if te.Blob(gitRepo).Size(ctx) > maxSymlinkSize { return nil, util.ErrorWrap(util.ErrUnprocessableContent, "%q content exceeds symlink limit", fullPath) } - link, err := te.Blob(gitRepo).GetBlobContent(maxSymlinkSize) + link, err := te.Blob(gitRepo).GetBlobContent(ctx, maxSymlinkSize) if err != nil { return nil, err } @@ -126,8 +126,8 @@ func EntryFollowLinks(ctx context.Context, gitRepo *Repository, commit *Commit, return res, nil } -func (te *TreeEntry) Tree(gitRepo *Repository) *Tree { - t, err := gitRepo.getTree(te.ID) +func (te *TreeEntry) Tree(ctx context.Context, gitRepo *Repository) *Tree { + t, err := gitRepo.getTree(ctx, te.ID) if err != nil { return nil } diff --git a/modules/git/tree_entry_common_test.go b/modules/git/tree_entry_common_test.go index 95722dc4488..29ffe322099 100644 --- a/modules/git/tree_entry_common_test.go +++ b/modules/git/tree_entry_common_test.go @@ -13,11 +13,11 @@ 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 diff --git a/modules/git/tree_test.go b/modules/git/tree_test.go index 8b593fe35af..4ebcfd5c6c0 100644 --- a/modules/git/tree_test.go +++ b/modules/git/tree_test.go @@ -11,11 +11,11 @@ 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 @@ -27,15 +27,15 @@ func TestSubTree_Issue29101(t *testing.T) { } 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/blame.go b/modules/gitrepo/blame.go index e98a5ac13f2..042bbef715f 100644 --- a/modules/gitrepo/blame.go +++ b/modules/gitrepo/blame.go @@ -186,7 +186,7 @@ func tryCreateBlameIgnoreRevsFile(ctx context.Context, gitRepo *git.Repository, return "", nil, err } - r, err := entry.Blob(gitRepo).DataAsync() + r, err := entry.Blob(gitRepo).DataAsync(ctx) if err != nil { return "", nil, err } diff --git a/modules/gitrepo/blame_sha256_test.go b/modules/gitrepo/blame_sha256_test.go index 145210cd6fc..872f21f71d4 100644 --- a/modules/gitrepo/blame_sha256_test.go +++ b/modules/gitrepo/blame_sha256_test.go @@ -25,11 +25,11 @@ func TestReadingBlameOutputSha256(t *testing.T) { t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { storage := &mockRepository{path: "repo5_pulls_sha256"} - repo, err := OpenRepository(ctx, storage) + repo, err := OpenRepository(storage) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("0b69b7bb649b5d46e14cabb6468685e5dd721290acc7ffe604d37cde57927345") + commit, err := repo.GetCommit(t.Context(), "0b69b7bb649b5d46e14cabb6468685e5dd721290acc7ffe604d37cde57927345") assert.NoError(t, err) parts := []*BlamePart{ @@ -71,7 +71,7 @@ func TestReadingBlameOutputSha256(t *testing.T) { t.Run("With .git-blame-ignore-revs", func(t *testing.T) { storage := &mockRepository{path: "repo6_blame_sha256"} - repo, err := OpenRepository(ctx, storage) + repo, err := OpenRepository(storage) assert.NoError(t, err) defer repo.Close() @@ -129,10 +129,10 @@ func TestReadingBlameOutputSha256(t *testing.T) { }, } - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(t.Context()) assert.NoError(t, err) for _, c := range cases { - commit, err := repo.GetCommit(c.CommitID) + commit, err := repo.GetCommit(t.Context(), c.CommitID) assert.NoError(t, err) blameReader, err := CreateBlameReader(ctx, objectFormat, storage, repo, commit, "blame.txt", c.Bypass) assert.NoError(t, err) diff --git a/modules/gitrepo/blame_test.go b/modules/gitrepo/blame_test.go index d760bed69bf..6ba831b8fac 100644 --- a/modules/gitrepo/blame_test.go +++ b/modules/gitrepo/blame_test.go @@ -20,10 +20,10 @@ func TestReadingBlameOutput(t *testing.T) { t.Run("Without .git-blame-ignore-revs", func(t *testing.T) { storage := &mockRepository{path: "repo5_pulls"} - repo, err := OpenRepository(ctx, storage) + repo, err := OpenRepository(storage) assert.NoError(t, err) defer repo.Close() - commit, err := repo.GetCommit("f32b0a9dfd09a60f616f29158f772cedd89942d2") + commit, err := repo.GetCommit(t.Context(), "f32b0a9dfd09a60f616f29158f772cedd89942d2") assert.NoError(t, err) parts := []*BlamePart{ @@ -65,7 +65,7 @@ func TestReadingBlameOutput(t *testing.T) { t.Run("With .git-blame-ignore-revs", func(t *testing.T) { storage := &mockRepository{path: "repo6_blame"} - repo, err := OpenRepository(ctx, storage) + repo, err := OpenRepository(storage) assert.NoError(t, err) defer repo.Close() @@ -123,10 +123,10 @@ func TestReadingBlameOutput(t *testing.T) { }, } - objectFormat, err := repo.GetObjectFormat() + objectFormat, err := repo.GetObjectFormat(t.Context()) assert.NoError(t, err) for _, c := range cases { - commit, err := repo.GetCommit(c.CommitID) + commit, err := repo.GetCommit(t.Context(), c.CommitID) assert.NoError(t, err) blameReader, err := CreateBlameReader(ctx, objectFormat, storage, repo, commit, "blame.txt", c.Bypass) diff --git a/modules/gitrepo/branch.go b/modules/gitrepo/branch.go index 09594ca35a0..9a9d4c8bb5f 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 17eabb2aad2..bdc8c389fcf 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/gitrepo/gitrepo.go @@ -18,10 +18,7 @@ import ( "gitea.dev/modules/util" ) -// Repository represents a git repository which stored in a disk -type Repository interface { - RelativePath() string // We don't assume how the directory structure of the repository is, so we only need the relative path -} +type Repository = git.RepositoryFacade // repoPath resolves the Repository.RelativePath (which is a unix-style path like "username/reponame.git") // to a local filesystem path according to setting.RepoRootPath @@ -30,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. @@ -47,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 } @@ -58,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/gitrepo/signing.go b/modules/gitrepo/signing.go deleted file mode 100644 index aa8f947e999..00000000000 --- a/modules/gitrepo/signing.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" -) - -func GetSigningKey(ctx context.Context) (*git.SigningKey, *git.Signature) { - return git.GetSigningKey(ctx) -} diff --git a/modules/gitrepo/url.go b/modules/gitrepo/url.go deleted file mode 100644 index b355d0fa93a..00000000000 --- a/modules/gitrepo/url.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package gitrepo - -func RepoGitURL(repo Repository) string { - return repoPath(repo) -} diff --git a/modules/gitrepo/walk_gogit.go b/modules/gitrepo/walk_gogit.go deleted file mode 100644 index 709897ba0cf..00000000000 --- a/modules/gitrepo/walk_gogit.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build gogit - -package gitrepo - -import ( - "context" - - "github.com/go-git/go-git/v5/plumbing" -) - -// WalkReferences walks all the references from the repository -// refname is empty, ObjectTag or ObjectBranch. All other values should be treated as equivalent to empty. -func WalkReferences(ctx context.Context, repo Repository, walkfn func(sha1, refname string) error) (int, error) { - gitRepo, closer, err := RepositoryFromContextOrOpen(ctx, repo) - if err != nil { - return 0, err - } - defer closer.Close() - - i := 0 - iter, err := gitRepo.GoGitRepo().References() - if err != nil { - return i, err - } - defer iter.Close() - - err = iter.ForEach(func(ref *plumbing.Reference) error { - err := walkfn(ref.Hash().String(), string(ref.Name())) - i++ - return err - }) - return i, err -} diff --git a/modules/gitrepo/walk_nogogit.go b/modules/gitrepo/walk_nogogit.go deleted file mode 100644 index b4f6f7dfc4e..00000000000 --- a/modules/gitrepo/walk_nogogit.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -//go:build !gogit - -package gitrepo - -import ( - "context" - - "gitea.dev/modules/git" -) - -// WalkReferences walks all the references from the repository -func WalkReferences(ctx context.Context, repo Repository, walkfn func(sha1, refname string) error) (int, error) { - return git.WalkShowRef(ctx, repoPath(repo), nil, 0, 0, walkfn) -} diff --git a/modules/indexer/code/gitgrep/gitgrep.go b/modules/indexer/code/gitgrep/gitgrep.go index 1d295098d86..a3ad6cbdca2 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 6544041f24e..e4ba9cf2e8d 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()) diff --git a/modules/issue/template/unmarshal.go b/modules/issue/template/unmarshal.go index eebf8c40b12..a8346885ddf 100644 --- a/modules/issue/template/unmarshal.go +++ b/modules/issue/template/unmarshal.go @@ -42,8 +42,8 @@ func Unmarshal(filename string, content []byte) (*api.IssueTemplate, error) { } // UnmarshalFromEntry parses out a valid template from the blob in entry -func UnmarshalFromEntry(gitRepo *git.Repository, entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) { - return unmarshalFromEntry(gitRepo, entry, path.Join(dir, entry.Name())) // Filepaths in Git are ALWAYS '/' separated do not use filepath here +func UnmarshalFromEntry(ctx context.Context, gitRepo *git.Repository, entry *git.TreeEntry, dir string) (*api.IssueTemplate, error) { + return unmarshalFromEntry(ctx, gitRepo, 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 @@ -52,12 +52,12 @@ func UnmarshalFromCommit(ctx context.Context, gitRepo *git.Repository, commit *g if err != nil { return nil, fmt.Errorf("get entry for %q: %w", filename, err) } - return unmarshalFromEntry(gitRepo, entry, filename) + return unmarshalFromEntry(ctx, gitRepo, entry, filename) } // UnmarshalFromRepo parses out a valid template from the head commit of the branch func UnmarshalFromRepo(ctx context.Context, repo *git.Repository, branch, filename string) (*api.IssueTemplate, error) { - commit, err := repo.GetBranchCommit(branch) + commit, err := repo.GetBranchCommit(ctx, branch) if err != nil { return nil, fmt.Errorf("get commit on branch %q: %w", branch, err) } @@ -65,12 +65,12 @@ func UnmarshalFromRepo(ctx context.Context, repo *git.Repository, branch, filena return UnmarshalFromCommit(ctx, repo, commit, filename) } -func unmarshalFromEntry(gitRepo *git.Repository, entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) { - if size := entry.Blob(gitRepo).Size(); size > setting.UI.MaxDisplayFileSize { +func unmarshalFromEntry(ctx context.Context, gitRepo *git.Repository, entry *git.TreeEntry, filename string) (*api.IssueTemplate, error) { + if size := entry.Blob(gitRepo).Size(ctx); size > setting.UI.MaxDisplayFileSize { return nil, fmt.Errorf("too large: %v > MaxDisplayFileSize", size) } - r, err := entry.Blob(gitRepo).DataAsync() + r, err := entry.Blob(gitRepo).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 48c5a65da80..21fbd3a9af8 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -33,7 +33,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 @@ -45,7 +45,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, []*SyncResult, error) { - objFmt, err := gitRepo.GetObjectFormat() + objFmt, err := gitRepo.GetObjectFormat(ctx) if err != nil { return 0, nil, fmt.Errorf("GetObjectFormat: %w", err) } @@ -58,7 +58,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, nil, err } @@ -88,7 +88,7 @@ func SyncRepoBranchesWithRepo(ctx context.Context, repo *repo_model.Repository, var syncResults []*SyncResult for branch := range allBranches { dbb := dbBranches[branch] - commit, err := gitRepo.GetBranchCommit(branch) + commit, err := gitRepo.GetBranchCommit(ctx, branch) if err != nil { return 0, nil, err } diff --git a/modules/repository/repo.go b/modules/repository/repo.go index 35dd74cd6d1..d24ed449efe 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 } @@ -181,7 +181,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) ([]*SyncResult, 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 nil, 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 79b2dee245c..d16cff07657 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.Error()) } else { ctx.JSON(http.StatusOK, blob) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 1b7b6f32b9d..b890d52c7cd 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 exist, _ := git_model.IsBranchExist(ctx, ctx.Repo.Repository.ID, opt.OldBranchName); exist { //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,14 +236,14 @@ 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 } } - err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, oldCommit.ID.String(), opt.BranchName) + err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, oldCommit.ID.String(), opt.BranchName) if err != nil { if git_model.IsErrBranchNotExist(err) { ctx.APIError(http.StatusNotFound, "The old branch does not exist") @@ -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 @@ -360,7 +360,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 fa73e215b4e..a445f796712 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -74,7 +74,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) @@ -208,14 +208,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.APIErrorAuto(err) return @@ -235,7 +235,7 @@ func GetAllCommits(ctx *context.APIContext) { } // Query commits - commits, err = baseCommit.CommitsByRange(ctx.Repo.GitRepo, listOptions.Page, listOptions.PageSize, not, since, until) + commits, err = baseCommit.CommitsByRange(ctx, ctx.Repo.GitRepo, listOptions.Page, listOptions.PageSize, not, since, until) if err != nil { ctx.APIErrorInternal(err) return @@ -281,7 +281,7 @@ func GetAllCommits(ctx *context.APIContext) { } } - commits, _, err = ctx.Repo.GitRepo.CommitsByFileAndRange( + commits, _, err = ctx.Repo.GitRepo.CommitsByFileAndRange(ctx, git.CommitsByFileAndRangeOptions{ Revision: sha, File: path, @@ -360,7 +360,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/compare.go b/routers/api/v1/repo/compare.go index 833e8af9ff5..afb43417878 100644 --- a/routers/api/v1/repo/compare.go +++ b/routers/api/v1/repo/compare.go @@ -120,9 +120,9 @@ func downloadCompareDiffOrPatch(ctx *context.APIContext, compareInfo *git_servic var err error if patch { - err = compareInfo.HeadGitRepo.GetPatch(compareArg, ctx.Resp) + err = compareInfo.HeadGitRepo.GetPatch(ctx, compareArg, ctx.Resp) } else { - err = compareInfo.HeadGitRepo.GetDiff(compareArg, ctx.Resp) + err = compareInfo.HeadGitRepo.GetDiff(ctx, compareArg, ctx.Resp) } if err != nil { ctx.APIErrorInternal(err) diff --git a/routers/api/v1/repo/download.go b/routers/api/v1/repo/download.go index 0df406488c3..e88b19c00d8 100644 --- a/routers/api/v1/repo/download.go +++ b/routers/api/v1/repo/download.go @@ -14,7 +14,7 @@ import ( ) func serveRepoArchive(ctx *context.APIContext, reqFileName string, paths []string) { - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, reqFileName, paths) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, reqFileName, paths) if err != nil { if errors.Is(err, util.ErrInvalidArgument) { ctx.APIError(http.StatusBadRequest, err.Error()) diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index cb659a9f940..35e6f5ad2d2 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.HandleGenericETagPrivateCache(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) - lfsPointerBuf, err := blob.GetBlobBytes(lfs.MetaFileMaxSize) + lfsPointerBuf, err := blob.GetBlobBytes(ctx, lfs.MetaFileMaxSize) if err != nil { ctx.APIErrorInternal(err) return @@ -217,7 +217,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 diff --git a/routers/api/v1/repo/notes.go b/routers/api/v1/repo/notes.go index d2bd708aa48..8ec33e28f09 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 { ctx.APIErrorAuto(err) return diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 783d525a312..17f8711e27e 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -1107,7 +1107,7 @@ func parseCompareInfo(ctx *context.APIContext, compareParam string) (result *git 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 @@ -1146,12 +1146,12 @@ func parseCompareInfo(ctx *context.APIContext, compareParam string) (result *git return nil, nil } - baseRef, err := common.ResolveRefWithSuffix(ctx.Repo.GitRepo, util.IfZero(compareReq.BaseOriRef, baseRepo.GetPullRequestTargetBranch(ctx)), compareReq.BaseOriRefSuffix) + baseRef, err := common.ResolveRefWithSuffix(ctx, ctx.Repo.GitRepo, util.IfZero(compareReq.BaseOriRef, baseRepo.GetPullRequestTargetBranch(ctx)), compareReq.BaseOriRefSuffix) if err != nil { ctx.APIErrorAuto(err) return nil, nil } - headRef, err := common.ResolveRefWithSuffix(headGitRepo, util.IfZero(compareReq.HeadOriRef, headRepo.DefaultBranch), compareReq.HeadOriRefSuffix) + headRef, err := common.ResolveRefWithSuffix(ctx, headGitRepo, util.IfZero(compareReq.HeadOriRef, headRepo.DefaultBranch), compareReq.HeadOriRefSuffix) if err != nil { ctx.APIErrorAuto(err) return nil, nil @@ -1570,7 +1570,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 9778dc416ac..0eb823f891d 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -526,7 +526,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 @@ -645,7 +645,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 a4fc03ae321..12ad8a1014c 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -269,7 +269,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.Error()) } else if release_service.IsErrProtectedTagName(err) { diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go index d43d5ea628b..5acdc72e989 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,13 +107,13 @@ func GetAnnotatedTag(ctx *context.APIContext) { return } - tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(sha) + tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(ctx, sha) if err != nil { ctx.APIError(http.StatusBadRequest, err.Error()) return } - 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.Error()) return @@ -151,7 +151,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 @@ -201,7 +201,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.Sprintf("target not found: %v", err)) return @@ -221,7 +221,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 d771aac00a1..3b9d90a6bf8 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -196,7 +196,7 @@ func getWikiPage(ctx *context.APIContext, wikiName wiki_service.WebPath) *api.Wi commitsCount, _ := gitrepo.FileCommitsCount(ctx, ctx.Repo.Repository.WikiStorageRepo(), 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 @@ -313,7 +313,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 @@ -431,7 +431,7 @@ func ListPageRevisions(ctx *context.APIContext) { page := max(ctx.FormInt("page"), 1) // get Commit Count - commitsHistory, _, err := wikiRepo.CommitsByFileAndRange( + commitsHistory, _, err := wikiRepo.CommitsByFileAndRange(ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.Repository.DefaultWikiBranch, File: pageFilename, @@ -468,13 +468,13 @@ func findEntryForFile(ctx *context.APIContext, wikiRepo *git.Repository, commit // 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 { ctx.APIErrorAuto(err) return nil, nil } - commit, err := wikiRepo.GetBranchCommit(ctx.Repo.Repository.DefaultWikiBranch) + commit, err := wikiRepo.GetBranchCommit(ctx, ctx.Repo.Repository.DefaultWikiBranch) if err != nil { ctx.APIErrorAuto(err) return wikiRepo, nil @@ -486,10 +486,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, wikiRepo *git.Repository, entry *git.TreeEntry) string { blob := entry.Blob(wikiRepo) - 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 "" diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go index 0123073d17f..b88e8051d6f 100644 --- a/routers/api/v1/utils/git.go +++ b/routers/api/v1/utils/git.go @@ -38,7 +38,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() @@ -57,6 +57,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/compare.go b/routers/common/compare.go index 83990e4eb54..4bbe27d6ca0 100644 --- a/routers/common/compare.go +++ b/routers/common/compare.go @@ -110,9 +110,9 @@ var validRefSuffix = sync.OnceValue(func() *regexp.Regexp { // ResolveRefWithSuffix resolves oriRef plus an optional revision suffix (^, ~N) to a RefName. // A nil error guarantees a usable RefName: an unsupported suffix yields an invalid-argument error // and an unresolvable ref yields a not-found error. -func ResolveRefWithSuffix(gitRepo *git.Repository, oriRef, refSuffix string) (git.RefName, error) { +func ResolveRefWithSuffix(ctx context.Context, gitRepo *git.Repository, oriRef, refSuffix string) (git.RefName, error) { if refSuffix == "" { - if refName := gitRepo.UnstableGuessRefByShortName(oriRef); refName != "" { + if refName := gitRepo.UnstableGuessRefByShortName(ctx, oriRef); refName != "" { return refName, nil } return "", util.NewNotExistErrorf("ref %q does not exist", oriRef) @@ -120,7 +120,7 @@ func ResolveRefWithSuffix(gitRepo *git.Repository, oriRef, refSuffix string) (gi if !validRefSuffix().MatchString(refSuffix) { return "", util.NewInvalidArgumentErrorf("unsupported ref suffix %q", refSuffix) } - commit, err := gitRepo.GetCommit(oriRef + refSuffix) + commit, err := gitRepo.GetCommit(ctx, oriRef+refSuffix) if err != nil { return "", util.NewNotExistErrorf("ref %q does not exist", oriRef+refSuffix) } diff --git a/routers/common/compare_test.go b/routers/common/compare_test.go index fc47397b1eb..1c1f66be508 100644 --- a/routers/common/compare_test.go +++ b/routers/common/compare_test.go @@ -147,7 +147,7 @@ func TestResolveRefWithSuffix(t *testing.T) { // The ^{...}, @{...} and :path forms address non-commit objects or reflog state, so they are // rejected before any repository access and a nil repo is fine here. for _, refSuffix := range []string{"^{/Add}", "^{commit}", "@{upstream}", "~1:path"} { - ref, err := ResolveRefWithSuffix(nil, "branch", refSuffix) + ref, err := ResolveRefWithSuffix(t.Context(), nil, "branch", refSuffix) assert.ErrorIs(t, err, util.ErrInvalidArgument, "suffix %q", refSuffix) assert.Empty(t, ref, "suffix %q", refSuffix) } diff --git a/routers/common/serve.go b/routers/common/serve.go index 5bb3f5316aa..740742a8900 100644 --- a/routers/common/serve.go +++ b/routers/common/serve.go @@ -26,7 +26,7 @@ func ServeBlob(ctx *context.Base, repo *repo_model.Repository, filePath string, return err } - 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, if lastModified == nil { lastModified = new(time.Time) } - httplib.ServeUserContentByReader(ctx.Req, ctx.Resp, blob.Size(), dataRc, httplib.ServeHeaderOptions{ + httplib.ServeUserContentByReader(ctx.Req, ctx.Resp, blob.Size(ctx), dataRc, httplib.ServeHeaderOptions{ Filename: path.Base(filePath), CacheIsPublic: !repo.IsPrivate && 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 d6b5dfcf86b..745c84d3a8a 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -90,7 +90,7 @@ func hookPostReceiveSyncDatabaseBranches(ctx *gitea_context.PrivateContext, opts commitIDs = append(commitIDs, update.NewCommitID) } - if err = repo_service.SyncBranchesToDB(ctx, repo.ID, opts.UserID, branchNames, commitIDs, gitRepo.GetCommit); err != nil { + if err = repo_service.SyncBranchesToDB(ctx, repo.ID, opts.UserID, gitRepo, branchNames, commitIDs); err != nil { ctx.PrivateError(http.StatusInternalServerError, err, "failed to sync branch to DB") return false } @@ -296,10 +296,10 @@ func hookPostReceiveSyncRepoDefaultBranch(ctx *gitea_context.PrivateContext, opt } // if default branch doesn't exist, try to guess one from existing git repo - _, err = gitRepo.GetBranchCommitID(repo.DefaultBranch) + _, err = gitRepo.GetBranchCommitID(ctx, repo.DefaultBranch) if errors.Is(err, util.ErrNotExist) { for _, guessBranchName := range []string{"main", "master"} { - if _, err = gitRepo.GetBranchCommitID(guessBranchName); err == nil { + if _, err = gitRepo.GetBranchCommitID(ctx, guessBranchName); err == nil { repo.DefaultBranch = guessBranchName err = repo_model.UpdateDefaultBranch(ctx, repo) if err != nil { diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 7ea399dbfd9..2036ff14217 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -226,7 +226,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) @@ -252,7 +252,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) @@ -302,7 +302,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 203b67fc3d8..9621f6ff66e 100644 --- a/routers/private/hook_verification.go +++ b/routers/private/hook_verification.go @@ -5,6 +5,7 @@ package private import ( "bufio" + "context" "io" "gitea.dev/modules/git" @@ -15,9 +16,9 @@ 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 { 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 @@ -32,22 +33,22 @@ func verifyCommits(oldCommitID, newCommitID string, repo *git.Repository, env [] err := command.WithEnv(env). WithDir(repo.Path). - WithPipelineFunc(func(ctx gitcmd.Context) error { - err := readAndVerifyCommitsFromShaReader(stdoutReader, repo, env) - return ctx.CancelPipeline(err) + WithPipelineFunc(func(gitCtx gitcmd.Context) error { + err := readAndVerifyCommitsFromShaReader(ctx, stdoutReader, repo, env) + return gitCtx.CancelPipeline(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 } @@ -55,7 +56,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 { commitID := git.MustIDFromString(sha) cmd := gitcmd.NewCommand("cat-file", "commit").AddDynamicArguments(sha) stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe() @@ -63,18 +64,18 @@ func readAndVerifyCommit(sha string, repo *git.Repository, env []string) error { return cmd.WithEnv(env). WithDir(repo.Path). - WithPipelineFunc(func(ctx gitcmd.Context) error { + WithPipelineFunc(func(gitCtx gitcmd.Context) error { commit, err := git.CommitFromReader(commitID, stdoutReader) if err != nil { return err } verification := asymkey_service.ParseCommitWithSignature(ctx, commit) if !verification.Verified { - return ctx.CancelPipeline(&errUnverifiedCommit{commit.ID.String()}) + return gitCtx.CancelPipeline(&errUnverifiedCommit{commit.ID.String()}) } 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 30b309e917d..7dacd42e717 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 58d57b60962..76184d64438 100644 --- a/routers/web/feed/branch.go +++ b/routers/web/feed/branch.go @@ -21,7 +21,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(ctx.Repo.GitRepo, 0, 10, "", "", "") + commits, err = ctx.Repo.Commit.CommitsByRange(ctx, ctx.Repo.GitRepo, 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 fa590dfcf0a..debb6dd4c9c 100644 --- a/routers/web/feed/file.go +++ b/routers/web/feed/file.go @@ -23,7 +23,7 @@ func ShowFileFeed(ctx *context.Context, repo *repo.Repository, formatType string if len(fileName) == 0 { return } - commits, _, err := ctx.Repo.GitRepo.CommitsByFileAndRange( + 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 7c52455d31d..19b80fa0933 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -194,7 +194,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 830cd25eb65..3034a4aa591 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -87,7 +87,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) @@ -181,9 +181,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 @@ -215,7 +215,7 @@ func prepareWorkflowTemplate(ctx *context.Context, commit *git.Commit) (workflow workflows = make([]WorkflowInfo, 0, len(entries)) for _, entry := range entries { workflow := WorkflowInfo{EntryName: entry.Name()} - content, err := actions.GetContentFromEntry(ctx.Repo.GitRepo, entry) + content, err := actions.GetContentFromEntry(ctx, ctx.Repo.GitRepo, 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 6f55bb1c6a0..1ffb180d52a 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -251,7 +251,7 @@ func ViewWorkflowFile(ctx *context_module.Context) { 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) @@ -1476,14 +1476,14 @@ func viewScopedWorkflowFile(ctx *context_module.Context, run *actions_model.Acti return } - sourceGitRepo, err := gitrepo.OpenRepository(ctx, sourceRepo) + sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) if err != nil { ctx.ServerError("OpenRepository", err) return } defer sourceGitRepo.Close() - commit, err := sourceGitRepo.GetCommit(run.WorkflowCommitSHA) + commit, err := sourceGitRepo.GetCommit(ctx, run.WorkflowCommitSHA) if err != nil { ctx.NotFoundOrServerError("GetCommit", func(err error) bool { return errors.Is(err, util.ErrNotExist) diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index 0bc8cfc2aed..713767134f0 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -57,7 +57,7 @@ func RefBlame(ctx *context.Context) { } blob := entry.Blob(ctx.Repo.GitRepo) - fileSize := blob.Size() + fileSize := blob.Size(ctx) ctx.Data["FileSize"] = fileSize ctx.Data["FileTreePath"] = ctx.Repo.TreePath @@ -73,7 +73,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 @@ -197,7 +197,7 @@ func processBlameParts(ctx *context.Context, blameParts []*gitrepo.BlamePart) ma 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/branch.go b/routers/web/repo/branch.go index fcd328efafd..ab91ab01f05 100644 --- a/routers/web/repo/branch.go +++ b/routers/web/repo/branch.go @@ -198,9 +198,9 @@ func CreateBranch(ctx *context.Context) { } err = release_service.CreateNewTag(ctx, ctx.Doer, ctx.Repo.Repository, target, form.NewBranchName, "") } else if ctx.Repo.RefFullName.IsBranch() { - err = repo_service.CreateNewBranch(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.BranchName, form.NewBranchName) + err = repo_service.CreateNewBranch(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.Repo.BranchName, form.NewBranchName) } else { - err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.CommitID, form.NewBranchName) + err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.Repo.CommitID, form.NewBranchName) } if err != nil { if release_service.IsErrProtectedTagName(err) { diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 4630337b59c..c5108c39c49 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(ctx.Repo.GitRepo, page, pageSize, "", "", "") + commits, err := ctx.Repo.Commit.CommitsByRange(ctx, ctx.Repo.GitRepo, page, pageSize, "", "", "") if err != nil { ctx.ServerError("CommitsByRange", err) return @@ -141,7 +141,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 @@ -154,7 +154,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 @@ -189,7 +189,7 @@ func SearchCommits(ctx *context.Context) { all := ctx.FormBool("all") opts := git.NewSearchCommitsOptions(query, all) - commits, err := ctx.Repo.Commit.SearchCommits(ctx.Repo.GitRepo, opts) + commits, err := ctx.Repo.Commit.SearchCommits(ctx, ctx.Repo.GitRepo, opts) if err != nil { ctx.ServerError("SearchCommits", err) return @@ -220,7 +220,7 @@ func FileHistory(ctx *context.Context) { ctx.Data["FollowRenameChecked"] = followRename page := max(ctx.FormInt("page"), 1) - commits, hasMore, err := ctx.Repo.GitRepo.CommitsByFileAndRange( + commits, hasMore, err := ctx.Repo.GitRepo.CommitsByFileAndRange(ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.RefFullName.ShortName(), // FIXME: legacy code used ShortName File: ctx.Repo.TreePath, @@ -302,7 +302,7 @@ func Diff(ctx *context.Context) { diffBlobExcerptData.BaseLink = ctx.Repo.RepoLink + "/wiki/blob_excerpt" } - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { if git.IsErrNotExist(err) { ctx.NotFound(err) @@ -357,7 +357,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 @@ -433,7 +433,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 @@ -447,7 +447,7 @@ func RawDiff(ctx *context.Context) { return } } - if err := git.GetRawDiff( + 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 fb7b07293a1..3cf42d47c12 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -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 } @@ -236,7 +236,7 @@ func (cpi *comparePageInfoType) parseCompareInfo(ctx *context.Context, comparePa baseRefName := util.IfZero(compareReq.BaseOriRef, baseRepo.GetPullRequestTargetBranch(ctx)) headRefName := util.IfZero(compareReq.HeadOriRef, headRepo.DefaultBranch) - baseRef, err := common.ResolveRefWithSuffix(ctx.Repo.GitRepo, baseRefName, compareReq.BaseOriRefSuffix) + baseRef, err := common.ResolveRefWithSuffix(ctx, ctx.Repo.GitRepo, baseRefName, compareReq.BaseOriRefSuffix) if err != nil { return err } @@ -245,7 +245,7 @@ func (cpi *comparePageInfoType) parseCompareInfo(ctx *context.Context, comparePa return err } - headRef, err := common.ResolveRefWithSuffix(headGitRepo, headRefName, compareReq.HeadOriRefSuffix) + headRef, err := common.ResolveRefWithSuffix(ctx, headGitRepo, headRefName, compareReq.HeadOriRefSuffix) if err != nil { return err } @@ -496,7 +496,7 @@ func (cpi *comparePageInfoType) prepareCompareDiff(ctx *context.Context, whitesp 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 @@ -504,7 +504,7 @@ func (cpi *comparePageInfoType) prepareCompareDiff(ctx *context.Context, whitesp baseGitRepo := ctx.Repo.GitRepo - beforeCommit, err := baseGitRepo.GetCommit(beforeCommitID) + beforeCommit, err := baseGitRepo.GetCommit(ctx, beforeCommitID) if err != nil { ctx.ServerError("GetCommit", err) return @@ -631,9 +631,9 @@ func downloadCompareDiffOrPatch(ctx *context.Context, patch bool) { var err error if patch { - err = ci.HeadGitRepo.GetPatch(compareArg, ctx.Resp) + err = ci.HeadGitRepo.GetPatch(ctx, compareArg, ctx.Resp) } else { - err = ci.HeadGitRepo.GetDiff(compareArg, ctx.Resp) + err = ci.HeadGitRepo.GetDiff(ctx, compareArg, ctx.Resp) } if err != nil { ctx.ServerError("DownloadCompareDiffOrPatch", err) @@ -768,7 +768,7 @@ func ExcerptBlob(ctx *context.Context) { diffBlobExcerptData.BaseLink = ctx.Repo.RepoLink + "/wiki/blob_excerpt" } - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { ctx.ServerError("GetCommit", err) return @@ -778,7 +778,7 @@ func ExcerptBlob(ctx *context.Context) { ctx.ServerError("GetBlobByPath", err) return } - reader, err := blob.DataAsync() + reader, err := blob.DataAsync(ctx) if err != nil { ctx.ServerError("DataAsync", err) return diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go index 0f20b5c0b70..ed6de00092e 100644 --- a/routers/web/repo/download.go +++ b/routers/web/repo/download.go @@ -30,7 +30,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim return nil } - lfsPointerBuf, err := blob.GetBlobBytes(lfs.MetaFileMaxSize) + lfsPointerBuf, err := blob.GetBlobBytes(ctx, lfs.MetaFileMaxSize) if err != nil { return err } @@ -82,7 +82,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_cherry_pick.go b/routers/web/repo/editor_cherry_pick.go index 18138d32cd9..12c0bdb0b5d 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 @@ -66,7 +66,7 @@ func CherryPickPost(ctx *context.Context) { if parsed.form.Revert { err = gitrepo.GetReverseRawDiff(ctx, ctx.Repo.Repository, fromCommitID, buf) } else { - err = git.GetRawDiff(ctx.Repo.GitRepo, fromCommitID, git.RawDiffPatch, buf) + err = git.GetRawDiff(ctx, ctx.Repo.GitRepo, fromCommitID, git.RawDiffPatch, 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 8817f792cf2..5b4fb5bf740 100644 --- a/routers/web/repo/editor_preview.go +++ b/routers/web/repo/editor_preview.go @@ -28,7 +28,7 @@ func DiffPreviewPost(ctx *context.Context) { return } - oldContent, err := entry.Blob(ctx.Repo.GitRepo).GetBlobContent(setting.UI.MaxDisplayFileSize) + oldContent, err := entry.Blob(ctx.Repo.GitRepo).GetBlobContent(ctx, setting.UI.MaxDisplayFileSize) if err != nil { ctx.ServerError("GetBlobContent", err) return diff --git a/routers/web/repo/editor_test.go b/routers/web/repo/editor_test.go index 1706ab670e9..fc0a38ce331 100644 --- a/routers/web/repo/editor_test.go +++ b/routers/web/repo/editor_test.go @@ -21,7 +21,7 @@ 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(t.Context(), gitRepo, "sub-home-md-img-check", "docs/foo/bar") assert.Equal(t, "docs", treePath) diff --git a/routers/web/repo/editor_util.go b/routers/web/repo/editor_util.go index bc32b6ed996..523d4547c32 100644 --- a/routers/web/repo/editor_util.go +++ b/routers/web/repo/editor_util.go @@ -57,7 +57,7 @@ func getClosestParentWithFiles(ctx context.Context, gitRepo *git.Repository, bra } 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 "" diff --git a/routers/web/repo/issue_new.go b/routers/web/repo/issue_new.go index d108ca86c88..1b64104eb48 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 } diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index c24e24211ff..379a0111210 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -203,7 +203,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 errors.Is(err, util.ErrNotExist) { return } else if err != nil { @@ -227,7 +227,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) @@ -555,13 +555,13 @@ func getViewPullHeadBranchCommitID(ctx *context.Context, pull *issues_model.Pull if err != nil { return "", err } - return headGitRepo.GetRefCommitID(git.RefNameFromBranch(pull.HeadBranch).String()) + return headGitRepo.GetRefCommitID(ctx, git.RefNameFromBranch(pull.HeadBranch).String()) case issues_model.PullRequestFlowAGit: baseGitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, pull.BaseRepo) if err != nil { return "", err } - return baseGitRepo.GetRefCommitID(pull.GetGitHeadRefName()) + return baseGitRepo.GetRefCommitID(ctx, pull.GetGitHeadRefName()) } setting.PanicInDevOrTesting("invalid pull request flow type: %v", pull.Flow) return "", util.ErrNotExist @@ -731,7 +731,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { afterCommitID = util.IfZero(afterCommitID, headCommitID) afterCommit := indexCommit(prCompareInfo.Commits, afterCommitID) if afterCommit == nil && afterCommitID == headCommitID { - afterCommit, err = gitRepo.GetCommit(afterCommitID) + afterCommit, err = gitRepo.GetCommit(ctx, afterCommitID) if err != nil { ctx.ServerError("GetCommit(afterCommitID)", err) return @@ -744,7 +744,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { var beforeCommit *git.Commit if isSingleCommit { - beforeCommit, err = afterCommit.Parent(ctx.Repo.GitRepo, 0) + beforeCommit, err = afterCommit.Parent(ctx, ctx.Repo.GitRepo, 0) if err != nil { ctx.ServerError("afterCommit.Parent", err) return @@ -755,7 +755,7 @@ func viewPullFiles(ctx *context.Context, beforeCommitID, afterCommitID string) { beforeCommit = indexCommit(prCompareInfo.Commits, beforeCommitID) if beforeCommit == nil && beforeCommitID == prCompareInfo.CompareBase { // base 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(beforeCommitID)", err) return diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index b71d4d27a9c..2ebd9bd63c0 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 f8757ee53d1..a5aac43ff4d 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -47,7 +47,7 @@ func calReleaseNumCommitsBehind(ctx stdCtx.Context, repoCtx *context.Repository, } // 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,7 +55,7 @@ func calReleaseNumCommitsBehind(ctx stdCtx.Context, repoCtx *context.Repository, } // 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) } @@ -500,7 +500,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/render.go b/routers/web/repo/render.go index 254b9a15c78..748c08f53b3 100644 --- a/routers/web/repo/render.go +++ b/routers/web/repo/render.go @@ -32,7 +32,7 @@ func RenderFile(ctx *context.Context) { return } - blobReader, err := blob.DataAsync() + blobReader, 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 d23cca7fa56..ff213fcc42f 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -351,7 +351,7 @@ func Download(ctx *context.Context) { return } - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*"), ctx.FormStrings("path")) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*"), ctx.FormStrings("path")) if err != nil { if errors.Is(err, util.ErrInvalidArgument) { ctx.HTTPError(http.StatusBadRequest, err.Error()) @@ -387,7 +387,7 @@ func InitiateDownload(ctx *context.Context) { }) return } - aReq, err := archiver_service.NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*"), paths) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ctx.PathParam("*"), paths) 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 72e512e1450..3f9da056e10 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -122,7 +122,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)) @@ -130,7 +130,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) @@ -151,7 +151,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/setting/setting.go b/routers/web/repo/setting/setting.go index 26607fb40bf..730a30a7301 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -69,7 +69,7 @@ func SettingsCtxData(ctx *context.Context) { ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval ctx.Data["CanConvertFork"] = ctx.Repo.Repository.IsFork && ctx.Doer.CanCreateRepoIn(ctx.Repo.Repository.Owner) - signing, _ := gitrepo.GetSigningKey(ctx) + signing, _ := git.GetSigningKey(ctx) ctx.Data["SigningKeyAvailable"] = signing != nil ctx.Data["SigningSettings"] = setting.Repository.Signing ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled @@ -147,7 +147,7 @@ func SettingsPost(ctx *context.Context) { ctx.Data["DefaultMirrorInterval"] = setting.Mirror.DefaultInterval ctx.Data["MinimumMirrorInterval"] = setting.Mirror.MinInterval - signing, _ := gitrepo.GetSigningKey(ctx) + signing, _ := git.GetSigningKey(ctx) ctx.Data["SigningKeyAvailable"] = signing != nil ctx.Data["SigningSettings"] = setting.Repository.Signing ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index f976034e34c..fecd55db6c7 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{blobOrLfsSize: blob.Size(), st: typesniffer.DetectContentType(buf)} + fi = &fileInfo{blobOrLfsSize: blob.Size(ctx), st: typesniffer.DetectContentType(buf)} // FIXME: what happens when README file is an image? if !fi.st.IsText() || !setting.LFS.StartServer { diff --git a/routers/web/repo/view_file.go b/routers/web/repo/view_file.go index 336846dce7f..f9c43c5ca7c 100644 --- a/routers/web/repo/view_file.go +++ b/routers/web/repo/view_file.go @@ -29,7 +29,7 @@ import ( ) func prepareLatestCommitInfo(ctx *context.Context) bool { - commit, err := ctx.Repo.Commit.GetCommitByPath(ctx.Repo.GitRepo, ctx.Repo.TreePath) + commit, err := ctx.Repo.Commit.GetCommitByPath(ctx, ctx.Repo.GitRepo, ctx.Repo.TreePath) if err != nil { ctx.ServerError("GetCommitByPath", err) return false @@ -182,7 +182,7 @@ func prepareFileView(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileError"] = strings.TrimSpace(issueConfigErr.Error()) } } else if actions.IsWorkflow(ctx.Repo.TreePath) { - content, err := actions.GetContentFromEntry(ctx.Repo.GitRepo, entry) + content, err := actions.GetContentFromEntry(ctx, ctx.Repo.GitRepo, entry) if err != nil { log.Error("actions.GetContentFromEntry: %v", err) } @@ -190,7 +190,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 ef022db8c56..c696b3c9a14 100644 --- a/routers/web/repo/view_home.go +++ b/routers/web/repo/view_home.go @@ -37,7 +37,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. @@ -119,7 +119,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(ctx.Repo.GitRepo).GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { + if content, err := entry.Blob(ctx.Repo.GitRepo).GetBlobContent(ctx, setting.UI.MaxDisplayFileSize); err != nil { log.Error("checkCitationFile: GetBlobContent: %v", err) } else { ctx.Data["CitiationExist"] = true @@ -226,7 +226,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) @@ -235,7 +235,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. diff --git a/routers/web/repo/view_readme.go b/routers/web/repo/view_readme.go index b045c51e5a1..908ff95dd1f 100644 --- a/routers/web/repo/view_readme.go +++ b/routers/web/repo/view_readme.go @@ -92,7 +92,7 @@ func findReadmeFileInEntries(ctx *context.Context, parentDir string, entries []* if subTreeEntry == nil { continue } - subTree := subTreeEntry.Tree(ctx.Repo.GitRepo) + subTree := subTreeEntry.Tree(ctx, ctx.Repo.GitRepo) if subTree == nil { // this should be impossible; if subTreeEntry exists so should this. continue diff --git a/routers/web/repo/view_readme_test.go b/routers/web/repo/view_readme_test.go index 79b00ee7701..d1761e54237 100644 --- a/routers/web/repo/view_readme_test.go +++ b/routers/web/repo/view_readme_test.go @@ -41,11 +41,11 @@ data 12 err = gitcmd.NewCommand("fast-import").WithDir(repoPath).WithStdinBytes([]byte(stdin)).RunWithStderr(t.Context()) require.NoError(t, err) - gitRepo, err := git.OpenRepository(t.Context(), repoPath) + gitRepo, err := git.OpenRepository(repoPath) require.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit("master") + commit, err := gitRepo.GetBranchCommit(t.Context(), "master") require.NoError(t, err) entries, err := commit.Tree().ListEntries(t.Context(), gitRepo) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index b3e2c2a2aa4..75de0351646 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -103,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()) @@ -117,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 @@ -128,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, wikiRepo *git.Repository, entry *git.TreeEntry) []byte { - reader, err := entry.Blob(wikiRepo).DataAsync() + reader, err := entry.Blob(wikiRepo).DataAsync(ctx) if err != nil { ctx.ServerError("Blob.Data", err) return nil @@ -352,7 +352,7 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) page := max(ctx.FormInt("page"), 1) // get Commit Count - commitsHistory, _, err := wikiGitRepo.CommitsByFileAndRange( + commitsHistory, _, err := wikiGitRepo.CommitsByFileAndRange(ctx, git.CommitsByFileAndRangeOptions{ Revision: ctx.Repo.Repository.DefaultWikiBranch, File: pageFilename, @@ -492,7 +492,7 @@ func Wiki(ctx *context.Context) { ctx.Data["FormatWarning"] = "File extension " + path.Ext(wikiPath) + " 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 @@ -524,7 +524,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 diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go index be1044d8abc..d90d2f232da 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.Repository, *git.TreeEntry) { - wikiRepo, err := gitrepo.OpenRepository(t.Context(), repo.WikiStorageRepo()) + wikiRepo, err := gitrepo.OpenRepository(repo.WikiStorageRepo()) assert.NoError(t, err) t.Cleanup(func() { defer wikiRepo.Close() }) - commit, err := wikiRepo.GetBranchCommit("master") + commit, err := wikiRepo.GetBranchCommit(t.Context(), "master") assert.NoError(t, err) entries, err := commit.Tree().ListEntries(t.Context(), wikiRepo) assert.NoError(t, err) @@ -51,7 +51,7 @@ func wikiContent(t *testing.T, repo *repo_model.Repository, wikiName wiki_servic if !assert.NotNil(t, entry) { return "" } - reader, err := entry.Blob(wikiRepo).DataAsync() + reader, err := entry.Blob(wikiRepo).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 df8980a0e96..85ca8acccba 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -116,7 +116,7 @@ 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 diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index 74a13fb5f57..8efb5e59459 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -251,7 +251,7 @@ func prepareUserProfileTabData(ctx *context.Context, profileDbRepo *repo_model.R total = 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/commit_status_test.go b/services/actions/commit_status_test.go index af71d16e209..151bf2e5988 100644 --- a/services/actions/commit_status_test.go +++ b/services/actions/commit_status_test.go @@ -48,11 +48,11 @@ func TestCreateCommitStatus_Dedupe(t *testing.T) { assert.NoError(t, unittest.PrepareTestDatabase()) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) require.NoError(t, err) run := &actions_model.ActionRun{ diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index f0390a5d0a5..db852d1f12f 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -148,7 +148,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) } @@ -167,13 +167,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) } @@ -227,7 +227,7 @@ 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) } @@ -591,14 +591,14 @@ 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) } @@ -748,6 +748,6 @@ func detectScopedWorkflowsForSource( if err != nil { return "", nil, nil, err } - detected, filtered = actions_module.MatchScopedWorkflows(parsed, consumerGitRepo, consumerCommit, input.Event, input.Payload) + detected, filtered = actions_module.MatchScopedWorkflows(ctx, parsed, consumerGitRepo, consumerCommit, input.Event, input.Payload) return sourceCommitSHA, detected, filtered, nil } diff --git a/services/actions/reusable_workflow.go b/services/actions/reusable_workflow.go index 92948394ffd..3c03ee65522 100644 --- a/services/actions/reusable_workflow.go +++ b/services/actions/reusable_workflow.go @@ -79,13 +79,13 @@ func loadReusableWorkflowSource(ctx context.Context, run *actions_model.ActionRu // readWorkflowFromRepo loads a workflow file from `repo` at `refOrSHA` and returns its content plus the resolved commit SHA. func readWorkflowFromRepo(ctx context.Context, repo *repo_model.Repository, refOrSHA, path string) ([]byte, string, error) { - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return nil, "", fmt.Errorf("open repo %s: %w", repo.FullName(), err) } defer gitRepo.Close() - commit, err := gitRepo.GetCommit(refOrSHA) + commit, err := gitRepo.GetCommit(ctx, refOrSHA) if err != nil { return nil, "", fmt.Errorf("get commit %q in %s: %w", refOrSHA, repo.FullName(), err) } diff --git a/services/actions/scoped_workflow_cache.go b/services/actions/scoped_workflow_cache.go index 5a16139934a..0288dbf2bfc 100644 --- a/services/actions/scoped_workflow_cache.go +++ b/services/actions/scoped_workflow_cache.go @@ -50,13 +50,13 @@ func LoadParsedScopedWorkflows(ctx context.Context, sourceRepo *repo_model.Repos } // cache miss: open the source repo at the exact SHA we keyed on - sourceGitRepo, err := gitrepo.OpenRepository(ctx, sourceRepo) + sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) if err != nil { return "", nil, fmt.Errorf("open source repo: %w", err) } defer sourceGitRepo.Close() - sourceCommit, err := sourceGitRepo.GetCommit(sha) + sourceCommit, err := sourceGitRepo.GetCommit(ctx, sha) if err != nil { return "", nil, fmt.Errorf("get source commit %s: %w", sha, err) } diff --git a/services/actions/workflow.go b/services/actions/workflow.go index 6d004782a2c..73a805164b7 100644 --- a/services/actions/workflow.go +++ b/services/actions/workflow.go @@ -85,12 +85,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 0, util.ErrorWrapTranslatable( @@ -183,7 +183,7 @@ func resolveDispatchWorkflowContent(ctx reqctx.RequestContext, repo *repo_model. } for _, e := range entries { if e.Name() == workflowID { - return actions.GetContentFromEntry(gitRepo, e) + return actions.GetContentFromEntry(ctx, gitRepo, e) } } return nil, util.ErrorWrapTranslatable( diff --git a/services/agit/agit.go b/services/agit/agit.go index bccd89b0fe8..2624312b9ab 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -146,7 +146,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) } @@ -209,7 +209,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/sign.go b/services/asymkey/sign.go index ba405d824f7..b7c47e3ab53 100644 --- a/services/asymkey/sign.go +++ b/services/asymkey/sign.go @@ -17,7 +17,6 @@ import ( repo_model "gitea.dev/models/repo" user_model "gitea.dev/models/user" "gitea.dev/modules/git" - "gitea.dev/modules/gitrepo" "gitea.dev/modules/log" "gitea.dev/modules/process" "gitea.dev/modules/setting" @@ -171,7 +170,7 @@ Loop: // SignWikiCommit determines if we should sign the commits to this repository wiki func SignWikiCommit(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, u *user_model.User) (bool, *git.SigningKey, *git.Signature, error) { rules := signingModeFromStrings(setting.Repository.Signing.Wiki) - signingKey, sig := gitrepo.GetSigningKey(ctx) + signingKey, sig := git.GetSigningKey(ctx) if signingKey == nil { return false, nil, nil, &ErrWontSign{noKey} } @@ -200,7 +199,7 @@ Loop: return false, nil, nil, &ErrWontSign{twofa} } case parentSigned: - commit, err := gitRepo.GetCommit("HEAD") + commit, err := gitRepo.GetCommit(ctx, "HEAD") if err != nil { return false, nil, nil, err } @@ -248,12 +247,12 @@ Loop: return false, nil, nil, &ErrWontSign{twofa} } case parentSigned: - 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 } @@ -280,16 +279,16 @@ func SignMerge(ctx context.Context, pr *issues_model.PullRequest, u *user_model. } repo := pr.BaseRepo - baseCommit, err := gitRepo.GetCommit(baseRef) + baseCommit, err := gitRepo.GetCommit(ctx, baseRef) if err != nil { return false, nil, nil, err } - headCommit, err := gitRepo.GetCommit(headRef) + headCommit, err := gitRepo.GetCommit(ctx, headRef) if err != nil { return false, nil, nil, err } - signingKey, signer := gitrepo.GetSigningKey(ctx) + signingKey, signer := git.GetSigningKey(ctx) if signingKey == nil { return false, nil, nil, &ErrWontSign{noKey} } @@ -355,11 +354,11 @@ Loop: // AllHeadCommitsVerified checks that every new commit in the PR head has a // verified signature. func AllHeadCommitsVerified(ctx context.Context, pr *issues_model.PullRequest, gitRepo *git.Repository) (bool, error) { - baseCommit, err := gitRepo.GetCommit(pr.BaseBranch) + baseCommit, err := gitRepo.GetCommit(ctx, pr.BaseBranch) if err != nil { return false, err } - headCommit, err := gitRepo.GetCommit(pr.GetGitHeadRefName()) + headCommit, err := gitRepo.GetCommit(ctx, pr.GetGitHeadRefName()) if err != nil { return false, err } @@ -369,7 +368,7 @@ func AllHeadCommitsVerified(ctx context.Context, pr *issues_model.PullRequest, g // allCommitsVerified checks the commits a merge would introduce, those reachable from // headCommit but not from baseCommit. Both commits must come from gitRepo. func allCommitsVerified(ctx context.Context, gitRepo *git.Repository, baseCommit, headCommit *git.Commit) (bool, error) { - commitList, err := headCommit.CommitsBeforeUntil(gitRepo, baseCommit.ID.RefName()) + commitList, err := headCommit.CommitsBeforeUntil(ctx, gitRepo, baseCommit.ID.RefName()) if err != nil { return false, err } diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index bbbd9cf2d3e..a29b9c028bb 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -104,13 +104,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 } @@ -181,14 +181,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 diff --git a/services/automergequeue/automergequeue.go b/services/automergequeue/automergequeue.go index 70556c2086f..0f69059dd9d 100644 --- a/services/automergequeue/automergequeue.go +++ b/services/automergequeue/automergequeue.go @@ -34,13 +34,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 db258e3a319..b99e722ed43 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 9d8aa97f326..81291a8cc9c 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -301,7 +301,7 @@ func (r *Repository) GetEditorconfig(ctx context.Context, optCommit ...*git.Comm 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 } @@ -310,10 +310,10 @@ func (r *Repository) GetEditorconfig(ctx context.Context, optCommit ...*git.Comm if err != nil { return nil, nil, err } - if treeEntry.Blob(r.GitRepo).Size() >= setting.UI.MaxDisplayFileSize { + if treeEntry.Blob(r.GitRepo).Size(ctx) >= setting.UI.MaxDisplayFileSize { return nil, nil, git.ErrNotExist{ID: "", RelPath: ".editorconfig"} } - reader, err := treeEntry.Blob(r.GitRepo).DataAsync() + reader, err := treeEntry.Blob(r.GitRepo).DataAsync(ctx) if err != nil { return nil, nil, err } @@ -830,7 +830,9 @@ 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(repo, path, func(s string) bool { + return repo.GitRepo.IsBranchExist(ctx, s) + }) if len(ref) == 0 { // check if ref is HEAD parts := strings.Split(path, "/") @@ -860,7 +862,9 @@ 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(repo, path, func(s string) bool { + return repo.GitRepo.IsTagExist(ctx, s) + }) case git.RefTypeCommit: parts := strings.Split(path, "/") if git.IsStringLikelyCommitID(repo.GetObjectFormat(), parts[0], 7) { @@ -871,7 +875,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 "" } @@ -902,7 +906,7 @@ 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.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 @@ -936,7 +940,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 { @@ -947,7 +951,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 { @@ -976,7 +980,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 @@ -985,7 +989,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) @@ -999,7 +1003,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 diff --git a/services/contexttest/context_tests.go b/services/contexttest/context_tests.go index 1a6f4b01042..135cddedb86 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) t.Cleanup(func() { gitRepo.Close() @@ -152,7 +152,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) } @@ -185,7 +185,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/action_test.go b/services/convert/action_test.go index ee7f1d107dc..7d8c215b87e 100644 --- a/services/convert/action_test.go +++ b/services/convert/action_test.go @@ -62,7 +62,7 @@ func TestGetActionWorkflow_FallbackRef(t *testing.T) { repoDir := buildWorkflowTestRepo(t) - gitRepo, err := git.OpenRepository(ctx, repoDir) + gitRepo, err := git.OpenRepository(repoDir) require.NoError(t, err) defer gitRepo.Close() diff --git a/services/convert/convert.go b/services/convert/convert.go index 3122cd931fd..dd1510031d4 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -554,7 +554,7 @@ func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, gi createdAt := commit.Author.When updatedAt := commit.Author.When - content, err := actions.GetContentFromEntry(gitRepo, entry) + content, err := actions.GetContentFromEntry(ctx, gitRepo, entry) name := entry.Name() if err == nil { workflow, err := model.ReadWorkflow(bytes.NewReader(content)) @@ -584,7 +584,7 @@ func getActionWorkflowEntry(ctx context.Context, repo *repo_model.Repository, gi } 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 } @@ -603,7 +603,7 @@ func ListActionWorkflows(ctx context.Context, gitrepo *git.Repository, repo *rep } func GetActionWorkflow(ctx context.Context, gitRepo *git.Repository, repo *repo_model.Repository, workflowID string) (*api.ActionWorkflow, error) { - defaultBranchCommit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + defaultBranchCommit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return nil, err } @@ -616,11 +616,11 @@ func GetActionWorkflowByRef(ctx context.Context, gitrepo *git.Repository, repo * return nil, util.NewNotExistErrorf("workflow %q not found", workflowID) } - refCommitID, err := gitrepo.GetRefCommitID(ref.String()) + refCommitID, err := gitrepo.GetRefCommitID(ctx, ref.String()) if err != nil { return nil, err } - refCommit, err := gitrepo.GetCommit(refCommitID) + refCommit, err := gitrepo.GetCommit(ctx, refCommitID) if err != nil { return nil, err } @@ -645,7 +645,7 @@ func getActionWorkflowFromCommit(ctx context.Context, repo *repo_model.Repositor // GetScopedActionWorkflow resolves a scoped workflow definition (under SCOPED_WORKFLOW_DIRS) from the source repo at commitSHA. func GetScopedActionWorkflow(ctx context.Context, sourceGitRepo *git.Repository, sourceRepo *repo_model.Repository, workflowID, commitSHA string) (*api.ActionWorkflow, error) { - commit, err := sourceGitRepo.GetCommit(commitSHA) + commit, err := sourceGitRepo.GetCommit(ctx, commitSHA) if err != nil { return nil, err } @@ -680,7 +680,7 @@ func ResolveActionWorkflowForRun(ctx context.Context, repo *repo_model.Repositor if err != nil { return nil, err } - sourceGitRepo, err := gitrepo.OpenRepository(ctx, sourceRepo) + sourceGitRepo, err := gitrepo.OpenRepository(sourceRepo) if err != nil { return nil, err } @@ -688,7 +688,7 @@ func ResolveActionWorkflowForRun(ctx context.Context, repo *repo_model.Repositor return GetScopedActionWorkflow(ctx, sourceGitRepo, sourceRepo, run.WorkflowID, run.WorkflowCommitSHA) } - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) if err != nil { return nil, err } diff --git a/services/convert/pull.go b/services/convert/pull.go index cdc79eb88ff..c8c5583ca62 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -145,7 +145,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 @@ -159,7 +159,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 @@ -171,7 +171,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 @@ -191,7 +191,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 @@ -211,7 +211,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 @@ -221,7 +221,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 @@ -247,13 +247,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 @@ -329,7 +329,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 } @@ -452,13 +452,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/git/compare.go b/services/git/compare.go index 23f6ffe75f0..a19e6fd7bf5 100644 --- a/services/git/compare.go +++ b/services/git/compare.go @@ -72,7 +72,7 @@ func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Reposito // if they are not the same repository, then we need to fetch the base commit into the head repository // because we will use headGitRepo in the following code if baseRepo.ID != headRepo.ID { - exist := headGitRepo.IsReferenceExist(compareInfo.BaseCommitID) + exist := headGitRepo.IsReferenceExist(ctx, compareInfo.BaseCommitID) if !exist { if err := gitrepo.FetchRemoteCommit(ctx, headRepo, baseRepo, compareInfo.BaseCommitID); err != nil { return compareInfo, fmt.Errorf("FetchRemoteCommit: %w", err) @@ -108,6 +108,6 @@ func GetCompareInfo(ctx context.Context, baseRepo, headRepo *repo_model.Reposito // Count number of changed files. // TODO: 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(compareInfo.BaseCommitID, compareInfo.HeadCommitID, directComparison) + compareInfo.NumFiles, err = headGitRepo.GetDiffNumChangedFiles(ctx, compareInfo.BaseCommitID, compareInfo.HeadCommitID, directComparison) return compareInfo, err } diff --git a/services/gitdiff/git_diff_tree.go b/services/gitdiff/git_diff_tree.go index c00969b2fc1..9b50fb8e5f4 100644 --- a/services/gitdiff/git_diff_tree.go +++ b/services/gitdiff/git_diff_tree.go @@ -52,7 +52,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 } @@ -73,14 +73,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) } @@ -91,7 +91,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 } @@ -100,7 +100,7 @@ func validateGitDiffTreeArguments(gitRepo *git.Repository, useMergeBase bool, ba return false, objectFormat.EmptyTree().String(), headCommitID, nil } - baseCommit, err := headCommit.Parent(gitRepo, 0) + baseCommit, err := headCommit.Parent(ctx, gitRepo, 0) if err != nil { return false, "", "", fmt.Errorf("baseSha is '', attempted to use parent of commit %s, got error: %v", headCommit.ID.String(), err) } @@ -108,7 +108,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 7b203160855..6e322ce0fa8 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 bd23295b6e7..466c623f6a4 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -583,7 +583,7 @@ func getCommitFileLineCountAndLimitedContent(ctx context.Context, gitRepo *git.R return 0, nil } w := &limitByteWriter{limit: MaxFullFileHighlightSizeLimit + 1} - lineCount, err = blob.GetBlobLineCount(w) + lineCount, err = blob.GetBlobLineCount(ctx, w) if err != nil { return 0, nil } @@ -1248,7 +1248,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() @@ -1256,9 +1256,9 @@ func guessBeforeCommitForDiff(gitRepo *git.Repository, beforeCommitID string, af actualBeforeCommitID = commitObjectFormat.EmptyTree() } else { if isBeforeCommitIDEmpty { - actualBeforeCommit, err = afterCommit.Parent(gitRepo, 0) + actualBeforeCommit, err = afterCommit.Parent(ctx, gitRepo, 0) } else { - actualBeforeCommit, err = gitRepo.GetCommit(beforeCommitID) + actualBeforeCommit, err = gitRepo.GetCommit(ctx, beforeCommitID) } if err != nil { return nil, nil, err @@ -1275,12 +1275,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 } @@ -1340,7 +1340,7 @@ func GetDiffForRender(ctx context.Context, repoLink string, gitRepo *git.Reposit startTime := time.Now() - 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 } @@ -1440,12 +1440,12 @@ type DiffShortStat struct { } func GetDiffShortStat(ctx context.Context, repoStorage gitrepo.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 } @@ -1474,7 +1474,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 @@ -1549,7 +1549,7 @@ func CommentAsDiff(ctx context.Context, c *issues_model.Comment) (*Diff, error) // GeneratePatchForUnchangedLine creates a patch showing code context for an unchanged line func GeneratePatchForUnchangedLine(ctx context.Context, gitRepo *git.Repository, commitID, treePath string, line int64, contextLines int) (string, error) { - commit, err := gitRepo.GetCommit(commitID) + commit, err := gitRepo.GetCommit(ctx, commitID) if err != nil { return "", fmt.Errorf("GetCommit: %w", err) } @@ -1560,7 +1560,7 @@ func GeneratePatchForUnchangedLine(ctx context.Context, gitRepo *git.Repository, } blob := entry.Blob(gitRepo) - dataRc, err := blob.DataAsync() + dataRc, err := blob.DataAsync(ctx) if err != nil { return "", fmt.Errorf("DataAsync: %w", err) } diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index ebe5fc905e5..9b20680a215 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -601,7 +601,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() @@ -1188,7 +1188,7 @@ D test2.txt D test10.txt` require.NoError(t, gitcmd.NewCommand("fast-import").WithDir(pull.BaseRepo.RepoPath()).WithStdinBytes([]byte(stdin)).Run(t.Context())) - gitRepo, err := git.OpenRepository(t.Context(), pull.BaseRepo.RepoPath()) + gitRepo, err := git.OpenRepository(pull.BaseRepo.RepoPath()) assert.NoError(t, err) defer gitRepo.Close() diff --git a/services/issue/comments.go b/services/issue/comments.go index 5b70dbf72e3..89943c83cdc 100644 --- a/services/issue/comments.go +++ b/services/issue/comments.go @@ -186,7 +186,7 @@ func LoadCommentPushCommits(ctx context.Context, c *issues_model.Comment) error } defer closer.Close() - c.Commits, err = git_service.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(data.CommitIDs), c.Issue.Repo, "") // no current ref sub path for PR commit list + c.Commits, err = git_service.ConvertFromGitCommit(ctx, gitRepo.GetCommitsFromIDs(ctx, data.CommitIDs), c.Issue.Repo, "") // no current ref sub path for PR commit list if err != nil { log.Debug("ConvertFromGitCommit: %v", err) // no need to show 500 error to end user when the commit does not exist } else { diff --git a/services/issue/pull.go b/services/issue/pull.go index 78ad6a98967..39a56ba233b 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -55,13 +55,13 @@ 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 } @@ -69,7 +69,7 @@ func PullRequestCodeOwnersReview(ctx context.Context, pr *issues_model.PullReque var data string for _, file := range codeOwnerFiles { if blob, err := commit.GetBlobByPath(ctx, repo, file); err == nil { - data, err = blob.GetBlobContent(setting.UI.MaxDisplayFileSize) + data, err = blob.GetBlobContent(ctx, setting.UI.MaxDisplayFileSize) if err == nil { break } @@ -91,7 +91,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 daa43d5d547..c53df65efcf 100644 --- a/services/issue/template.go +++ b/services/issue/template.go @@ -58,7 +58,7 @@ func GetTemplateConfig(ctx context.Context, gitRepo *git.Repository, path string return GetDefaultTemplateConfig(), err } - reader, err := treeEntry.Blob(gitRepo).DataAsync() + reader, err := treeEntry.Blob(gitRepo).DataAsync(ctx) if err != nil { log.Debug("DataAsync: %v", err) return GetDefaultTemplateConfig(), nil @@ -120,7 +120,7 @@ func ParseTemplatesFromDefaultBranch(ctx context.Context, repo *repo.Repository, return ret } - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return ret } @@ -141,7 +141,7 @@ func ParseTemplatesFromDefaultBranch(ctx context.Context, repo *repo.Repository, continue } fullName := path.Join(dirName, entry.Name()) - if it, err := template.UnmarshalFromEntry(gitRepo, entry, dirName); err != nil { + if it, err := template.UnmarshalFromEntry(ctx, gitRepo, 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/ @@ -161,7 +161,7 @@ func GetTemplateConfigFromDefaultBranch(ctx context.Context, repo *repo.Reposito return GetDefaultTemplateConfig(), nil } - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) + commit, err := gitRepo.GetBranchCommit(ctx, repo.DefaultBranch) if err != nil { return GetDefaultTemplateConfig(), err } diff --git a/services/markup/renderhelper_codepreview.go b/services/markup/renderhelper_codepreview.go index b694816ae8a..8a34b28714c 100644 --- a/services/markup/renderhelper_codepreview.go +++ b/services/markup/renderhelper_codepreview.go @@ -50,13 +50,13 @@ 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 } @@ -67,11 +67,11 @@ func renderRepoFileCodePreview(ctx context.Context, opts markup.RenderCodePrevie 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 228d057ad34..171dfaf01e7 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 } @@ -519,7 +519,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 { @@ -546,10 +546,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) @@ -581,7 +581,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 e375007dc18..8379e448f5b 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -139,13 +139,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 } @@ -298,7 +298,7 @@ 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) @@ -632,7 +632,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 { @@ -651,10 +651,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 @@ -681,7 +681,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 @@ -886,7 +886,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 // SECURITY: The TreePath must be cleaned! use relative path comment.TreePath = util.PathJoinRel(comment.TreePath) - patch, _ := git.GetFileDiffCutAroundLine( + patch, _ := git.GetFileDiffCutAroundLine(ctx, g.gitRepo, pr.MergeBase, headCommitID, comment.TreePath, int64((&issues_model.Comment{Line: int64(line + comment.Position - 1)}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines, ) diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index 9a861e4a664..4d75c85fbf7 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -176,7 +176,7 @@ func runSync(ctx context.Context, m *repo_model.Mirror) ([]*repo_module.SyncResu 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 @@ -325,7 +325,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 @@ -348,7 +348,7 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { // Create reference if result.OldCommitID == "" { - 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 @@ -370,14 +370,14 @@ func SyncPullMirror(ctx context.Context, repoID int64) bool { } oldCommitID, newCommitID := result.OldCommitID, result.NewCommitID - commits, err := gitRepo.CommitsBetween(newCommitID, oldCommitID, setting.UI.FeedMaxCommitNum) + commits, err := gitRepo.CommitsBetween(ctx, newCommitID, oldCommitID, setting.UI.FeedMaxCommitNum) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get CommitsBetween [new_commit_id: %s, old_commit_id: %s]: %v", m.Repo, newCommitID, oldCommitID, err) continue } theCommits := repo_module.GitToPushCommits(commits) - newCommit, err := gitRepo.GetCommit(newCommitID.String()) + newCommit, err := gitRepo.GetCommit(ctx, newCommitID.String()) if err != nil { log.Error("SyncMirrors [repo: %-v]: unable to get commit %s: %v", m.Repo, newCommitID, err) continue @@ -394,7 +394,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 5df0c8a0661..3b6b0a2d4ec 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -137,7 +137,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 dd95e3001b4..9bab40de368 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 145eff5d5ea..64b252b0668 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -333,7 +333,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) } @@ -360,7 +360,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com // PR was maybe fast-forwarded, so just use last commit of PR mergeCommit = prHeadCommitID } - 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 7cbd84b7d83..859c8b8b044 100644 --- a/services/pull/comment.go +++ b/services/pull/comment.go @@ -106,12 +106,12 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *iss oldCommitID := oldRef if !git.IsEmptyCommitID(oldRef) { - oldCommitID, err = gitRepo.GetRefCommitID(oldRef) + oldCommitID, err = gitRepo.GetRefCommitID(ctx, oldRef) if err != nil { return nil, false, err } } - newCommitID, err := gitRepo.GetRefCommitID(newRef) + newCommitID, err := gitRepo.GetRefCommitID(ctx, newRef) if err != nil { return nil, false, err } diff --git a/services/pull/comment_test.go b/services/pull/comment_test.go index 3d5b995e534..5836575fdc4 100644 --- a/services/pull/comment_test.go +++ b/services/pull/comment_test.go @@ -19,13 +19,14 @@ import ( ) func TestCreatePushPullCommentForcePushDeletesOldComments(t *testing.T) { + ctx := t.Context() require.NoError(t, unittest.PrepareTestDatabase()) pusher := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) - require.NoError(t, pr.LoadIssue(t.Context())) - require.NoError(t, pr.LoadBaseRepo(t.Context())) + require.NoError(t, pr.LoadIssue(ctx)) + require.NoError(t, pr.LoadBaseRepo(ctx)) - gitRepo, err := gitrepo.OpenRepository(t.Context(), pr.BaseRepo) + gitRepo, err := gitrepo.OpenRepository(pr.BaseRepo) require.NoError(t, err) defer gitRepo.Close() @@ -65,7 +66,7 @@ func TestCreatePushPullCommentForcePushDeletesOldComments(t *testing.T) { insertCommitComment(t, issues_model.PushActionContent{}) assertCommitCommentCount(t, 2, 0) - baseCommit, err := gitRepo.GetBranchCommit(pr.BaseBranch) + baseCommit, err := gitRepo.GetBranchCommit(ctx, pr.BaseBranch) assert.NoError(t, err) // force push, the old push comments should be deleted, and one new force-push comment should be created. @@ -83,7 +84,7 @@ func TestCreatePushPullCommentForcePushDeletesOldComments(t *testing.T) { t.Run("force-push-ignores-missing-old-commit", func(t *testing.T) { require.NoError(t, db.TruncateBeans(t.Context(), &issues_model.Comment{})) - headCommit, err := gitRepo.GetBranchCommit(pr.HeadBranch) + headCommit, err := gitRepo.GetBranchCommit(ctx, pr.HeadBranch) require.NoError(t, err) commitIDZero := git.Sha1ObjectFormat.EmptyObjectID().String() @@ -110,9 +111,9 @@ func TestCreatePushPullCommentForcePushDeletesOldComments(t *testing.T) { insertCommitComment(t, issues_model.PushActionContent{}) assertCommitCommentCount(t, 4, 0) - baseCommit, err := gitRepo.GetBranchCommit(pr.BaseBranch) + baseCommit, err := gitRepo.GetBranchCommit(ctx, pr.BaseBranch) require.NoError(t, err) - headCommit, err := gitRepo.GetBranchCommit(pr.HeadBranch) + headCommit, err := gitRepo.GetBranchCommit(ctx, pr.HeadBranch) require.NoError(t, err) _, _, err = CreatePushPullComment(t.Context(), pusher, pr, baseCommit.ID.String(), headCommit.ID.String(), true) diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index 9a2e7b8441b..fb6ba7f9db7 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -127,9 +127,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/merge.go b/services/pull/merge.go index a9e4c36784d..0c567c46280 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -68,7 +68,7 @@ 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 } @@ -642,7 +642,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") @@ -651,7 +651,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 } diff --git a/services/pull/merge_prepare.go b/services/pull/merge_prepare.go index c50bb3ccb2d..f72fae3f0b3 100644 --- a/services/pull/merge_prepare.go +++ b/services/pull/merge_prepare.go @@ -102,7 +102,7 @@ func createTemporaryRepoForMerge(ctx context.Context, pr *issues_model.PullReque mergeCtx.sig = doer.NewGitSig() mergeCtx.committer = mergeCtx.sig - gitRepo, err := git.OpenRepository(ctx, mergeCtx.tmpBasePath) + gitRepo, err := git.OpenRepository(mergeCtx.tmpBasePath) if err != nil { defer cancel() return nil, nil, fmt.Errorf("failed to open temp git repo for pr[%d]: %w", mergeCtx.pr.ID, err) diff --git a/services/pull/merge_rebase.go b/services/pull/merge_rebase.go index 57b771e36c4..0a2bca39405 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 54b91594fb0..3c4dd8047d6 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 a 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.CommitsBetween(git.RefNameFromBranch(tmpRepoTrackingBranch), git.RefNameHead, -1) + commits, err := gitRepo.CommitsBetween(ctx, git.RefNameFromBranch(tmpRepoTrackingBranch), git.RefNameHead, -1) if err != nil { log.Error("%-v Unable to get commits between: head and tracking branch: %v", ctx.pr, err) return nil, err diff --git a/services/pull/merge_tree.go b/services/pull/merge_tree.go index 10bdcf99f97..ded501a1236 100644 --- a/services/pull/merge_tree.go +++ b/services/pull/merge_tree.go @@ -55,7 +55,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. if err := pr.LoadHeadRepo(ctx); err != nil { return err } - headGitRepo, err := gitrepo.OpenRepository(ctx, pr.HeadRepo) + headGitRepo, err := gitrepo.OpenRepository(pr.HeadRepo) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -66,7 +66,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. if pr.IsSameRepo() { baseGitRepo = headGitRepo } else { - baseGitRepo, err = gitrepo.OpenRepository(ctx, pr.BaseRepo) + baseGitRepo, err = gitrepo.OpenRepository(pr.BaseRepo) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -75,13 +75,13 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. // 3. Get head commit id if pr.Flow == issues_model.PullRequestFlowGithub { - pr.HeadCommitID, err = headGitRepo.GetRefCommitID(git.BranchPrefix + pr.HeadBranch) + pr.HeadCommitID, err = headGitRepo.GetRefCommitID(ctx, git.BranchPrefix+pr.HeadBranch) if err != nil { return fmt.Errorf("GetBranchCommitID: can't find commit ID for head: %w", err) } } else { if pr.ID > 0 { - pr.HeadCommitID, err = baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + pr.HeadCommitID, err = baseGitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return fmt.Errorf("GetRefCommitID: can't find commit ID for head: %w", err) } @@ -93,7 +93,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. // 4. fetch head commit id into the current repository // it will be checked in 2 weeks by default from git if the pull request created failure. if !pr.IsSameRepo() { - if !baseGitRepo.IsReferenceExist(pr.HeadCommitID) { + if !baseGitRepo.IsReferenceExist(ctx, pr.HeadCommitID) { if err := gitrepo.FetchRemoteCommit(ctx, pr.BaseRepo, pr.HeadRepo, pr.HeadCommitID); err != nil { return fmt.Errorf("FetchRemoteCommit: %w", err) } @@ -101,7 +101,7 @@ func checkPullRequestMergeableByMergeTree(ctx context.Context, pr *issues_model. } // 5. update merge base - baseCommitID, err := baseGitRepo.GetRefCommitID(git.BranchPrefix + pr.BaseBranch) + baseCommitID, err := baseGitRepo.GetRefCommitID(ctx, git.BranchPrefix+pr.BaseBranch) if err != nil { return fmt.Errorf("GetBranchCommitID: can't find commit ID for base: %w", err) } diff --git a/services/pull/patch.go b/services/pull/patch.go index 3844072553c..5eb6c74fadf 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -39,11 +39,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 { @@ -74,7 +74,7 @@ func checkPullRequestMergeableByTmpRepo(ctx context.Context, pr *issues_model.Pu } defer cancel() - gitRepo, err := git.OpenRepository(ctx, prCtx.tmpBasePath) + gitRepo, err := git.OpenRepository(prCtx.tmpBasePath) if err != nil { return fmt.Errorf("OpenRepository: %w", err) } @@ -84,13 +84,13 @@ func checkPullRequestMergeableByTmpRepo(ctx context.Context, pr *issues_model.Pu pr.MergeBase, _, err = gitcmd.NewCommand("merge-base", "--", tmpRepoBaseBranch, tmpRepoTrackingBranch).WithDir(prCtx.tmpBasePath).RunStdString(ctx) if err != nil { var err2 error - pr.MergeBase, err2 = gitRepo.GetRefCommitID(git.BranchPrefix + tmpRepoBaseBranch) + pr.MergeBase, err2 = gitRepo.GetRefCommitID(ctx, git.BranchPrefix+tmpRepoBaseBranch) 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 + tmpRepoTrackingBranch); err != nil { + if pr.HeadCommitID, err = gitRepo.GetRefCommitID(ctx, git.BranchPrefix+tmpRepoTrackingBranch); err != nil { return fmt.Errorf("GetBranchCommitID: can't find commit ID for head: %w", err) } @@ -289,10 +289,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 } @@ -321,7 +321,7 @@ func checkConflictsByTmpRepo(ctx context.Context, pr *issues_model.PullRequest, 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(tmpRepoBaseBranch) + baseTree, err := gitRepo.GetTree(ctx, tmpRepoBaseBranch) if err != nil { return false, err } @@ -366,11 +366,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 } @@ -396,11 +396,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 } @@ -437,7 +437,7 @@ func checkPullFilesProtection(ctx context.Context, pr *issues_model.PullRequest, return nil } - pr.ChangedProtectedFiles, err = CheckFileProtection(gitRepo, pr.HeadBranch, pr.MergeBase, headRef, pb.GetProtectedFilePatterns(), 10, os.Environ()) + pr.ChangedProtectedFiles, err = CheckFileProtection(ctx, gitRepo, pr.HeadBranch, pr.MergeBase, headRef, 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 bded0cefbcf..8c08bba56ad 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -365,7 +365,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) } @@ -803,7 +803,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ if pr.Flow == issues_model.PullRequestFlowGithub { headCommitRef = git.RefNameFromBranch(pr.HeadBranch) } else { - pr.HeadCommitID, err = gitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + pr.HeadCommitID, err = gitRepo.GetRefCommitID(ctx, pr.GetGitHeadRefName()) if err != nil { return "", err } @@ -814,7 +814,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ limit := setting.Repository.PullRequest.DefaultMergeMessageCommitsLimit - limitedCommits, err := gitRepo.CommitsBetween(headCommitRef, mergeBaseRef, limit) + limitedCommits, err := gitRepo.CommitsBetween(ctx, headCommitRef, mergeBaseRef, limit) if err != nil { return "", err } @@ -874,7 +874,7 @@ func collectSquashMergeCommitCoAuthors(ctx context.Context, gitRepo *git.Reposit skip := limitFirst batchLimit := 30 for { - commits, err := gitRepo.CommitsBetween(headCommitRef, mergeBaseRef, batchLimit, skip) + commits, err := gitRepo.CommitsBetween(ctx, headCommitRef, mergeBaseRef, batchLimit, skip) if err != nil { log.Error("Unable to get commits between: %s %s Error: %v", pr.HeadBranch, pr.MergeBase, err) return authors @@ -960,7 +960,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 @@ -981,7 +981,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 } @@ -1003,7 +1003,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 } @@ -1026,16 +1026,16 @@ 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 } } diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go index 554c9ed5775..674e4f642da 100644 --- a/services/pull/pull_test.go +++ b/services/pull/pull_test.go @@ -45,7 +45,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() @@ -75,7 +75,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 e124b90199d..a3ff735e4f1 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -66,7 +66,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. @@ -266,7 +266,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) } @@ -274,7 +274,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo commitID = headCommitID } - patch, err = git.GetFileDiffCutAroundLine( + patch, err = git.GetFileDiffCutAroundLine(ctx, gitRepo, pr.MergeBase, headCommitID, treePath, int64((&issues_model.Comment{Line: line}).UnsignedLine()), line < 0, setting.UI.CodeCommentLines, ) @@ -322,7 +322,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/notes.go b/services/release/notes.go index bf41d3426f6..2dd7c9f7318 100644 --- a/services/release/notes.go +++ b/services/release/notes.go @@ -28,7 +28,7 @@ type GenerateReleaseNotesOptions struct { // GenerateReleaseNotes builds the Markdown snippet for release notes. func GenerateReleaseNotes(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, opts GenerateReleaseNotesOptions) (string, error) { - headCommit, err := resolveHeadCommit(gitRepo, opts.TagName, opts.TagTarget) + headCommit, err := resolveHeadCommit(ctx, gitRepo, opts.TagName, opts.TagTarget) if err != nil { return "", err } @@ -40,7 +40,7 @@ func GenerateReleaseNotes(ctx context.Context, repo *repo_model.Repository, gitR var baseCommitID git.RefName if opts.PreviousTag != "" { - baseCommit, err := gitRepo.GetCommit(opts.PreviousTag) + baseCommit, err := gitRepo.GetCommit(ctx, opts.PreviousTag) if err != nil { return "", util.ErrorWrapTranslatable(util.ErrNotExist, "repo.release.generate_notes_tag_not_found", opts.PreviousTag) } @@ -49,7 +49,7 @@ func GenerateReleaseNotes(ctx context.Context, repo *repo_model.Repository, gitR return "", util.ErrorWrapTranslatable(util.ErrNotExist, "repo.release.generate_notes_tag_not_found", opts.TagName) } - commits, err := gitRepo.CommitsBetween(headCommit.ID.RefName(), baseCommitID, -1) + commits, err := gitRepo.CommitsBetween(ctx, headCommit.ID.RefName(), baseCommitID, -1) if err != nil { return "", fmt.Errorf("CommitsBetween: %w", err) } @@ -85,13 +85,13 @@ func repoReleaseIsEmpty(ctx context.Context, repoID int64) (bool, error) { return count == 0, nil } -func resolveHeadCommit(gitRepo *git.Repository, tagName, tagTarget string) (*git.Commit, error) { +func resolveHeadCommit(ctx context.Context, gitRepo *git.Repository, tagName, tagTarget string) (*git.Commit, error) { ref := tagName - if !gitRepo.IsTagExist(tagName) { + if !gitRepo.IsTagExist(ctx, tagName) { ref = tagTarget } - commit, err := gitRepo.GetCommit(ref) + commit, err := gitRepo.GetCommit(ctx, ref) if err != nil { return nil, util.ErrorWrapTranslatable(util.ErrNotExist, "repo.release.generate_notes_target_not_found", ref) } diff --git a/services/release/notes_test.go b/services/release/notes_test.go index 3fb3b7c553a..df050d9243d 100644 --- a/services/release/notes_test.go +++ b/services/release/notes_test.go @@ -23,7 +23,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("ChangeLogsWithPRs", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) @@ -52,7 +52,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("NoPreviousTag", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) @@ -83,7 +83,7 @@ func TestGenerateReleaseNotes(t *testing.T) { t.Run("EmptyPreviousTagWithExistingTags", func(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) t.Cleanup(func() { gitRepo.Close() }) diff --git a/services/release/release.go b/services/release/release.go index 5d4063c0839..66e8957a1a0 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -103,13 +103,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, @@ -117,7 +117,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, @@ -144,7 +144,7 @@ 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) } @@ -168,8 +168,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 { @@ -178,22 +178,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 @@ -352,10 +352,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 1c0f910bbfb..b9f029da9b2 100644 --- a/services/release/release_test.go +++ b/services/release/release_test.go @@ -33,11 +33,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, @@ -51,7 +51,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, @@ -65,7 +65,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, @@ -79,7 +79,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, @@ -93,7 +93,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, @@ -129,7 +129,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) { @@ -138,7 +138,7 @@ 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() @@ -149,7 +149,7 @@ func TestRelease_Update(t *testing.T) { advance := func() { fakeNow = fakeNow.Add(time.Second); timeutil.MockSet(fakeNow) } // 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, @@ -173,7 +173,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, @@ -197,7 +197,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, @@ -235,7 +235,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 @@ -297,7 +297,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 a05cfb66dfd..edadb51ea67 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -141,7 +141,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 b73d4667316..35843615335 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -77,7 +77,7 @@ func (item *archiveQueueItem) toArchiveRequest(ctx context.Context) (*ArchiveReq // 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, paths []string) (*ArchiveRequest, error) { +func NewRequest(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, archiveRefExt string, paths []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 { @@ -88,7 +88,7 @@ func NewRequest(repo *repo_model.Repository, gitRepo *git.Repository, archiveRef } // Get corresponding commit. - commit, err := gitRepo.GetCommit(archiveRefShortName) + commit, err := gitRepo.GetCommit(ctx, archiveRefShortName) if err != nil { return nil, util.NewNotExistErrorf("unrecognized repository reference: %s", archiveRefShortName) } diff --git a/services/repository/archiver/archiver_test.go b/services/repository/archiver/archiver_test.go index 8829ac1b79c..e9b2f52545b 100644 --- a/services/repository/archiver/archiver_test.go +++ b/services/repository/archiver/archiver_test.go @@ -49,47 +49,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", nil) + bogusReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip", nil) 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", nil) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".unknown", nil) assert.Error(t, err) assert.Nil(t, bogusReq) // Step 2, missing commit. - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "dbffff.zip", nil) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "dbffff.zip", nil) 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", nil) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "db.zip", nil) assert.Error(t, err) assert.Nil(t, bogusReq) - bogusReq, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, "master.zip", nil) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "master.zip", nil) 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", nil) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, "test/archive.zip", nil) 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", nil) + zipReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip", nil) assert.NoError(t, err) assert.NotNil(t, zipReq) - tgzReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz", nil) + tgzReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz", nil) assert.NoError(t, err) assert.NotNil(t, tgzReq) - secondReq, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".bundle", nil) + secondReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".bundle", nil) assert.NoError(t, err) assert.NotNil(t, secondReq) @@ -109,7 +109,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", nil) + zipReq2, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip", nil) 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 @@ -124,12 +124,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", nil) + timedReq, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, secondCommit+".tar.gz", nil) assert.NoError(t, err) assert.NotNil(t, timedReq) doArchive(t.Context(), timedReq) - zipReq2, err = NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip", nil) + zipReq2, err = NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".zip", nil) 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 @@ -146,7 +146,7 @@ func TestArchive_Basic(t *testing.T) { assert.NotEqual(t, zipReq.GetArchiveName(), secondReq.GetArchiveName()) t.Run("BadPath", func(t *testing.T) { - badRequest, err := NewRequest(ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz", []string{"not-a-path"}) + badRequest, err := NewRequest(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, firstCommit+".tar.gz", []string{"not-a-path"}) require.NoError(t, err) err = ServeRepoArchive(ctx.Base, badRequest) require.Error(t, err) diff --git a/services/repository/branch.go b/services/repository/branch.go index 4e561ff5b95..8d2391eb8dc 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -38,13 +38,13 @@ import ( ) // CreateNewBranch creates a new repository branch -func CreateNewBranch(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, oldBranchName, branchName string) (err error) { +func CreateNewBranch(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, gitRepo *git.Repository, oldBranchName, branchName string) (err error) { branch, err := git_model.GetBranch(ctx, repo.ID, oldBranchName) if err != nil { return err } - return CreateNewBranchFromCommit(ctx, doer, repo, branch.CommitID, branchName) + return CreateNewBranchFromCommit(ctx, doer, repo, gitRepo, branch.CommitID, branchName) } // Branch contains the branch information @@ -226,14 +226,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) } @@ -257,8 +257,8 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g } // checkBranchName validates branch name with existing repository branches -func checkBranchName(ctx context.Context, repo *repo_model.Repository, name string) error { - _, err := gitrepo.WalkReferences(ctx, repo, func(_, refName string) error { +func checkBranchName(ctx context.Context, gitRepo *git.Repository, name string) error { + _, err := gitRepo.WalkReferences(ctx, "", 0, 0, func(_, refName string) error { branchRefName := strings.TrimPrefix(refName, git.BranchPrefix) switch { case branchRefName == name: @@ -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, gitRepo *git.Repository, branchNames, commitIDs []string) 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 := gitRepo.GetCommit(ctx, commitID) if err != nil { return fmt.Errorf("get commit of %s failed: %v", branchName, err) } @@ -374,14 +374,14 @@ func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames, } // CreateNewBranchFromCommit creates a new repository branch -func CreateNewBranchFromCommit(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, commitID, branchName string) (err error) { +func CreateNewBranchFromCommit(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, gitRepo *git.Repository, commitID, branchName string) (err error) { err = repo.MustNotBeArchived() if err != nil { return err } // Check if branch name can be used - if err := checkBranchName(ctx, repo, branchName); err != nil { + if err := checkBranchName(ctx, gitRepo, branchName); err != nil { return err } @@ -504,7 +504,7 @@ func UpdateBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git } if expectedOldCommitID != "" { - expectedID, err := gitRepo.ConvertToGitID(expectedOldCommitID) + expectedID, err := gitRepo.ConvertToGitID(ctx, expectedOldCommitID) if err != nil { return fmt.Errorf("ConvertToGitID(old): %w", err) } @@ -513,11 +513,11 @@ func UpdateBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git } } - newID, err := gitRepo.ConvertToGitID(newCommitID) + newID, err := gitRepo.ConvertToGitID(ctx, newCommitID) if err != nil { return fmt.Errorf("ConvertToGitID(new): %w", err) } - newCommit, err := gitRepo.GetCommit(newID.String()) + newCommit, err := gitRepo.GetCommit(ctx, newID.String()) if err != nil { return err } @@ -615,7 +615,7 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R return err } - branchCommit, err := gitRepo.GetBranchCommit(branchName) + branchCommit, err := gitRepo.GetBranchCommit(ctx, branchName) // branchCommit can be nil if the branch doesn't exist in git if err != nil && !errors.Is(err, util.ErrNotExist) { return err @@ -803,7 +803,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 } @@ -886,12 +886,12 @@ func DeleteBranchAfterMerge(ctx context.Context, doer *user_model.User, prID int defer gitHeadCloser.Close() // 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) return errFailedToDelete(err) } - branchCommitID, err := gitHeadRepo.GetBranchCommitID(pr.HeadBranch) + branchCommitID, err := gitHeadRepo.GetBranchCommitID(ctx, pr.HeadBranch) if err != nil { log.Error("GetBranchCommitID: %v", err) return errFailedToDelete(err) diff --git a/services/repository/cache.go b/services/repository/cache.go index 6b2e22cb833..1f08f042bcf 100644 --- a/services/repository/cache.go +++ b/services/repository/cache.go @@ -14,7 +14,7 @@ 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 } diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go index 63b31a1c4b4..3b25b6457fa 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 503ce968c16..03219d5ed0d 100644 --- a/services/repository/contributors_graph.go +++ b/services/repository/contributors_graph.go @@ -111,8 +111,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 } @@ -180,7 +180,7 @@ func getExtendedCommitStats(repo *git.Repository, revision string /*, limit int } return nil }). - RunWithStderr(repo.Ctx) + RunWithStderr(ctx) if err != nil { return nil, fmt.Errorf("ContributorsCommitStats: %w", err) } @@ -201,7 +201,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 233fcff694c..935fa1ee307 100644 --- a/services/repository/files/cherry_pick.go +++ b/services/repository/files/cherry_pick.go @@ -63,7 +63,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 } @@ -72,7 +72,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) } @@ -85,7 +85,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 } @@ -142,12 +142,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, gitRepo, commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, gitRepo, 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 5dd43fa9515..e2676a757b7 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -162,7 +162,7 @@ func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Reposi return nil, err } - lastCommit, err := refCommit.Commit.GetCommitByPath(gitRepo, opts.TreePath) + lastCommit, err := refCommit.Commit.GetCommitByPath(ctx, gitRepo, opts.TreePath) if err != nil { return nil, err } @@ -188,14 +188,14 @@ func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Reposi 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 } @@ -205,7 +205,7 @@ func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Reposi } else if entry.IsLink() { contentsResponse.Type = string(ContentTypeLink) // The target of a symlink file is the content of the file - targetFromContent, err := entry.Blob(gitRepo).GetBlobContent(1024) + targetFromContent, err := entry.Blob(gitRepo).GetBlobContent(ctx, 1024) if err != nil { return nil, err } @@ -250,7 +250,7 @@ func getFileContentsByEntryInternal(ctx context.Context, repo *repo_model.Reposi 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 @@ -258,10 +258,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 } @@ -271,7 +271,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 } @@ -291,15 +291,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 52b7e8a013f..ea4e3c4afec 100644 --- a/services/repository/files/content_test.go +++ b/services/repository/files/content_test.go @@ -34,7 +34,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: new("dHJlZSAyYTJmMWQ0NjcwNzI4YTJlMTAwNDllMzQ1YmQ3YTI3NjQ2OGJlYWI2CmF1dGhvciB1c2VyMSA8YWRkcmVzczFAZXhhbXBsZS5jb20+IDE0ODk5NTY0NzkgLTA0MDAKY29tbWl0dGVyIEV0aGFuIEtvZW5pZyA8ZXRoYW50a29lbmlnQGdtYWlsLmNvbT4gMTQ4OTk1NjQ3OSAtMDQwMAoKSW5pdGlhbCBjb21taXQK"), Encoding: new("base64"), diff --git a/services/repository/files/file.go b/services/repository/files/file.go index c7ba150130e..7db74dba8b0 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, gitRepo, refCommit.Commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, gitRepo, 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, gitRepo *git.Repository, commit *git.Commit) (*api.FileCommitResponse, error) { +func GetFileCommitResponse(ctx context.Context, repo *repo_model.Repository, gitRepo *git.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, gitRepo *git.Repository, commitTreeURL, _ := url.Parse(repo.APIURL() + "/git/trees/" + url.PathEscape(commit.TreeID.String())) parents := make([]*api.CommitMeta, commit.ParentCount()) for i := 0; i < commit.ParentCount(); i++ { - if parent, err := commit.Parent(gitRepo, i); err == nil && parent != nil { + if parent, err := commit.Parent(ctx, gitRepo, 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 4fd7fbaf05c..c18dacea6ef 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -142,7 +142,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 } @@ -151,7 +151,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) } @@ -206,12 +206,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, gitRepo, commit) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(ctx, repo, gitRepo, 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 bffd3525836..da5d6a9d79a 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -48,7 +48,10 @@ func NewTemporaryUploadRepository(repo *repo_model.Repository) (*TemporaryUpload // Close the repository cleaning up all files func (t *TemporaryUploadRepository) Close() { // must stop the repo access before removal, otherwise Windows can't remove the directory occupied by other processes - t.gitRepo.Close() + if t.gitRepo != nil { + _ = t.gitRepo.Close() + t.gitRepo = nil + } if t.cleanup != nil { t.cleanup() } @@ -76,7 +79,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 } @@ -89,7 +92,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 } @@ -141,7 +144,7 @@ func (t *TemporaryUploadRepository) RemoveRecursivelyFromIndex(ctx context.Conte // 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) } @@ -387,17 +390,17 @@ func (t *TemporaryUploadRepository) DiffIndex(ctx context.Context, oldContent, n } // 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 55a4e054af4..9de8516eedc 100644 --- a/services/repository/files/tree.go +++ b/services/repository/files/tree.go @@ -24,7 +24,7 @@ import ( // GetTreeBySHA get the GitTreeResponse of a repository using a sha hash (id of a commit or a tree) 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 { return nil, util.NewInvalidArgumentErrorf("sha not found [%s]", sha) } @@ -170,7 +170,7 @@ func listTreeNodes(ctx context.Context, repoLink string, renderedIconPool *filei if subTreePath[0] == '/' { subTreePath = subTreePath[1:] } - subNodes, err := listTreeNodes(ctx, repoLink, renderedIconPool, gitRepo, commit, entry.Tree(gitRepo), subTreePath, subPathRemaining) + subNodes, err := listTreeNodes(ctx, repoLink, renderedIconPool, gitRepo, commit, entry.Tree(ctx, gitRepo), subTreePath, subPathRemaining) if err != nil { log.Error("listTreeNodes: %v", err) } else { @@ -187,5 +187,5 @@ func GetTreeViewNodes(ctx context.Context, repoLink string, renderedIconPool *fi if err != nil { return nil, err } - return listTreeNodes(ctx, repoLink, renderedIconPool, gitRepo, commit, entry.Tree(gitRepo), treePath, subPath) + return listTreeNodes(ctx, repoLink, renderedIconPool, gitRepo, commit, entry.Tree(ctx, gitRepo), treePath, subPath) } diff --git a/services/repository/files/update.go b/services/repository/files/update.go index e4a6c7605fe..33cd2bf682c 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -202,7 +202,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 } @@ -211,7 +211,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) } @@ -282,7 +282,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 } @@ -295,7 +295,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") } } @@ -391,7 +391,7 @@ func handleCheckErrors(ctx context.Context, file *ChangeRepoFile, gitRepo *git.R // 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(gitRepo, file.Options.treePath, opts.LastCommitID); err != nil { + if changed, err := commit.FileChangedSinceCommit(ctx, gitRepo, file.Options.treePath, opts.LastCommitID); err != nil { return err } else if changed { return ErrCommitIDDoesNotMatch{ @@ -592,7 +592,7 @@ 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 } @@ -619,7 +619,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(t.gitRepo).DataAsync() + r, err := oldEntry.Blob(t.gitRepo).DataAsync(ctx) if err != nil { return lfsPointer, err } @@ -645,7 +645,7 @@ func writeRepoObjectForRename(ctx context.Context, t *TemporaryUploadRepository, if err != nil { return nil, err } - ret.LfsContent, err = oldEntry.Blob(t.gitRepo).DataAsync() + ret.LfsContent, err = oldEntry.Blob(t.gitRepo).DataAsync(ctx) if err != nil { return nil, err } diff --git a/services/repository/fork.go b/services/repository/fork.go index a469836da03..16975485418 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 ab0203f4d52..c744a13de2b 100644 --- a/services/repository/gitgraph/graph.go +++ b/services/repository/gitgraph/graph.go @@ -6,6 +6,7 @@ package gitgraph import ( "bufio" "bytes" + "context" "gitea.dev/modules/git" "gitea.dev/modules/git/gitcmd" @@ -13,7 +14,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 { @@ -97,7 +98,7 @@ func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bo } return scanner.Err() }). - RunWithStderr(r.Ctx); err != nil { + RunWithStderr(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 99f8222ca7c..5ba47c5122d 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 a6cc0ae048b..c61a85d2d60 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 c75c66af1ec..919781cabe7 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 08a5ab494e0..0de365864d8 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 959565d393e..95059e1d015 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 @@ -131,7 +131,7 @@ func UpdateRepoLicenses(ctx context.Context, repo *repo_model.Repository, gitRep 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 c328d070c86..39938fcc78f 100644 --- a/services/repository/migrate.go +++ b/services/repository/migrate.go @@ -122,13 +122,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 678a4bd5e6d..ae9963143f4 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -74,7 +74,7 @@ func pushQueueHandleUpdates(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) } @@ -120,11 +120,11 @@ func pushQueueHandleUpdates(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) { - log.Error("Unable to get tag commit: gitRepo.GetCommit(%s) in %s/%s[%d]: %v", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) + log.Error("Unable to get tag commit: gitRepo.GetCommit(ctx, %s) in %s/%s[%d]: %v", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) } } else { commits := repo_module.NewPushCommits() @@ -160,9 +160,9 @@ func pushQueueHandleUpdates(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) + return fmt.Errorf("gitRepo.GetCommit(ctx, %s) in %s/%s[%d]: %w", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) } // Push new branch. @@ -197,7 +197,7 @@ func pushQueueHandleUpdates(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] @@ -236,10 +236,10 @@ func pushQueueHandleUpdates(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) } @@ -279,7 +279,7 @@ func pushNewBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *gi } } - l, err := newCommit.CommitsBeforeLimit(gitRepo, 10) + l, err := newCommit.CommitsBeforeLimit(ctx, gitRepo, 10) if err != nil { return nil, fmt.Errorf("newCommit.CommitsBeforeLimit: %w", err) } @@ -288,7 +288,7 @@ func pushNewBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *gi } func pushUpdateBranch(ctx context.Context, repo *repo_model.Repository, gitRepo *git.Repository, pusher *user_model.User, opts *repo_module.PushUpdateOptions, newCommit *git.Commit) ([]*git.Commit, error) { - l, err := newCommit.CommitsBeforeUntil(gitRepo, git.RefNameFromCommit(opts.OldCommitID)) + l, err := newCommit.CommitsBeforeUntil(ctx, gitRepo, git.RefNameFromCommit(opts.OldCommitID)) if err != nil { return nil, fmt.Errorf("newCommit.CommitsBeforeUntil: %w", err) } @@ -370,11 +370,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/wiki/wiki.go b/services/wiki/wiki.go index d1006abf7e8..b235b828982 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -52,12 +52,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 gitcmd.IsStderr(err, gitcmd.StderrNotValidObjectName) { return false, gitPath, nil // branch doesn't exist @@ -123,7 +123,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) @@ -131,13 +131,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("unable 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 } @@ -153,14 +153,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 @@ -170,18 +170,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.HashObjectBytes([]byte(content)) + objectHash, err := gitRepo.HashObjectBytes(ctx, []byte(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 @@ -212,7 +212,7 @@ 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 @@ -282,24 +282,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 } @@ -309,7 +309,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 } @@ -337,12 +337,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 := gitrepo.PushFromLocal(gitRepo.Ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ + if err := gitrepo.PushFromLocal(ctx, basePath, repo.WikiStorageRepo(), git.PushOptions{ Branch: fmt.Sprintf("%s:%s%s", commitHash.String(), git.BranchPrefix, repo.DefaultWikiBranch), Env: repo_module.FullPushingEnvironment( doer, diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go index 11d2717ad65..8e390e835a2 100644 --- a/services/wiki/wiki_test.go +++ b/services/wiki/wiki_test.go @@ -167,11 +167,11 @@ 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(t.Context(), gitRepo, gitPath) @@ -214,9 +214,9 @@ 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(t.Context(), gitRepo, gitPath) @@ -238,11 +238,11 @@ 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(t.Context(), gitRepo, gitPath) @@ -252,7 +252,7 @@ func TestRepository_DeleteWikiPage(t *testing.T) { 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 aa11da83ad9..aef0f3c2cc7 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -477,14 +477,14 @@ 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) assert.NoError(t, err) // create a branch - err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, branch.CommitID, "test-create-branch") + err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-create-branch") assert.NoError(t, err) run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ Title: "add workflow", @@ -602,8 +602,7 @@ jobs: // create a new branch testBranch := "test-branch" - err = repo_service.CreateNewBranch(t.Context(), user2, repo, "main", testBranch) - assert.NoError(t, err) + testCreateBranch(t, ctx.Session, repo.OwnerName, repo.Name, "branch/main", testBranch, http.StatusSeeOther) // create Pull pullIssue := &issues_model.Issue{ @@ -830,8 +829,7 @@ jobs: // create a branch and a PR testBranch := "test-review-branch" - err = repo_service.CreateNewBranch(t.Context(), user2, repo, "main", testBranch) - assert.NoError(t, err) + testCreateBranch(t, ctx.Session, repo.OwnerName, repo.Name, "branch/main", testBranch, http.StatusSeeOther) // add a file on the test branch so the PR has changes addFileResp, err := files_service.ChangeRepoFiles(t.Context(), repo, user2, &files_service.ChangeRepoFilesOptions{ @@ -883,7 +881,7 @@ jobs: assert.NoError(t, err) // submit an approval review as user4 - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) assert.NoError(t, err) defer gitRepo.Close() @@ -963,7 +961,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) @@ -1134,7 +1132,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) @@ -1225,7 +1223,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) @@ -1311,7 +1309,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) @@ -1441,10 +1439,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", @@ -1639,7 +1637,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) @@ -1808,12 +1806,16 @@ jobs: assert.NoError(t, err) assert.NotEmpty(t, addWorkflowToBaseResp) + gitRepo, err := gitrepo.OpenRepository(repo) + assert.NoError(t, err) + defer gitRepo.Close() + // Get the commit ID of the default branch branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) assert.NoError(t, err) // create a branch - err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, branch.CommitID, "test-action-run-name-with-variables") + err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-action-run-name-with-variables") assert.NoError(t, err) run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ Title: user2.LoginName + " is running this workflow", @@ -1882,12 +1884,16 @@ jobs: assert.NoError(t, err) assert.NotEmpty(t, addWorkflowToBaseResp) + gitRepo, err := gitrepo.OpenRepository(repo) + assert.NoError(t, err) + defer gitRepo.Close() + // Get the commit ID of the default branch branch, err := git_model.GetBranch(t.Context(), repo.ID, repo.DefaultBranch) assert.NoError(t, err) // create a branch - err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, branch.CommitID, "test-action-run-name") + err = repo_service.CreateNewBranchFromCommit(t.Context(), user2, repo, gitRepo, branch.CommitID, "test-action-run-name") assert.NoError(t, err) run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ Title: "run name without variables", diff --git a/tests/integration/api_packages_cargo_test.go b/tests/integration/api_packages_cargo_test.go index 265749c37ed..9b6b810cb70 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(t.Context(), gitRepo, 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_pull_review_test.go b/tests/integration/api_pull_review_test.go index f7c7bdde160..e48a109b00b 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -375,11 +375,11 @@ func TestAPIPullReviewCommentResolveEndpoints(t *testing.T) { doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: pullIssue.PosterID}) require.NoError(t, pullIssue.LoadPullRequest(ctx)) - gitRepo, err := gitrepo.OpenRepository(ctx, repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() - latestCommitID, err := gitRepo.GetRefCommitID(pullIssue.PullRequest.GetGitHeadRefName()) + latestCommitID, err := gitRepo.GetRefCommitID(t.Context(), pullIssue.PullRequest.GetGitHeadRefName()) require.NoError(t, err) codeComment, err := pull_service.CreateCodeComment(ctx, doer, gitRepo, pullIssue, 1, "resolve comment", "README.md", false, 0, latestCommitID, nil) @@ -536,11 +536,11 @@ func testAPIPullReviewCommentReply(t *testing.T) { require.NoError(t, pullIssue.LoadRepo(t.Context())) require.NoError(t, pullIssue.LoadPullRequest(t.Context())) doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), pullIssue.Repo) + gitRepo, err := gitrepo.OpenRepository(pullIssue.Repo) require.NoError(t, err) defer gitRepo.Close() - commitID, err := gitRepo.GetRefCommitID(pullIssue.PullRequest.GetGitHeadRefName()) + commitID, err := gitRepo.GetRefCommitID(t.Context(), pullIssue.PullRequest.GetGitHeadRefName()) require.NoError(t, err) parent, err := pull_service.CreateCodeComment(t.Context(), doer, gitRepo, pullIssue, 1, "parent comment", "README.md", false, 0, commitID, nil) diff --git a/tests/integration/api_releases_test.go b/tests/integration/api_releases_test.go index 51cf3e23646..ffb92b82934 100644 --- a/tests/integration/api_releases_test.go +++ b/tests/integration/api_releases_test.go @@ -186,14 +186,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") @@ -237,11 +237,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{ @@ -273,11 +273,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 107a039e9d5..0a9cd65fa58 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -153,10 +153,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, @@ -276,10 +276,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 d2a191e12a8..53326ea626f 100644 --- a/tests/integration/api_repo_file_update_test.go +++ b/tests/integration/api_repo_file_update_test.go @@ -136,10 +136,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 c0306feae3f..9911053a07b 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 3fbdce9f68d..b8cc8ac0443 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 72ba1563d0c..5e17644403f 100644 --- a/tests/integration/api_repo_get_contents_list_test.go +++ b/tests/integration/api_repo_get_contents_list_test.go @@ -73,19 +73,19 @@ 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() // Make a new branch in repo1 newBranch := "test_branch" - err = repo_service.CreateNewBranch(t.Context(), user2, repo1, repo1.DefaultBranch, newBranch) + 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 ***/ @@ -96,7 +96,7 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { resp := MakeRequest(t, req, http.StatusOK) contentsListResponse := DecodeJSON(t, resp, []*api.ContentsResponse{}) 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) @@ -118,9 +118,9 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { resp = MakeRequest(t, req, http.StatusOK) contentsListResponse = DecodeJSON(t, resp, []*api.ContentsResponse{}) assert.NotNil(t, contentsListResponse) - branchCommit, err := gitRepo.GetBranchCommit(ref) + branchCommit, err := gitRepo.GetBranchCommit(t.Context(), ref) assert.NoError(t, err) - lastCommit, err = branchCommit.GetCommitByPath(gitRepo, "README.md") + lastCommit, err = branchCommit.GetCommitByPath(t.Context(), gitRepo, "README.md") assert.NoError(t, err) expectedContentsListResponse = getExpectedContentsListResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, expectedContentsListResponse, contentsListResponse) @@ -132,9 +132,9 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) { resp = MakeRequest(t, req, http.StatusOK) contentsListResponse = DecodeJSON(t, resp, []*api.ContentsResponse{}) assert.NotNil(t, contentsListResponse) - tagCommit, err := gitRepo.GetTagCommit(ref) + tagCommit, err := gitRepo.GetTagCommit(t.Context(), ref) assert.NoError(t, err) - lastCommit, err = tagCommit.GetCommitByPath(gitRepo, "README.md") + lastCommit, err = tagCommit.GetCommitByPath(t.Context(), gitRepo, "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 c12886d5832..8a1c993cd87 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -78,20 +78,20 @@ func testAPIGetContents(t *testing.T, _ *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() // Make a new branch in repo1 newBranch := "test_branch" - err = repo_service.CreateNewBranch(t.Context(), user2, repo1, repo1.DefaultBranch, newBranch) + 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 ***/ @@ -106,7 +106,7 @@ func testAPIGetContents(t *testing.T, _ *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) contentsResponse := DecodeJSON(t, resp, &api.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) @@ -124,8 +124,8 @@ func testAPIGetContents(t *testing.T, _ *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) contentsResponse = DecodeJSON(t, resp, &api.ContentsResponse{}) - branchCommit, _ := gitRepo.GetBranchCommit(ref) - lastCommit, _ = branchCommit.GetCommitByPath(gitRepo, "README.md") + branchCommit, _ := gitRepo.GetBranchCommit(t.Context(), ref) + lastCommit, _ = branchCommit.GetCommitByPath(t.Context(), gitRepo, "README.md") expectedContentsResponse = getExpectedContentsResponseForContents(ref, refType, lastCommit.ID.String()) assert.Equal(t, *expectedContentsResponse, *contentsResponse) @@ -135,8 +135,8 @@ func testAPIGetContents(t *testing.T, _ *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) contentsResponse = DecodeJSON(t, resp, &api.ContentsResponse{}) - tagCommit, _ := gitRepo.GetTagCommit(ref) - lastCommit, _ = tagCommit.GetCommitByPath(gitRepo, "README.md") + tagCommit, _ := gitRepo.GetTagCommit(t.Context(), ref) + lastCommit, _ = tagCommit.GetCommitByPath(t.Context(), gitRepo, "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 33a2d6c7e8a..279d974b1e8 100644 --- a/tests/integration/api_repo_git_tags_test.go +++ b/tests/integration/api_repo_git_tags_test.go @@ -31,17 +31,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/compare_test.go b/tests/integration/compare_test.go index ff2928c4aa0..e2b9b549188 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -182,12 +182,12 @@ func TestResolveRefWithSuffixContract(t *testing.T) { defer tests.PrepareTestEnv(t)() repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 31}) - gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + gitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) defer gitRepo.Close() // a nil error guarantees a usable RefName - ref, err := common.ResolveRefWithSuffix(gitRepo, "add-csv", "^") + ref, err := common.ResolveRefWithSuffix(t.Context(), gitRepo, "add-csv", "^") require.NoError(t, err) assert.NotEmpty(t, ref) // a ref resolved with a suffix must be a commit SHA, not a branch ref @@ -199,7 +199,7 @@ func TestResolveRefWithSuffixContract(t *testing.T) { {"does-not-exist", ""}, {"add-csv", "~50"}, } { - ref, err := common.ResolveRefWithSuffix(gitRepo, tc.oriRef, tc.suffix) + ref, err := common.ResolveRefWithSuffix(t.Context(), gitRepo, tc.oriRef, tc.suffix) assert.ErrorIs(t, err, util.ErrNotExist, "ref %q suffix %q", tc.oriRef, tc.suffix) assert.Empty(t, ref, "ref %q suffix %q", tc.oriRef, tc.suffix) } diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index ea4900b823e..12199131674 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -221,10 +221,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 } @@ -349,9 +349,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 30ccff49ab2..4da46711f38 100644 --- a/tests/integration/git_general_test.go +++ b/tests/integration/git_general_test.go @@ -811,7 +811,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() @@ -848,7 +848,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) }) @@ -920,7 +920,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 575fd3d15b6..934d66642b6 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(t.Context(), gitRepo, "test.txt") assert.NoError(t, err) b := entry.Blob(gitRepo) - 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() @@ -87,7 +87,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() @@ -150,7 +150,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() @@ -219,11 +219,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 8be4494eae0..de0a1ed466f 100644 --- a/tests/integration/git_push_test.go +++ b/tests/integration/git_push_test.go @@ -205,7 +205,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() @@ -229,7 +229,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/migrate_test.go b/tests/integration/migrate_test.go index 57e1e2b3417..71a99dd1973 100644 --- a/tests/integration/migrate_test.go +++ b/tests/integration/migrate_test.go @@ -336,11 +336,11 @@ func Test_MigrateFromGiteaToGitea(t *testing.T) { assert.False(t, pr13.HasMerged) assert.True(t, pr13.Issue.IsLocked) - gitRepo, err := gitrepo.OpenRepository(t.Context(), migratedRepo) + gitRepo, err := gitrepo.OpenRepository(migratedRepo) require.NoError(t, err) defer gitRepo.Close() - branches, _, err := gitRepo.GetBranchNames(0, 0) + branches, _, err := gitRepo.GetBranchNames(t.Context(), 0, 0) require.NoError(t, err) assert.ElementsMatch(t, []string{"6543-patch-1", "master", "6543-forks/add-xkcd-2199"}, branches) // last branch comes from the pull request @@ -350,7 +350,7 @@ func Test_MigrateFromGiteaToGitea(t *testing.T) { require.NoError(t, err) assert.ElementsMatch(t, []string{"6543-patch-1", "master", "6543-forks/add-xkcd-2199"}, branchNames) - tags, _, err := gitRepo.GetTagInfos(0, 0) + tags, _, err := gitRepo.GetTagInfos(t.Context(), 0, 0) require.NoError(t, err) tagNames := make([]string, 0, len(tags)) for _, tag := range tags { diff --git a/tests/integration/mirror_pull_test.go b/tests/integration/mirror_pull_test.go index 054664f24b5..5b1b301e31c 100644 --- a/tests/integration/mirror_pull_test.go +++ b/tests/integration/mirror_pull_test.go @@ -66,7 +66,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() @@ -79,7 +79,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(ctx, 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 f0a9228e03e..dfcb2ac2251 100644 --- a/tests/integration/mirror_push_test.go +++ b/tests/integration/mirror_push_test.go @@ -60,18 +60,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 e26676f7721..7ac4254250e 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -838,11 +838,11 @@ 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) - 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() @@ -910,9 +910,9 @@ 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) baseGitRepo.Close() @@ -1023,9 +1023,9 @@ 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) baseGitRepo.Close() err = commitstatus_service.CreateCommitStatus(t.Context(), baseRepo, user1, sha, &git_model.CommitStatus{ diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index b4ca6830e8a..45172bd6c70 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -100,10 +100,10 @@ func TestPullView_CodeOwner(t *testing.T) { // capture the current PR head ref so we can wait for the async // refs/pull/N/head sync triggered by the next push to complete - baseGitRepo, err := gitrepo.OpenRepository(t.Context(), repo) + baseGitRepo, err := gitrepo.OpenRepository(repo) require.NoError(t, err) defer baseGitRepo.Close() - headRefBefore, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headRefBefore, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) require.NoError(t, err) // update the file on the pr branch @@ -123,7 +123,7 @@ func TestPullView_CodeOwner(t *testing.T) { // it before evaluating code owners, otherwise the changed-file set may not // yet include user8-file.md and the review request would be missed require.Eventually(t, func() bool { - headRefAfter, err := baseGitRepo.GetRefCommitID(pr.GetGitHeadRefName()) + headRefAfter, err := baseGitRepo.GetRefCommitID(t.Context(), pr.GetGitHeadRefName()) return err == nil && headRefAfter != headRefBefore }, 30*time.Second, 100*time.Millisecond) diff --git a/tests/integration/repo_webhook_test.go b/tests/integration/repo_webhook_test.go index af309674cd7..b146c29dd36 100644 --- a/tests/integration/repo_webhook_test.go +++ b/tests/integration/repo_webhook_test.go @@ -410,17 +410,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 @@ -461,17 +461,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() @@ -926,9 +926,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 @@ -999,7 +999,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() @@ -1027,7 +1027,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 @@ -1191,7 +1191,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 @@ -1268,7 +1268,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 @@ -1316,7 +1316,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 @@ -1393,7 +1393,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 @@ -1486,7 +1486,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 @@ -1565,7 +1565,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 @@ -1704,7 +1704,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() @@ -1748,7 +1748,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 @@ -1805,7 +1805,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 @@ -1828,7 +1828,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 7f586e8880a..fa978edab6a 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -362,11 +362,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 { @@ -399,11 +399,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(gitRepo, opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), gitRepo, 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) @@ -435,11 +435,11 @@ 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(gitRepo, opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), gitRepo, 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(ctx, gitRepo, opts.Files[0].FromTreePath) @@ -481,11 +481,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(gitRepo, opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), gitRepo, 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 @@ -518,11 +518,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(gitRepo, opts.Files[0].TreePath) + commit, _ := gitRepo.GetBranchCommit(t.Context(), repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(t.Context(), gitRepo, 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]) })