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-11-01 06:01:00 +0300
committerDavid Kim <dkim@gitlab.com>2023-11-01 06:42:52 +0300
commit86fc2a51f79a1a6f6d22101137b81f27daf8ed02 (patch)
treeb2fb133187c989fe707f9bab0e1b7a25e164ddc8
parentc4ac18ed82f0a2043a5420d050d9145c9778c600 (diff)
Add CheckAttrGenerated to pass in CheckAttr instead
-rw-r--r--internal/gitaly/linguist/linguist.go40
-rw-r--r--internal/gitaly/linguist/linguist_test.go12
-rw-r--r--internal/gitaly/service/commit/languages.go2
-rw-r--r--internal/gitaly/service/diff/commit_diff.go5
4 files changed, 27 insertions, 32 deletions
diff --git a/internal/gitaly/linguist/linguist.go b/internal/gitaly/linguist/linguist.go
index cb20d778b..cb09fa24d 100644
--- a/internal/gitaly/linguist/linguist.go
+++ b/internal/gitaly/linguist/linguist.go
@@ -21,41 +21,23 @@ type ByteCountPerLanguage map[string]uint64
// Instance is a holder of the defined in the system language settings.
type Instance struct {
+ ctx context.Context
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
// the given repo.
-func New(logger log.Logger, catfileCache catfile.Cache, repo *localrepo.Repo) *Instance {
+func New(ctx context.Context, logger log.Logger, catfileCache catfile.Cache, repo *localrepo.Repo) *Instance {
return &Instance{
+ ctx: ctx,
logger: logger,
catfileCache: catfileCache,
repo: repo,
}
}
-// NewWithGitAttributes creates a new instance with CheckAttrCmd
-func NewWithGitAttributes(ctx context.Context, logger log.Logger, catfileCache catfile.Cache, repo *localrepo.Repo, 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" {
@@ -67,8 +49,8 @@ func Color(language string) string {
}
// IsGenerated returns true if the given file is considered to be generated
-func (inst *Instance) IsGenerated(filename string, oid git.ObjectID) (bool, error) {
- fileInstance, err := newFileInstance(filename, inst.checkAttrCmd)
+func (inst *Instance) IsGenerated(checkAttrCmd *gitattributes.CheckAttrCmd, filename string, oid git.ObjectID) (bool, error) {
+ fileInstance, err := newFileInstance(filename, checkAttrCmd)
if err != nil {
return false, fmt.Errorf("new file instance: %w", err)
}
@@ -90,6 +72,18 @@ func (inst *Instance) IsGenerated(filename string, oid git.ObjectID) (bool, erro
return enry.IsGenerated(filename, content), nil
}
+// CheckAttrGenerated returns a CheckAttr that reads linguist-generated override
+func (inst *Instance) CheckAttrGenerated(revision git.Revision) (*gitattributes.CheckAttrCmd, func(), error) {
+ attrs := []string{linguistGenerated}
+
+ checkAttr, finishAttr, err := gitattributes.CheckAttr(inst.ctx, inst.repo, revision, attrs)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ return checkAttr, finishAttr, nil
+}
+
// readPartialObject reads given object upto the limit and discard the rest
func (inst *Instance) readPartialObject(oid git.ObjectID, limit int64) ([]byte, error) {
objectReader, cancel, err := inst.catfileCache.ObjectReader(inst.ctx, inst.repo)
diff --git a/internal/gitaly/linguist/linguist_test.go b/internal/gitaly/linguist/linguist_test.go
index d3b984ffe..085306a6c 100644
--- a/internal/gitaly/linguist/linguist_test.go
+++ b/internal/gitaly/linguist/linguist_test.go
@@ -366,7 +366,7 @@ func TestInstance_Stats(t *testing.T) {
// We simply run the linguist once before so that it can already
// write the cache.
- _, err := New(testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, commitID)
+ _, err := New(ctx, testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, commitID)
require.NoError(t, err)
require.FileExists(t, filepath.Join(repoPath, languageStatsFilename))
@@ -397,7 +397,7 @@ func TestInstance_Stats(t *testing.T) {
))
repo := localrepo.NewTestRepo(t, cfg, repoProto)
- _, err := New(testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, commitID)
+ _, err := New(ctx, testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, commitID)
require.NoError(t, err)
require.FileExists(t, filepath.Join(repoPath, languageStatsFilename))
@@ -485,7 +485,7 @@ func TestInstance_Stats(t *testing.T) {
// Precreate the cache with the old commit. This ensures that
// linguist knows to update the cache.
- stats, err := New(testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, oldCommitID)
+ stats, err := New(ctx, testhelper.NewLogger(t), catfileCache, repo).Stats(ctx, oldCommitID)
require.NoError(t, err)
require.FileExists(t, filepath.Join(repoPath, languageStatsFilename))
require.Equal(t, ByteCountPerLanguage{
@@ -524,7 +524,7 @@ func TestInstance_Stats(t *testing.T) {
repoProto, repoPath, objectID := tc.setup(t)
repo := localrepo.NewTestRepo(t, cfg, repoProto)
- linguist := New(testhelper.NewLogger(t), catfileCache, repo)
+ linguist := New(ctx, testhelper.NewLogger(t), catfileCache, repo)
stats, err := linguist.Stats(ctx, objectID)
if tc.expectedErr == "" {
require.NoError(t, err)
@@ -568,7 +568,7 @@ func TestInstance_Stats_failureGitattributes(t *testing.T) {
repo := localrepo.New(logger, locator, gitCmdFactory, catfileCache, repoProto)
- linguist := New(logger, catfileCache, repo)
+ linguist := New(ctx, logger, catfileCache, repo)
_, err := linguist.Stats(ctx, commitID)
expectedErr := `linguist object iterator: ls-tree skip: new file instance: checking attribute:`
@@ -609,7 +609,7 @@ func BenchmarkInstance_Stats(b *testing.B) {
})
repo := localrepo.NewTestRepo(b, cfg, repoProto)
- linguist := New(testhelper.NewLogger(b), catfileCache, repo)
+ linguist := New(ctx, testhelper.NewLogger(b), catfileCache, repo)
var scratchStat ByteCountPerLanguage
var incStats ByteCountPerLanguage
diff --git a/internal/gitaly/service/commit/languages.go b/internal/gitaly/service/commit/languages.go
index aa87a55f2..e2c2e48ef 100644
--- a/internal/gitaly/service/commit/languages.go
+++ b/internal/gitaly/service/commit/languages.go
@@ -49,7 +49,7 @@ func (s *server) CommitLanguages(ctx context.Context, req *gitalypb.CommitLangua
return nil, structerr.NewInternal("looking up revision: %w", err)
}
- stats, err := linguist.New(s.logger, s.catfileCache, repo).Stats(ctx, git.ObjectID(commitID))
+ stats, err := linguist.New(ctx, s.logger, s.catfileCache, repo).Stats(ctx, git.ObjectID(commitID))
if err != nil {
return nil, structerr.NewInternal("language stats: %w", err)
}
diff --git a/internal/gitaly/service/diff/commit_diff.go b/internal/gitaly/service/diff/commit_diff.go
index 23518ceec..5ac288b43 100644
--- a/internal/gitaly/service/diff/commit_diff.go
+++ b/internal/gitaly/service/diff/commit_diff.go
@@ -85,7 +85,8 @@ 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(ctx, s.logger, s.catfileCache, repo, git.Revision(leftSha))
+ linguistInstance := linguist.New(ctx, s.logger, s.catfileCache, repo)
+ checkAttrCmd, checkAttrFinish, err := linguistInstance.CheckAttrGenerated(git.Revision(leftSha))
if err != nil {
return structerr.NewAborted("send: %w", err)
}
@@ -114,7 +115,7 @@ func (s *server) CommitDiff(in *gitalypb.CommitDiffRequest, stream gitalypb.Diff
oid = git.ObjectID(diff.ToID)
}
- linguistGenerated, err := linguistInstance.IsGenerated(string(diff.FromPath), oid)
+ linguistGenerated, err := linguistInstance.IsGenerated(checkAttrCmd, string(diff.FromPath), oid)
if err != nil {
return structerr.NewAborted("send: %w", err)
}