Repository navigation
Route Terraform affected through scheduler - #2519
Andriy Knysh (aknysh) merged 11 commits into
Conversation
|
Tip Atmos Pro
No affected stacks workflow was detected for this pull request. |
Dependency Review✅ No vulnerabilities or license issues found.Scanned FilesNone |
6c349eb to
d2f1ec4
Compare
ee53858 to
4799609
Compare
|
CodeRabbit (@coderabbitai) review |
✅ Actions performedReview triggered.
|
📝 WalkthroughWalkthroughAdds ChangesTerraform Scheduling & Affected Execution
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
pkg/git/git.go (2)
263-265: 💤 Low valueWrap error with static error from errors/errors.go.
Per coding guidelines, errors should be wrapped using static errors. Consider defining a static error for this case.
Example fix
+// In errors/errors.go: +var ErrUnexpectedGitOutput = errors.New("unexpected git rev-parse output") // In git.go: - return "", "", "", fmt.Errorf("unexpected git rev-parse output") + return "", "", "", errUtils.ErrUnexpectedGitOutput🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/git/git.go` around lines 263 - 265, Replace the ad-hoc fmt.Errorf("unexpected git rev-parse output") returned in the length check (the if len(lines) != 3 block in pkg/git/git.go) with a wrapped static error from errors/errors.go: add a descriptive exported sentinel error (e.g. var ErrUnexpectedRevParseOutput = errors.New("unexpected git rev-parse output")) in errors/errors.go, then return fmt.Errorf("%w: got %d lines", errors.ErrUnexpectedRevParseOutput, len(lines)) from the function containing the len(lines) != 3 check so callers can match the static error while still getting context.
256-260: ⚡ Quick winConsider adding a timeout to prevent indefinite hangs.
The
exec.Commandcall has no context or timeout. If git becomes unresponsive (e.g., waiting on network for a remote), this could block indefinitely.Proposed fix using context with timeout
-func gitRepositoryPaths(path string) (repoRoot string, gitDir string, commonDir string, err error) { - out, err := exec.Command("git", "-C", path, "rev-parse", "--path-format=absolute", "--show-toplevel", "--git-dir", "--git-common-dir").Output() +import ( + "context" + "time" +) + +func gitRepositoryPaths(path string) (repoRoot string, gitDir string, commonDir string, err error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + out, err := exec.CommandContext(ctx, "git", "-C", path, "rev-parse", "--path-format=absolute", "--show-toplevel", "--git-dir", "--git-common-dir").Output()🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/git/git.go` around lines 256 - 260, The gitRepositoryPaths function uses exec.Command without a timeout and can hang; change it to use a context with timeout (e.g., context.WithTimeout) and call exec.CommandContext instead of exec.Command, ensure you defer cancel(), pass the context into the command invocation for the "git -C ... rev-parse ..." call, and propagate/return the error if the context deadline is exceeded so the function fails fast on timeout while keeping the same return values (repoRoot, gitDir, commonDir, err).pkg/git/git_test.go (1)
289-308: ⚖️ Poor tradeoffConsider adding a negative-path test for the fallback logic.
These tests verify the fallback triggers when
extensions.worktreeConfigis enabled. Per guidelines, when testing recovery logic, include a test verifying the recovery does not trigger when the condition is absent.A test confirming that standard go-git opening succeeds (without fallback) when worktreeConfig is disabled would strengthen confidence that the detection logic doesn't over-match.
Also applies to: 310-324
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@pkg/git/git_test.go` around lines 289 - 308, Add a negative-path test alongside TestGetLocalRepoWithWorktreeConfigExtension that verifies the fallback is NOT used when extensions.worktreeConfig is absent/false: create a test (e.g., TestGetLocalRepoWithoutWorktreeConfigExtension) that sets up the repo with initNativeGitRepo, does not enable extensions.worktreeConfig (or explicitly set it to "false" via runNativeGit), calls GetLocalRepo(), asserts no error and non-nil repo, then calls GetRepoConfig() and GetRepoInfo() and assert expected values (use require.NoError and requireSamePath/require.Equal as in the existing test) to confirm standard go-git opening succeeded and recovery/fallback logic did not trigger; apply the same pattern for the other similar test referenced around lines 310-324.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cmd/terraform/utils.go`:
- Line 343: The function signature for executeAffectedCommand currently places
ctx last; change it to accept ctx context.Context as the first parameter (func
executeAffectedCommand(ctx context.Context, parentCmd *cobra.Command, args
[]string, info *schema.ConfigAndStacksInfo) error) and update every call site to
pass the context as the first argument; ensure any references/imports still
compile and run go vet/go test to catch missed call sites or mismatched
ordering.
In `@internal/exec/terraform_utils_test.go`:
- Around line 357-358: The test hardcodes "/tmp/base" — change it to use a temp
dir: call repoPath := t.TempDir() (or t.TempDir() per table subtests) and build
the expected path with filepath.Join(repoPath, "base"), then assert
require.Equal(t, filepath.Join(repoPath, "base"), args.RepoPath) and keep
require.Equal(t, "dev", args.Stack); apply the same change to the other
occurrence mentioned (lines 423-424) so no Unix-specific hardcoded paths remain.
In `@pkg/scheduler/adapters/terraform.go`:
- Around line 238-239: The fast-path currently uses len(selection.NodeIDs) ==
graph.Size() which can be spoofed by duplicates or invalid IDs; change the
condition to verify that the set of unique IDs in selection.NodeIDs matches
graph.Size() and that every ID actually exists in the graph before returning
early (while still honoring selection.IncludeDependencies and
selection.IncludeDependents). In practice compute a unique ID set from
selection.NodeIDs, check len(uniqueIDs) == graph.Size() and validate each ID
against the graph (e.g., via graph.Has(id) or equivalent) and only then return
graph when IncludeDependencies and IncludeDependents are false.
---
Nitpick comments:
In `@pkg/git/git_test.go`:
- Around line 289-308: Add a negative-path test alongside
TestGetLocalRepoWithWorktreeConfigExtension that verifies the fallback is NOT
used when extensions.worktreeConfig is absent/false: create a test (e.g.,
TestGetLocalRepoWithoutWorktreeConfigExtension) that sets up the repo with
initNativeGitRepo, does not enable extensions.worktreeConfig (or explicitly set
it to "false" via runNativeGit), calls GetLocalRepo(), asserts no error and
non-nil repo, then calls GetRepoConfig() and GetRepoInfo() and assert expected
values (use require.NoError and requireSamePath/require.Equal as in the existing
test) to confirm standard go-git opening succeeded and recovery/fallback logic
did not trigger; apply the same pattern for the other similar test referenced
around lines 310-324.
In `@pkg/git/git.go`:
- Around line 263-265: Replace the ad-hoc fmt.Errorf("unexpected git rev-parse
output") returned in the length check (the if len(lines) != 3 block in
pkg/git/git.go) with a wrapped static error from errors/errors.go: add a
descriptive exported sentinel error (e.g. var ErrUnexpectedRevParseOutput =
errors.New("unexpected git rev-parse output")) in errors/errors.go, then return
fmt.Errorf("%w: got %d lines", errors.ErrUnexpectedRevParseOutput, len(lines))
from the function containing the len(lines) != 3 check so callers can match the
static error while still getting context.
- Around line 256-260: The gitRepositoryPaths function uses exec.Command without
a timeout and can hang; change it to use a context with timeout (e.g.,
context.WithTimeout) and call exec.CommandContext instead of exec.Command,
ensure you defer cancel(), pass the context into the command invocation for the
"git -C ... rev-parse ..." call, and propagate/return the error if the context
deadline is exceeded so the function fails fast on timeout while keeping the
same return values (repoRoot, gitDir, commonDir, err).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 8ceb4404-1bf3-4e97-a1e6-ccd12ee31d21
📒 Files selected for processing (19)
cmd/terraform/apply.gocmd/terraform/destroy.gocmd/terraform/options.gocmd/terraform/options_test.gocmd/terraform/plan.gocmd/terraform/utils.gogo.modinternal/exec/terraform_affected.gointernal/exec/terraform_utils_test.gopkg/git/git.gopkg/git/git_test.gopkg/scheduler/adapters/terraform.gopkg/scheduler/adapters/terraform_test.gopkg/schema/schema.gotests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.goldentests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.goldentests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.goldentests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.goldentests/terraform_floci_dag_test.go
4799609 to
cdca0d9
Compare
|
💥 This pull request now has conflicts. Could you fix it Mikhail Shirkov (@shirkevich)? 🙏 |
8b8e695 to
0f97cfb
Compare
d2f1ec4 to
1b7ad06
Compare
|
CodeRabbit (@coderabbitai) review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
internal/exec/terraform_utils_test.go (1)
357-358:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winReplace hardcoded Unix repo path with a temp dir.
"/tmp/base"makes this test platform-specific. Use a per-test temp dir and assert against that variable in both spots.Suggested patch.
+ repoPath := t.TempDir() + patches.ApplyFunc(getAffectedComponents, func(args *DescribeAffectedCmdArgs) ([]schema.Affected, error) { describedAffected = true require.NotNil(t, args.CLIConfig) - require.Equal(t, "/tmp/base", args.RepoPath) + require.Equal(t, repoPath, args.RepoPath) require.Equal(t, "dev", args.Stack) require.True(t, args.ProcessTemplates) @@ args := &DescribeAffectedCmdArgs{ - RepoPath: "/tmp/base", + RepoPath: repoPath, Stack: "dev", IncludeDependents: true, ProcessTemplates: true,As per coding guidelines: “Never hardcode Unix paths in expected values like
assert.Equal(t, "/project/components/vpc", path); build expected paths withfilepath.Join().”Also applies to: 423-424
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/exec/terraform_utils_test.go` around lines 357 - 358, Replace the hardcoded "/tmp/base" in the test with a per-test temp directory: call tmp := t.TempDir() (or os.MkdirTemp if not using testing.T helpers), build any expected subpaths with filepath.Join(tmp, "base") if needed, and replace the literal "/tmp/base" in the require.Equal assertions that compare args.RepoPath with the expected path (and the other occurrence of the same assertion later). Keep the require.Equal for args.Stack as-is, and ensure you import "path/filepath" if you use filepath.Join.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pkg/git/git.go`:
- Around line 256-271: Replace the raw fmt.Errorf return in gitRepositoryPaths
with a wrapped static error defined in errors/errors.go: add a descriptive
exported error (e.g., ErrUnexpectedRevParseOutput) to errors/errors.go and in
gitRepositoryPaths wrap that static error with context (including the actual
output or length) using fmt.Errorf("%w: %s", errors.ErrUnexpectedRevParseOutput,
detail) before returning; ensure the function imports the errors package and
returns the wrapped static error instead of fmt.Errorf directly.
---
Duplicate comments:
In `@internal/exec/terraform_utils_test.go`:
- Around line 357-358: Replace the hardcoded "/tmp/base" in the test with a
per-test temp directory: call tmp := t.TempDir() (or os.MkdirTemp if not using
testing.T helpers), build any expected subpaths with filepath.Join(tmp, "base")
if needed, and replace the literal "/tmp/base" in the require.Equal assertions
that compare args.RepoPath with the expected path (and the other occurrence of
the same assertion later). Keep the require.Equal for args.Stack as-is, and
ensure you import "path/filepath" if you use filepath.Join.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 83663c2f-8f49-4b40-a6de-5d43c9a181c0
📒 Files selected for processing (19)
cmd/terraform/apply.gocmd/terraform/destroy.gocmd/terraform/options.gocmd/terraform/options_test.gocmd/terraform/plan.gocmd/terraform/utils.gogo.modinternal/exec/terraform_affected.gointernal/exec/terraform_utils_test.gopkg/git/git.gopkg/git/git_test.gopkg/scheduler/adapters/terraform.gopkg/scheduler/adapters/terraform_test.gopkg/schema/schema.gotests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.goldentests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.goldentests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.goldentests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.goldentests/terraform_floci_dag_test.go
✅ Files skipped from review due to trivial changes (3)
- tests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.golden
- go.mod
- tests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.golden
🚧 Files skipped from review as they are similar to previous changes (13)
- cmd/terraform/apply.go
- cmd/terraform/options.go
- pkg/schema/schema.go
- cmd/terraform/utils.go
- tests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.golden
- cmd/terraform/plan.go
- cmd/terraform/destroy.go
- pkg/scheduler/adapters/terraform.go
- internal/exec/terraform_affected.go
- pkg/git/git_test.go
- tests/terraform_floci_dag_test.go
- pkg/scheduler/adapters/terraform_test.go
- cmd/terraform/options_test.go
|
CodeRabbit (@coderabbitai) review |
✅ Actions performedReview triggered.
|
|
Actionable comments posted: 0 |
✅ Actions performedReview triggered.
|
|
💥 This pull request now has conflicts. Could you fix it Mikhail Shirkov (@shirkevich)? 🙏 |
78f9c66 to
1ed7014
Compare
|
CodeRabbit (@coderabbitai) review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
🧹 Nitpick comments (1)
cmd/terraform/destroy.go (1)
25-30: ⚡ Quick winWrap the bind errors with context.
These return the raw error straight from the parser. A little
%wcontext makes flag-binding failures far easier to trace in logs.♻️ Suggested wrap
- if err := terraformParser.BindFlagsToViper(cmd, v); err != nil { - return err - } - if err := destroyParser.BindFlagsToViper(cmd, v); err != nil { - return err - } + if err := terraformParser.BindFlagsToViper(cmd, v); err != nil { + return fmt.Errorf("binding terraform flags: %w", err) + } + if err := destroyParser.BindFlagsToViper(cmd, v); err != nil { + return fmt.Errorf("binding destroy flags: %w", err) + }As per coding guidelines: "use
fmt.Errorfwith%wfor context".🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmd/terraform/destroy.go` around lines 25 - 30, Wrap the raw errors returned by terraformParser.BindFlagsToViper and destroyParser.BindFlagsToViper with contextual messages using fmt.Errorf and %w; specifically, when binding flags on cmd with v fails, return fmt.Errorf("failed to bind terraform flags to viper: %w", err) for terraformParser.BindFlagsToViper and a similar contextual message (e.g. "failed to bind destroy flags to viper: %w") for destroyParser.BindFlagsToViper so logs clearly show which binding failed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@cmd/terraform/destroy.go`:
- Around line 25-30: Wrap the raw errors returned by
terraformParser.BindFlagsToViper and destroyParser.BindFlagsToViper with
contextual messages using fmt.Errorf and %w; specifically, when binding flags on
cmd with v fails, return fmt.Errorf("failed to bind terraform flags to viper:
%w", err) for terraformParser.BindFlagsToViper and a similar contextual message
(e.g. "failed to bind destroy flags to viper: %w") for
destroyParser.BindFlagsToViper so logs clearly show which binding failed.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: d53f410d-c815-408a-873d-1fe188be0b4f
📒 Files selected for processing (20)
cmd/terraform/apply.gocmd/terraform/destroy.gocmd/terraform/options.gocmd/terraform/options_test.gocmd/terraform/plan.gocmd/terraform/utils.goerrors/errors.gogo.modinternal/exec/terraform_affected.gointernal/exec/terraform_utils_test.gopkg/git/git.gopkg/git/git_test.gopkg/scheduler/adapters/terraform.gopkg/scheduler/adapters/terraform_test.gopkg/schema/schema.gotests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.goldentests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.goldentests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.goldentests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.goldentests/terraform_floci_dag_test.go
✅ Files skipped from review due to trivial changes (4)
- tests/snapshots/TestCLICommands_tf_plan_help_shows_inherited_stack_flag.stdout.golden
- tests/snapshots/TestCLICommands_config_alias_tp_--help_shows_terraform_plan_help.stdout.golden
- tests/snapshots/TestCLICommands_atmos_terraform_apply_help.stdout.golden
- tests/snapshots/TestCLICommands_atmos_terraform_apply_--help.stdout.golden
🚧 Files skipped from review as they are similar to previous changes (15)
- cmd/terraform/plan.go
- cmd/terraform/apply.go
- go.mod
- pkg/schema/schema.go
- errors/errors.go
- cmd/terraform/utils.go
- internal/exec/terraform_affected.go
- cmd/terraform/options_test.go
- cmd/terraform/options.go
- pkg/scheduler/adapters/terraform_test.go
- pkg/git/git_test.go
- pkg/scheduler/adapters/terraform.go
- pkg/git/git.go
- internal/exec/terraform_utils_test.go
- tests/terraform_floci_dag_test.go
|
CodeRabbit (@coderabbitai) can you confirm that with |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
# Find and examine the scheduler implementation, focusing on fail-fast behavior
rg -n "WithFailFast\|FailFast\|failFast\|in.flight\|inflight\|running\|drain\|cancel\|wait" pkg/scheduler/ --type=go -A 3 -B 1 | head -200Length of output: 473 🏁 Script executed: #!/bin/bash
# Find the scheduler run loop to see how it handles failures
fd -e go . pkg/scheduler/ --exclude '*_test.go' | xargs catLength of output: 54968
Here's the key path in // When a node fails with fail-fast enabled:
if s.failFast {
stopping = true // ← stops dispatching NEW nodes
finished += skipPending(...) // ← marks queued-but-not-started nodes as skipped
}
// The run loop continues to drain completions from in-flight workers:
for finished < len(s.graph.Nodes) {
select {
case out <- nextID: // out is nil when stopping=true → no new work dispatched
case event := <-eventCh: // ← still receives from all running workers
running--
finished++
...
case <-done: // done is nil when stopping=true → context not cancelled mid-drain
}
}
close(workCh) // only after every node is accounted for
workers.Wait() // waits for all goroutines to exit cleanly
// defer cancel() fires here — AFTER all workers have finishedThe behavior is exactly what you want:
No Terraform process is interrupted mid-execution, so lock files won't be orphaned. |
cbd79ba
into
codex/dag-terraform-plan-concurrency
|
Tip Atmos Pro
No affected stacks workflow was detected for this pull request. |
* enable terraform plan scheduler concurrency * complete terraform plan concurrency output semantics * fix pre-commit formatting * update terraform plan help snapshots * allow workdir aliases to run concurrently * Skip Terraform runtime dirs in workdir sync * Add Terraform summary node timings * Add coverage for Terraform plan concurrency paths * Allow Terraform aliases without workdir * Address CodeRabbit plan concurrency feedback * Test concurrent line prefix writes * Clarify OpenTofu workdir runtime dirs * Document Terraform scheduler helpers * Restore Terraform all dependency order message * Normalize Terraform resource key test expectation * PR5: Concurrent Terraform apply and destroy (#2474) * enable terraform apply destroy concurrency * test(terraform): add floci apply destroy validation * Address CodeRabbit apply destroy feedback * Use portable Floci fixture logging * Apply Floci test formatting * Format terraform run helper * Respect false auto-approve flag values * Address Terraform adapter review nits * Format Floci DAG test calls * Address Floci test review nitpicks * Fix test comment punctuation * Use extensible plan hide flag * Route Terraform affected through scheduler (#2519) * Route terraform affected through scheduler * test(terraform): add floci affected scheduler validation * Add Terraform scheduler failure mode flags * Support Git worktreeConfig repositories * [autocommit] formatting fixes * Address CodeRabbit affected scheduler feedback * Use a single Terraform failure mode flag * Format Floci affected DAG test calls * Document affected scheduler helpers * Fix worktreeConfig test cleanup on Windows * Increase affected scheduler test coverage --------- Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com> * Address CodeRabbit follow-ups for plan concurrency --------- Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com>
* Add process and I/O execution foundation * Address process I/O review feedback * Address CodeRabbit rereview feedback * Rename output pipeline API * add dag scheduler core * Address CodeRabbit scheduler feedback * Ensure scheduler aggregates non-success statuses * route terraform bulk execution through scheduler * fix credential store concurrent initialization * serialize terraform aliases sharing component paths * remove temporary terraform concurrency override * route terraform all through graph scheduler * Address CodeRabbit Terraform adapter feedback * Address CodeRabbit graph adapter feedback * [autocommit] formatting fixes * Preserve dependency-order log in scheduler path * Apply gofumpt wrapping to scheduler tests * [codex] enable terraform plan scheduler concurrency (#2468) * enable terraform plan scheduler concurrency * complete terraform plan concurrency output semantics * fix pre-commit formatting * update terraform plan help snapshots * allow workdir aliases to run concurrently * Skip Terraform runtime dirs in workdir sync * Add Terraform summary node timings * Add coverage for Terraform plan concurrency paths * Allow Terraform aliases without workdir * Address CodeRabbit plan concurrency feedback * Test concurrent line prefix writes * Clarify OpenTofu workdir runtime dirs * Document Terraform scheduler helpers * Restore Terraform all dependency order message * Normalize Terraform resource key test expectation * PR5: Concurrent Terraform apply and destroy (#2474) * enable terraform apply destroy concurrency * test(terraform): add floci apply destroy validation * Address CodeRabbit apply destroy feedback * Use portable Floci fixture logging * Apply Floci test formatting * Format terraform run helper * Respect false auto-approve flag values * Address Terraform adapter review nits * Format Floci DAG test calls * Address Floci test review nitpicks * Fix test comment punctuation * Use extensible plan hide flag * Route Terraform affected through scheduler (#2519) * Route terraform affected through scheduler * test(terraform): add floci affected scheduler validation * Add Terraform scheduler failure mode flags * Support Git worktreeConfig repositories * [autocommit] formatting fixes * Address CodeRabbit affected scheduler feedback * Use a single Terraform failure mode flag * Format Floci affected DAG test calls * Document affected scheduler helpers * Fix worktreeConfig test cleanup on Windows * Increase affected scheduler test coverage --------- Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com> * Address CodeRabbit follow-ups for plan concurrency --------- Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com> * docs: add terraform dag release notes * docs: polish terraform dag changelog * style: gofumpt terraform environment setup * fix(terraform): include captured output in scheduler errors * fix(terraform): address review feedback * chore(terraform): address coderabbit nitpicks --------- Co-authored-by: Erik Osterman (Cloud Posse) <erik@cloudposse.com> Co-authored-by: atmos-pro[bot] <173522224+atmos-pro[bot]@users.noreply.github.com> Co-authored-by: Andriy Knysh <aknysh@users.noreply.github.com>
Summary
extensions.worktreeConfigcompatibility for affected/repo-info paths so agent-created Git worktrees do not fail during go-git repository open.Upstream context
worktreeConfig, causingcore.repositoryformatversion does not support extension: worktreeconfig.extensions.worktreeConfiguntil the dependency path can rely on upstream support.Validation
extensions.worktreeConfig=true,build/atmos describe affected -s <stack> -i <identity> --format jsonreturned an empty affected set without the worktreeConfig errorbuild/atmos terraform plan --affected -s <stack> -i <identity> --max-concurrency 8 --log-order grouped --hide-no-changesreturned "No components affected" without the worktreeConfig errorFloci affected scenarios
Summary by CodeRabbit