func newShellCommandExecutor()

in command-runner/pkg/runner/shell_command_executor.go [38:118]


func newShellCommandExecutor(ctx context.Context, params *newShellCommandExecutorParams) (commandExecutor, error) {
	mceDir, err := os.MkdirTemp(fs.TmpDir(), "mce")
	if err != nil {
		return nil, err
	}
	closeExecutors := []common.Executor{}
	for _, filemap := range params.FileMaps {
		switch filemap.Type {
		case FileMapTypeCopyOut:
			closeExecutors = append(closeExecutors, copyOut(ctx, mceDir, params.WorkingDir, filemap))
		case FileMapTypeBind:
			// treat bind mount as symlink
			if err := symlink(mceDir, params.WorkingDir, filemap); err != nil {
				return nil, err
			}
		case FileMapTypeCopyIn:
			if err := copyDir(
				ctx,
				resolvePath(filemap.TargetPath, mceDir),
				resolvePath(filemap.SourcePath, params.WorkingDir),
				false,
			); err != nil {
				return nil, err
			}
		case FileMapTypeCopyInWithGitignore:
			if err := copyDir(
				ctx,
				resolvePath(filemap.TargetPath, mceDir),
				resolvePath(filemap.SourcePath, params.WorkingDir),
				true,
			); err != nil {
				return nil, err
			}
		default:
			return nil, fmt.Errorf("unknown filemap Type")
		}
	}

	closeExecutors = append(closeExecutors, setOutputs(mceDir, params.Stdout))
	closeExecutors = append(closeExecutors, func(ctx context.Context) error {
		log.Debug().Msgf("close() is removing %s", mceDir)
		return os.RemoveAll(mceDir)
	})

	env := make([]string, 0)
	var defaultDir string
	if params.Env != nil {
		for k, v := range params.Env {
			if strings.HasPrefix(k, "CATALYST_SOURCE_DIR_") {
				v = resolvePath(v, mceDir)
				if k == "CATALYST_SOURCE_DIR_WorkflowSource" || defaultDir == "" {
					defaultDir = v
				}
			}
			env = append(env, fmt.Sprintf("%s=%s", k, interpolate(v, params.Env)))
		}
	}
	if defaultDir == "" {
		defaultDir = params.WorkingDir
	}
	env = append(env, fmt.Sprintf("PATH=%s", os.Getenv("PATH")))
	env = append(env, fmt.Sprintf("CATALYST_DEFAULT_DIR=%s", defaultDir))

	if err := os.WriteFile(filepath.Join(mceDir, "env.sh"), []byte(""), 00666); err != nil /* #nosec G306 */ {
		return nil, err
	}

	if err := os.WriteFile(filepath.Join(mceDir, "dir.txt"), []byte(defaultDir), 00644); err != nil /* #nosec G306 */ {
		return nil, err
	}

	return &shellCommandExecutor{
		Stdout:         params.Stdout,
		Stderr:         params.Stderr,
		WorkingDir:     defaultDir,
		Env:            env,
		CloseExecutors: closeExecutors,
		mceDir:         mceDir,
		ctx:            ctx,
	}, nil
}