Skip to content

Commit 3a89dca

Browse files
committed
chore: Expanding lll coverage to discovery
1 parent 173072a commit 3a89dca

7 files changed

Lines changed: 115 additions & 46 deletions

File tree

.golangci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ linters:
121121
# trying to get this merged in.
122122
- linters:
123123
- lll
124-
path-except: '^(internal/awshelper/|internal/cas/|internal/cli/commands/(backend/(delete|migrate)|catalog/tui/command|dag/graph|exec|find|help|list|scaffold|stack)/|internal/cloner/|internal/codegen/|internal/configbridge/|internal/engine/|internal/errorconfig/|internal/errors/|internal/experiment/|internal/gcphelper/|internal/git/|internal/os/exec/|internal/prepare/|internal/queue/|internal/report/|internal/retry/|internal/runner/(common|graph|run/creds|runall|runcfg)/|internal/stacks/(generate|output)/|internal/telemetry/|internal/tf/cache/(controllers|middleware)/|internal/tflint/|internal/tips/|internal/vfs/|internal/worktrees/|pkg/log/(format/(options|placeholders)|writer)/|pkg/options/)'
124+
path-except: '^(internal/awshelper/|internal/cas/|internal/cli/commands/(backend/(delete|migrate)|catalog/tui/command|dag/graph|exec|find|help|list|scaffold|stack)/|internal/cloner/|internal/codegen/|internal/configbridge/|internal/discovery/|internal/engine/|internal/errorconfig/|internal/errors/|internal/experiment/|internal/gcphelper/|internal/git/|internal/os/exec/|internal/prepare/|internal/queue/|internal/report/|internal/retry/|internal/runner/(common|graph|run/creds|runall|runcfg)/|internal/stacks/(generate|output)/|internal/telemetry/|internal/tf/cache/(controllers|middleware)/|internal/tflint/|internal/tips/|internal/vfs/|internal/worktrees/|pkg/log/(format/(options|placeholders)|writer)/|pkg/options/)'
125125
paths:
126126
- docs
127127
- _ci

internal/discovery/discovery.go

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -78,24 +78,26 @@ func (d *Discovery) Discover(
7878
components = filtered
7979
}
8080

