diff options
author | David Kim <dkim@gitlab.com> | 2023-10-23 11:17:29 +0300 |
---|---|---|
committer | David Kim <dkim@gitlab.com> | 2023-10-31 14:44:36 +0300 |
commit | a0bc586071f013b2a1bb94b115da9f32b38d0659 (patch) | |
tree | 7c743c153f3cbcb810e03eb586010b4e9a8f235a | |
parent | 1f6dad1a67791dd3513cc66344ba27c371c4c410 (diff) |
Create linguist instance & CheckAttr only once
-rw-r--r-- | internal/gitaly/linguist/linguist.go | 34 | ||||
-rw-r--r-- | internal/gitaly/service/diff/commit_diff.go | 10 |
2 files changed, 31 insertions, 13 deletions
diff --git a/internal/gitaly/linguist/linguist.go b/internal/gitaly/linguist/linguist.go index 069b6dbcc..abe0395cb 100644 --- a/internal/gitaly/linguist/linguist.go +++ b/internal/gitaly/linguist/linguist.go @@ -24,6 +24,8 @@ type Instance struct { logger log.Logger catfileCache catfile.Cache repo *localrepo.Repo + ctx context.Context + checkAttrCmd *gitattributes.CheckAttrCmd } // New creates a new instance that can be used to calculate language stats for @@ -36,6 +38,23 @@ func New(logger log.Logger, catfileCache catfile.Cache, repo *localrepo.Repo) *I } } +func NewWithGitAttributes(logger log.Logger, catfileCache catfile.Cache, repo *localrepo.Repo, ctx context.Context, revision git.Revision) (*Instance, func(), error) { + attrs := []string{linguistGenerated} + + checkAttr, finishAttr, err := gitattributes.CheckAttr(ctx, repo, revision, attrs) + if err != nil { + return nil, nil, err + } + + return &Instance{ + logger: logger, + catfileCache: catfileCache, + repo: repo, + ctx: ctx, + checkAttrCmd: checkAttr, + }, finishAttr, nil +} + // Color returns the color Linguist has assigned to language. func Color(language string) string { if color := enry.GetColor(language); color != "#cccccc" { @@ -46,26 +65,19 @@ func Color(language string) string { return fmt.Sprintf("#%x", colorSha[0:3]) } -func (inst *Instance) IsGenerated(ctx context.Context, revision git.Revision, filename string, oid string) (bool, error) { - attrs := []string{linguistGenerated} - checkAttr, finishAttr, err := gitattributes.CheckAttr(ctx, inst.repo, revision, attrs) - if err != nil { - return false, err - } - defer finishAttr() - - fileInstance, err := newFileInstance(filename, checkAttr) +func (inst *Instance) IsGenerated(filename string, oid string) (bool, error) { + fileInstance, err := newFileInstance(filename, inst.checkAttrCmd) if err != nil { return false, fmt.Errorf("new file instance: %w", err) } - objectReader, cancel, err := inst.catfileCache.ObjectReader(ctx, inst.repo) + objectReader, cancel, err := inst.catfileCache.ObjectReader(inst.ctx, inst.repo) if err != nil { return false, fmt.Errorf("create object reader: %w", err) } defer cancel() - blob, err := objectReader.Object(ctx, git.Revision(oid)) + blob, err := objectReader.Object(inst.ctx, git.Revision(oid)) if err != nil { return false, fmt.Errorf("read object: %w", err) } diff --git a/internal/gitaly/service/diff/commit_diff.go b/internal/gitaly/service/diff/commit_diff.go index 9f3d5324d..e03231788 100644 --- a/internal/gitaly/service/diff/commit_diff.go +++ b/internal/gitaly/service/diff/commit_diff.go @@ -85,6 +85,13 @@ func (s *server) CommitDiff(in *gitalypb.CommitDiffRequest, stream gitalypb.Diff limits.SafeMaxLines = int(in.SafeMaxLines) limits.SafeMaxBytes = int(in.SafeMaxBytes) + linguistInstance, checkAttrFinish, err := linguist.NewWithGitAttributes(s.logger, s.catfileCache, repo, ctx, git.Revision(leftSha)) + if err != nil { + return structerr.NewAborted("send: %w", err) + } + + defer checkAttrFinish() + return s.eachDiff(ctx, repo, cmd, limits, func(diff *diff.Diff) error { response := &gitalypb.CommitDiffResponse{ FromPath: diff.FromPath, @@ -102,8 +109,7 @@ func (s *server) CommitDiff(in *gitalypb.CommitDiffRequest, stream gitalypb.Diff patch := diff.Patch if in.CollapseGenerated && in.CollapseDiffs { - instance := linguist.New(s.logger, s.catfileCache, repo) - linguistGenerated, err := instance.IsGenerated(ctx, git.Revision(leftSha), string(diff.FromPath), diff.FromID) + linguistGenerated, err := linguistInstance.IsGenerated(string(diff.FromPath), diff.FromID) if err != nil { return structerr.NewAborted("send: %w", err) } |