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:
authorToon Claes <toon@gitlab.com>2022-09-30 10:17:50 +0300
committerToon Claes <toon@gitlab.com>2022-10-03 16:26:17 +0300
commit9328317e6e61d6f479a14871eb5360dea2f732a9 (patch)
treed97f8ba63f0e38d330bf94d0008832b2dcf9247a
parent2ae7de24d887eb5309420c151bdacdbfd8f880aa (diff)
linguist: Split function to initialize languageStats
The functionality of newLanguageStats() was a bit overloaded. Split it up and stop returning pointers.
-rw-r--r--internal/gitaly/linguist/language_stats.go28
-rw-r--r--internal/gitaly/linguist/language_stats_test.go38
-rw-r--r--internal/gitaly/linguist/linguist.go2
3 files changed, 36 insertions, 32 deletions
diff --git a/internal/gitaly/linguist/language_stats.go b/internal/gitaly/linguist/language_stats.go
index cefa3b644..5ae08c3d1 100644
--- a/internal/gitaly/linguist/language_stats.go
+++ b/internal/gitaly/linguist/language_stats.go
@@ -28,7 +28,7 @@ type languageStats struct {
CommitID string `json:"commit_id"`
// m will protect concurrent writes to Totals & ByFile maps
- m sync.Mutex
+ m *sync.Mutex
// Totals contains the total statistics for the CommitID
Totals ByteCountPerLanguage `json:"totals"`
@@ -37,43 +37,47 @@ type languageStats struct {
ByFile map[string]ByteCountPerLanguage `json:"by_file"`
}
-// newLanguageStats creates a languageStats object and tries to load the
-// optionally available stats from file.
-func newLanguageStats(repo *localrepo.Repo) (*languageStats, error) {
- stats := languageStats{
+func newLanguageStats() languageStats {
+ return languageStats{
Totals: ByteCountPerLanguage{},
ByFile: make(map[string]ByteCountPerLanguage),
+ m: &sync.Mutex{},
}
+}
+// initLanguageStats tries to load the optionally available stats from file or
+// returns a blank languageStats struct.
+func initLanguageStats(repo *localrepo.Repo) (languageStats, error) {
objPath, err := repo.Path()
if err != nil {
- return &stats, fmt.Errorf("new language stats get repo path: %w", err)
+ return newLanguageStats(), fmt.Errorf("new language stats get repo path: %w", err)
}
file, err := os.Open(filepath.Join(objPath, languageStatsFilename))
if err != nil {
if os.IsNotExist(err) {
- return &stats, nil
+ return newLanguageStats(), nil
}
- return &stats, fmt.Errorf("new language stats open: %w", err)
+ return newLanguageStats(), fmt.Errorf("new language stats open: %w", err)
}
defer file.Close()
r, err := zlib.NewReader(file)
if err != nil {
- return &stats, fmt.Errorf("new language stats zlib reader: %w", err)
+ return newLanguageStats(), fmt.Errorf("new language stats zlib reader: %w", err)
}
var loaded languageStats
if err = json.NewDecoder(r).Decode(&loaded); err != nil {
- return &stats, fmt.Errorf("new language stats json decode: %w", err)
+ return newLanguageStats(), fmt.Errorf("new language stats json decode: %w", err)
}
if loaded.Version != languageStatsVersion {
- return &stats, fmt.Errorf("new language stats version mismatch %s vs %s", languageStatsVersion, loaded.Version)
+ return newLanguageStats(), fmt.Errorf("new language stats version mismatch %s vs %s", languageStatsVersion, loaded.Version)
}
- return &loaded, nil
+ loaded.m = &sync.Mutex{}
+ return loaded, nil
}
// add the statistics for the given filename
diff --git a/internal/gitaly/linguist/language_stats_test.go b/internal/gitaly/linguist/language_stats_test.go
index 9199f6eb8..02ec820c1 100644
--- a/internal/gitaly/linguist/language_stats_test.go
+++ b/internal/gitaly/linguist/language_stats_test.go
@@ -17,7 +17,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v15/internal/testhelper/testcfg"
)
-func TestNewLanguageStats(t *testing.T) {
+func TestInitLanguageStats(t *testing.T) {
t.Parallel()
ctx := testhelper.Context(t)
@@ -30,7 +30,7 @@ func TestNewLanguageStats(t *testing.T) {
{
desc: "non-existing cache",
run: func(t *testing.T, repo *localrepo.Repo, repoPath string) {
- stats, err := newLanguageStats(repo)
+ stats, err := initLanguageStats(repo)
require.NoError(t, err)
require.Empty(t, stats.Totals)
require.Empty(t, stats.ByFile)
@@ -39,7 +39,7 @@ func TestNewLanguageStats(t *testing.T) {
{
desc: "pre-existing cache",
run: func(t *testing.T, repo *localrepo.Repo, repoPath string) {
- stats, err := newLanguageStats(repo)
+ stats, err := initLanguageStats(repo)
require.NoError(t, err)
stats.Totals["C"] = 555
@@ -53,7 +53,7 @@ func TestNewLanguageStats(t *testing.T) {
run: func(t *testing.T, repo *localrepo.Repo, repoPath string) {
require.NoError(t, os.WriteFile(filepath.Join(repoPath, languageStatsFilename), []byte("garbage"), 0o644))
- stats, err := newLanguageStats(repo)
+ stats, err := initLanguageStats(repo)
require.Errorf(t, err, "new language stats zlib reader: invalid header")
require.Empty(t, stats.Totals)
require.Empty(t, stats.ByFile)
@@ -62,7 +62,7 @@ func TestNewLanguageStats(t *testing.T) {
{
desc: "incorrect version cache",
run: func(t *testing.T, repo *localrepo.Repo, repoPath string) {
- stats, err := newLanguageStats(repo)
+ stats, err := initLanguageStats(repo)
require.NoError(t, err)
stats.Totals["C"] = 555
@@ -77,7 +77,7 @@ func TestNewLanguageStats(t *testing.T) {
require.NoError(t, file.Sync())
require.NoError(t, file.Close())
- newStats, err := newLanguageStats(repo)
+ newStats, err := initLanguageStats(repo)
require.Error(t, err, fmt.Errorf("new language stats version mismatch %s vs %s", languageStatsVersion, "faulty"))
require.Empty(t, newStats.Totals)
},
@@ -106,11 +106,11 @@ func TestLanguageStats_add(t *testing.T) {
for _, tc := range []struct {
desc string
- run func(*testing.T, *languageStats)
+ run func(*testing.T, languageStats)
}{
{
desc: "adds to the total",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.add("main.go", "Go", 100)
require.Equal(t, uint64(100), s.Totals["Go"])
@@ -120,7 +120,7 @@ func TestLanguageStats_add(t *testing.T) {
},
{
desc: "accumulates",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.add("main.go", "Go", 100)
s.add("main_test.go", "Go", 80)
@@ -132,7 +132,7 @@ func TestLanguageStats_add(t *testing.T) {
},
{
desc: "languages don't interfere",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.add("main.go", "Go", 60)
s.add("Makefile", "Make", 30)
@@ -145,7 +145,7 @@ func TestLanguageStats_add(t *testing.T) {
},
{
desc: "updates the stat for a file",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.add("main.go", "Go", 60)
s.add("main.go", "Go", 30)
@@ -156,7 +156,7 @@ func TestLanguageStats_add(t *testing.T) {
},
} {
t.Run(tc.desc, func(t *testing.T) {
- s, err := newLanguageStats(repo)
+ s, err := initLanguageStats(repo)
require.NoError(t, err)
tc.run(t, s)
@@ -177,11 +177,11 @@ func TestLanguageStats_drop(t *testing.T) {
for _, tc := range []struct {
desc string
- run func(*testing.T, *languageStats)
+ run func(*testing.T, languageStats)
}{
{
desc: "existing file",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.drop("main.go")
require.Equal(t, uint64(20), s.Totals["Go"])
@@ -191,7 +191,7 @@ func TestLanguageStats_drop(t *testing.T) {
},
{
desc: "non-existing file",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.drop("foo.go")
require.Equal(t, uint64(100), s.Totals["Go"])
@@ -202,7 +202,7 @@ func TestLanguageStats_drop(t *testing.T) {
},
{
desc: "all files",
- run: func(t *testing.T, s *languageStats) {
+ run: func(t *testing.T, s languageStats) {
s.drop("main.go", "main_test.go")
require.Empty(t, s.Totals)
@@ -211,7 +211,7 @@ func TestLanguageStats_drop(t *testing.T) {
},
} {
t.Run(tc.desc, func(t *testing.T) {
- s, err := newLanguageStats(repo)
+ s, err := initLanguageStats(repo)
require.NoError(t, err)
s.Totals["Go"] = 100
@@ -233,7 +233,7 @@ func TestLanguageStats_save(t *testing.T) {
})
repo := localrepo.NewTestRepo(t, cfg, repoProto)
- s, err := newLanguageStats(repo)
+ s, err := initLanguageStats(repo)
require.NoError(t, err)
s.Totals["Go"] = 100
@@ -244,7 +244,7 @@ func TestLanguageStats_save(t *testing.T) {
require.NoError(t, err)
require.FileExists(t, filepath.Join(repoPath, languageStatsFilename))
- loaded, err := newLanguageStats(repo)
+ loaded, err := initLanguageStats(repo)
require.NoError(t, err)
require.Equal(t, "buzz", loaded.CommitID)
diff --git a/internal/gitaly/linguist/linguist.go b/internal/gitaly/linguist/linguist.go
index 95610c904..af758e8f3 100644
--- a/internal/gitaly/linguist/linguist.go
+++ b/internal/gitaly/linguist/linguist.go
@@ -107,7 +107,7 @@ func (inst *Instance) startGitLinguist(ctx context.Context, commitID string) (*c
}
func (inst *Instance) enryStats(ctx context.Context, commitID string) (ByteCountPerLanguage, error) {
- stats, err := newLanguageStats(inst.repo)
+ stats, err := initLanguageStats(inst.repo)
if err != nil {
ctxlogrus.Extract(ctx).WithError(err).Info("linguist load from cache")
}