81-
cycleCheckErr := telemetry.TelemeterFromContext(ctx).Collect(ctx, "discovery_cycle_check", map[string]any{}, func(childCtx context.Context) error {
82-
if _, cycleErr := components.CycleCheck(); cycleErr != nil {
83-
l.Debugf("Cycle: %v", cycleErr)
81+
cycleCheckErr := telemetry.TelemeterFromContext(ctx).Collect(
82+
ctx, "discovery_cycle_check", map[string]any{},
83+
func(childCtx context.Context) error {
84+
if _, cycleErr := components.CycleCheck(); cycleErr != nil {
85+
l.Debugf("Cycle: %v", cycleErr)
8486

85-
if d.breakCycles {
86-
l.Warnf("Cycle detected in dependency graph, attempting removal of cycles.")
87+
if d.breakCycles {
88+
l.Warnf("Cycle detected in dependency graph, attempting removal of cycles.")
8789

88-
var removeErr error
90+
var removeErr error
8991

90-
components, removeErr = removeCycles(components)
91-
if removeErr != nil {
92-
return removeErr
92+
components, removeErr = removeCycles(components)
93+
if removeErr != nil {
94+
return removeErr
95+
}
9396
}
9497
}
95-
}
9698

97-
return nil
98-
})
99+
return nil
100+
})
99101

100102
if cycleCheckErr != nil && !d.suppressParseErrors {
101103
return components, cycleCheckErr
@@ -250,10 +252,12 @@ func (d *Discovery) runGraphPhase(
250252

251253
var buildErrs []error
252254

253-
telemetry.TelemeterFromContext(ctx).Collect(ctx, "discover_dependents", map[string]any{}, func(childCtx context.Context) error { //nolint:errcheck
254-
buildErrs = d.buildDependencyGraph(childCtx, l, opts, allComponents)
255-
return errors.Join(buildErrs...)
256-
})
255+
telemetry.TelemeterFromContext(ctx).Collect( //nolint:errcheck
256+
ctx, "discover_dependents", map[string]any{},
257+
func(childCtx context.Context) error {
258+
buildErrs = d.buildDependencyGraph(childCtx, l, opts, allComponents)
259+
return errors.Join(buildErrs...)
260+
})
257261

258262
if len(buildErrs) > 0 && !d.suppressParseErrors {
259263
return &PhaseResults{
@@ -270,17 +274,19 @@ func (d *Discovery) runGraphPhase(
270274
err error
271275
)
272276

273-
telemetry.TelemeterFromContext(ctx).Collect(ctx, "discover_dependencies", map[string]any{}, func(childCtx context.Context) error { //nolint:errcheck
274-
result, err = phase.Run(childCtx, l, &PhaseInput{
275-
Opts: opts,
276-
Components: resultsToComponents(discovered),
277-
Candidates: candidates,
278-
Classifier: d.classifier,
279-
Discovery: d,
280-
})
277+
telemetry.TelemeterFromContext(ctx).Collect( //nolint:errcheck
278+
ctx, "discover_dependencies", map[string]any{},
279+
func(childCtx context.Context) error {
280+
result, err = phase.Run(childCtx, l, &PhaseInput{
281+
Opts: opts,
282+
Components: resultsToComponents(discovered),
283+
Candidates: candidates,
284+
Classifier: d.classifier,
285+
Discovery: d,
286+
})
281287

282-
return err
283-
})
288+
return err
289+
})
284290

285291
allDiscovered := discovered
286292
if result != nil {
@@ -580,14 +586,20 @@ func filterByAllowSet(components component.Components, allowed map[string]struct
580586

581587
// applyQueueFilters marks discovered units as excluded or included based on queue-related CLI flags and config.
582588
// The runner consumes the exclusion markers instead of re-evaluating the filters.
583-
func (d *Discovery) applyQueueFilters(opts *options.TerragruntOptions, components component.Components) component.Components {
589+
func (d *Discovery) applyQueueFilters(
590+
opts *options.TerragruntOptions,
591+
components component.Components,
592+
) component.Components {
584593
components = d.applyExcludeModules(opts, components)
585594

586595
return components
587596
}
588597

589598
// applyExcludeModules marks units (and optionally their dependencies) excluded via terragrunt exclude blocks.
590-
func (d *Discovery) applyExcludeModules(opts *options.TerragruntOptions, components component.Components) component.Components {
599+
func (d *Discovery) applyExcludeModules(
600+
opts *options.TerragruntOptions,
601+
components component.Components,
602+
) component.Components {
591603
for _, c := range components {
592604
unit, ok := c.(*component.Unit)
593605
if !ok {

internal/discovery/filter_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,9 @@ dependency "vpc" {
10851085

10861086
// Should include vpc (target) and db (direct dependent) and app (transitive dependent)
10871087
units := components.Filter(component.UnitKind).Paths()
1088-
assert.ElementsMatch(t, []string{vpcDir, dbDir, appDir}, units, "...vpc should find vpc and all its dependents (db, app)")
1088+
assert.ElementsMatch(t,
1089+
[]string{vpcDir, dbDir, appDir}, units,
1090+
"...vpc should find vpc and all its dependents (db, app)")
10891091
}
10901092

10911093
// TestDiscovery_DependentDiscovery_ExcludeTarget tests dependent discovery with target exclusion (^...vpc).
@@ -1290,7 +1292,9 @@ dependency "vpc" {
12901292

12911293
// Should include: app (dependent), db (target), vpc (dependency)
12921294
units := components.Filter(component.UnitKind).Paths()
1293-
assert.ElementsMatch(t, []string{appDir, dbDir, vpcDir}, units, "...db... should find dependents, target, and dependencies")
1295+
assert.ElementsMatch(t,
1296+
[]string{appDir, dbDir, vpcDir}, units,
1297+
"...db... should find dependents, target, and dependencies")
12941298
}
12951299

12961300
// TestDiscovery_DependentDiscovery_OutsideWorkingDir tests that dependent discovery
@@ -1370,7 +1374,9 @@ dependency "vpc" {
13701374
units := components.Filter(component.UnitKind).Paths()
13711375
assert.Contains(t, units, vpcDir, "vpc should be discovered as the target")
13721376
assert.Contains(t, units, consumerDir, "consumer should be discovered even though it's outside working dir")
1373-
assert.ElementsMatch(t, []string{vpcDir, consumerDir}, units, "...vpc should find vpc and consumer (outside working dir)")
1377+
assert.ElementsMatch(t,
1378+
[]string{vpcDir, consumerDir}, units,
1379+
"...vpc should find vpc and consumer (outside working dir)")
13741380
}
13751381

13761382
// TestDiscovery_DependentDiscovery_OutsideWorkingDir_MultipleLevels tests that dependent discovery

internal/discovery/helpers.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,11 @@ func extractDependencyPaths(cfg *config.TerragruntConfig, c component.Component)
253253
}
254254

255255
if !config.IsValidConfigPath(dependency.ConfigPath) {
256-
errs = append(errs, errors.Errorf("skipping dependency %q in %q: config_path could not be resolved", dependency.Name, c.Path()))
256+
errs = append(errs, errors.Errorf(
257+
"skipping dependency %q in %q: "+
258+
"config_path could not be resolved",
259+
dependency.Name, c.Path()))
260+
257261
continue
258262
}
259263

internal/discovery/phase_graph.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,9 @@ func (p *GraphPhase) discoverDependentsUpstream(
440440
boundaryRoot string,
441441
depthRemaining int,
442442
) error {
443-
l.Debugf("discoverDependentsUpstream: target=%s currentDir=%s boundary=%s depth=%d", target.Path(), currentDir, boundaryRoot, depthRemaining)
443+
l.Debugf("discoverDependentsUpstream: target=%s"+
444+
" currentDir=%s boundary=%s depth=%d",
445+
target.Path(), currentDir, boundaryRoot, depthRemaining)
444446

445447
if depthRemaining <= 0 {
446448
l.Debugf("discoverDependentsUpstream: depth limit reached")

internal/discovery/phase_parse.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,11 @@ func parseComponent(
230230
parseOpts.TerragruntConfigPath = filepath.Join(parseOpts.WorkingDir, configFilename)
231231
parseOpts.OriginalTerragruntConfigPath = parseOpts.TerragruntConfigPath
232232

233-
if _, err := creds.ObtainCredsForParsing(ctx, l, parseOpts.AuthProviderCmd, parseOpts.Env, configbridge.ShellRunOptsFromOpts(parseOpts)); err != nil {
233+
shellRunOpts := configbridge.ShellRunOptsFromOpts(parseOpts)
234+
if _, err := creds.ObtainCredsForParsing(
235+
ctx, l, parseOpts.AuthProviderCmd,
236+
parseOpts.Env, shellRunOpts,
237+
); err != nil {
234238
return err
235239
}
236240

internal/discovery/phase_worktree_integration_test.go

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,11 @@ func TestWorktreePhase_Integration_CommandArgs(t *testing.T) {
177177
// Set up discovery
178178
l := logger.CreateLogger()
179179

180-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
180+
wtOpts := worktrees.WorktreeOpts{
181+
WorkingDir: tmpDir,
182+
GitExpressions: gitExpressions,
183+
}
184+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
181185
require.NoError(t, err)
182186

183187
t.Cleanup(func() {
@@ -447,7 +451,11 @@ unit "unit_to_be_untouched" {
447451
l := logger.CreateLogger()
448452
gitExpressions := filter.GitExpressions{filter.NewGitExpression("HEAD~1", "HEAD")}
449453

450-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
454+
wtOpts := worktrees.WorktreeOpts{
455+
WorkingDir: tmpDir,
456+
GitExpressions: gitExpressions,
457+
}
458+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
451459
require.NoError(t, err)
452460

453461
t.Cleanup(func() {
@@ -807,7 +815,11 @@ locals {
807815
require.NoError(t, err)
808816

809817
// Create worktrees
810-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: filters.UniqueGitFilters()})
818+
wtOpts := worktrees.WorktreeOpts{
819+
WorkingDir: tmpDir,
820+
GitExpressions: filters.UniqueGitFilters(),
821+
}
822+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
811823
require.NoError(t, err)
812824

813825
t.Cleanup(func() {
@@ -901,7 +913,11 @@ locals {
901913
require.NoError(t, err)
902914

903915
// Create worktrees from the subdirectory
904-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: basicDir, GitExpressions: filters.UniqueGitFilters()})
916+
wtOpts := worktrees.WorktreeOpts{
917+
WorkingDir: basicDir,
918+
GitExpressions: filters.UniqueGitFilters(),
919+
}
920+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
905921
require.NoError(t, err)
906922

907923
t.Cleanup(func() {
@@ -1166,7 +1182,11 @@ locals {
11661182
require.NoError(t, err)
11671183

11681184
// Create worktrees
1169-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: filters.UniqueGitFilters()})
1185+
wtOpts := worktrees.WorktreeOpts{
1186+
WorkingDir: tmpDir,
1187+
GitExpressions: filters.UniqueGitFilters(),
1188+
}
1189+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
11701190
require.NoError(t, err)
11711191

11721192
t.Cleanup(func() {
@@ -1263,7 +1283,11 @@ func TestWorktreePhase_Integration_FromSubdirectory_MultipleCommits(t *testing.T
12631283
require.NoError(t, err)
12641284

12651285
// Create worktrees from the subdirectory
1266-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: basicDir, GitExpressions: filters.UniqueGitFilters()})
1286+
wtOpts := worktrees.WorktreeOpts{
1287+
WorkingDir: basicDir,
1288+
GitExpressions: filters.UniqueGitFilters(),
1289+
}
1290+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
12671291
require.NoError(t, err)
12681292

12691293
t.Cleanup(func() {
@@ -1441,7 +1465,11 @@ unit "app" {
14411465
l := logger.CreateLogger()
14421466
gitExpressions := filter.GitExpressions{filter.NewGitExpression("HEAD~1", "HEAD")}
14431467

1444-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
1468+
wtOpts := worktrees.WorktreeOpts{
1469+
WorkingDir: tmpDir,
1470+
GitExpressions: gitExpressions,
1471+
}
1472+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
14451473
require.NoError(t, err)
14461474

14471475
t.Cleanup(func() {
@@ -1603,7 +1631,11 @@ unit "app" {
16031631
l := logger.CreateLogger()
16041632
gitExpressions := filter.GitExpressions{filter.NewGitExpression("HEAD~1", "HEAD")}
16051633

1606-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
1634+
wtOpts := worktrees.WorktreeOpts{
1635+
WorkingDir: tmpDir,
1636+
GitExpressions: gitExpressions,
1637+
}
1638+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
16071639
require.NoError(t, err)
16081640

16091641
t.Cleanup(func() {
@@ -1758,7 +1790,11 @@ unit "app" {
17581790
l := logger.CreateLogger()
17591791
gitExpressions := filter.GitExpressions{filter.NewGitExpression("HEAD~1", "HEAD")}
17601792

1761-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
1793+
wtOpts := worktrees.WorktreeOpts{
1794+
WorkingDir: tmpDir,
1795+
GitExpressions: gitExpressions,
1796+
}
1797+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
17621798
require.NoError(t, err)
17631799

17641800
t.Cleanup(func() {
@@ -1831,7 +1867,8 @@ unit "app" {
18311867
}
18321868

18331869
assert.True(t, foundStack,
1834-
"Stack with nested read_terragrunt_config reference should be discovered when sidecar changes; got: %v", componentPaths)
1870+
"Stack with nested read_terragrunt_config reference should be discovered"+
1871+
" when sidecar changes; got: %v", componentPaths)
18351872

18361873
// Verify: stack WITHOUT the reference should NOT be discovered
18371874
stackNoRefRel, err := filepath.Rel(tmpDir, stackNoRefDir)
@@ -2189,7 +2226,11 @@ func runWorktreeDiscovery(
21892226

21902227
l := logger.CreateLogger()
21912228

2192-
w, err := worktrees.NewWorktrees(t.Context(), l, worktrees.WorktreeOpts{WorkingDir: tmpDir, GitExpressions: gitExpressions})
2229+
wtOpts := worktrees.WorktreeOpts{
2230+
WorkingDir: tmpDir,
2231+
GitExpressions: gitExpressions,
2232+
}
2233+
w, err := worktrees.NewWorktrees(t.Context(), l, wtOpts)
21932234
require.NoError(t, err)
21942235

21952236
t.Cleanup(func() {

0 commit comments

Comments
 (0)