Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kim <dkim@gitlab.com>2023-10-23 11:17:29 +0300
committerDavid Kim <dkim@gitlab.com>2023-10-31 14:44:36 +0300
commita0bc586071f013b2a1bb94b115da9f32b38d0659 (patch)
tree7c743c153f3cbcb810e03eb586010b4e9a8f235a
parent1f6dad1a67791dd3513cc66344ba27c371c4c410 (diff)
Create linguist instance & CheckAttr only once
-rw-r--r--internal/gitaly/linguist/linguist.go34
-rw-r--r--internal/gitaly/service/diff/commit_diff.go10
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)
}