diff options
author | Toon Claes <toon@gitlab.com> | 2022-09-30 10:17:50 +0300 |
---|---|---|
committer | Toon Claes <toon@gitlab.com> | 2022-10-03 16:26:17 +0300 |
commit | 9328317e6e61d6f479a14871eb5360dea2f732a9 (patch) | |
tree | d97f8ba63f0e38d330bf94d0008832b2dcf9247a | |
parent | 2ae7de24d887eb5309420c151bdacdbfd8f880aa (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.go | 28 | ||||
-rw-r--r-- | internal/gitaly/linguist/language_stats_test.go | 38 | ||||
-rw-r--r-- | internal/gitaly/linguist/linguist.go | 2 |
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") } |