grim/convey

Port from logrus to log/slog
default tip
5 months ago, Elliott Sales de Andrade
c588f9b3f559
Port from logrus to log/slog

This doesn't really take much advantage of structured logging beyond what is already done (`id` and `idColor`), and consequently the log handler does not try to do any handling of anything more than that (i.e., grouping, or arbitrary attributes beyond those defined).

One should maybe have a `Context` available to pass in, but there isn't one, and anyway, the log handler doesn't use it, so I've passed in a `TODO` instead.

Everything else is just normal import/rename changes.

Testing Done:
Ran `go run . run`

Reviewed at https://reviews.imfreedom.org/r/2871/
package script
import (
"log/slog"
"os"
"path/filepath"
gort "runtime"
"strings"
"keep.imfreedom.org/grim/convey/environment"
"keep.imfreedom.org/grim/convey/exec"
"keep.imfreedom.org/grim/convey/runtime"
"keep.imfreedom.org/grim/convey/yaml"
)
type Shell struct {
Commands yaml.StringOrSlice `yaml:"commands"`
Environment yaml.StringOrSlice `yaml:"environment"`
Filename string `yaml:"filename"`
Shell string `yaml:"shell"`
}
func (s *Shell) Execute(name string, logger *slog.Logger, stageEnv environment.Environment, rt *runtime.Runtime) error {
// Create a new environment based on the stage's environment. Then merge
// the task's environment overriding anything from the stage. Finally merge
// the runtime environment which holds the environment from the command line.
env := stageEnv.Copy().MergeSlice(s.Environment).Merge(rt.Environment)
filename := filepath.Join(rt.ConfigPath, s.Filename)
if !strings.HasPrefix(filename, rt.ConfigPath) {
return ErrScriptOutsideOfWorkspace
}
if filename == "" {
file, err := sliceToFile(s.Commands, rt.ConfigPath, env)
if err != nil {
return err
}
filename = file
defer os.Remove(filename)
}
shell, err := findInterpreter(s.Shell)
if err != nil {
return err
}
if shell == "" {
return ErrFailedToDetermineShell
}
return exec.Run(name, []string{shell, filename}, rt.Timeout)
}
func (s *Shell) New() runtime.Task {
return &Shell{}
}
func (s *Shell) Valid() error {
if gort.GOOS == "windows" {
return ErrNotSupportedOnWindows
}
if s.Shell == "" {
s.Shell = "/bin/sh"
}
if len(s.Commands) == 0 && s.Filename == "" {
return ErrNoCommandsOrFilename
}
if len(s.Commands) > 0 && s.Filename != "" {
return ErrOnlyFilenameOrCommands
}
return nil
}
func (s *Shell) Deprecated() error {
return nil
}