From 134ea64e920531020001b2d2bcfd73138cc37ced Mon Sep 17 00:00:00 2001 From: Virgil Date: Wed, 1 Apr 2026 22:59:12 +0000 Subject: [PATCH] Add script module creates and chdir support --- modules.go | 12 ++++++++++++ modules_cmd_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/modules.go b/modules.go index c1bb5c1..015f1e1 100644 --- a/modules.go +++ b/modules.go @@ -391,6 +391,14 @@ func (e *Executor) moduleScript(ctx context.Context, client sshExecutorClient, a return nil, coreerr.E("Executor.moduleScript", "no script specified", nil) } + skip, err := shouldSkipCommandModule(ctx, client, args) + if err != nil { + return nil, err + } + if skip { + return &TaskResult{Changed: false}, nil + } + // Read local script script = e.resolveLocalPath(script) data, err := coreio.Local.Read(script) @@ -398,6 +406,10 @@ func (e *Executor) moduleScript(ctx context.Context, client sshExecutorClient, a return nil, coreerr.E("Executor.moduleScript", "read script", err) } + if chdir := getStringArg(args, "chdir", ""); chdir != "" { + data = sprintf("cd %q && %s", chdir, data) + } + stdout, stderr, rc, err := client.RunScript(ctx, data) if err != nil { return &TaskResult{Failed: true, Msg: err.Error()}, nil diff --git a/modules_cmd_test.go b/modules_cmd_test.go index 6cadbfe..e05dba4 100644 --- a/modules_cmd_test.go +++ b/modules_cmd_test.go @@ -562,6 +562,47 @@ func TestModulesCmd_ModuleScript_Good_BasicScript(t *testing.T) { assert.Equal(t, scriptContent, last.Cmd) } +func TestModulesCmd_ModuleScript_Good_CreatesSkipsExecution(t *testing.T) { + tmpDir := t.TempDir() + scriptPath := joinPath(tmpDir, "setup.sh") + require.NoError(t, writeTestFile(scriptPath, []byte("echo should-not-run"), 0755)) + + e, mock := newTestExecutorWithMock("host1") + mock.addFile("/tmp/already-there", []byte("present")) + + result, err := e.moduleScript(context.Background(), mock, map[string]any{ + "_raw_params": scriptPath, + "creates": "/tmp/already-there", + }) + + require.NoError(t, err) + require.NotNil(t, result) + assert.False(t, result.Changed) + assert.Equal(t, 0, mock.commandCount()) +} + +func TestModulesCmd_ModuleScript_Good_ChdirPrefixesScript(t *testing.T) { + tmpDir := t.TempDir() + scriptPath := joinPath(tmpDir, "work.sh") + require.NoError(t, writeTestFile(scriptPath, []byte("pwd"), 0755)) + + e, mock := newTestExecutorWithMock("host1") + + result, err := e.moduleScript(context.Background(), mock, map[string]any{ + "_raw_params": scriptPath, + "chdir": "/opt/app", + }) + + require.NoError(t, err) + require.NotNil(t, result) + assert.True(t, result.Changed) + + last := mock.lastCommand() + require.NotNil(t, last) + assert.Equal(t, "RunScript", last.Method) + assert.Equal(t, `cd "/opt/app" && pwd`, last.Cmd) +} + func TestModulesCmd_ModuleScript_Bad_NoScript(t *testing.T) { e, _ := newTestExecutorWithMock("host1") mock := NewMockSSHClient()