From bcfdbd432757583d59d053f6872e165bae425190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paulo=20Sima=CC=83o?= Date: Wed, 27 Oct 2021 20:37:33 -0300 Subject: [PATCH] added trace --- lib.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/lib.go b/lib.go index a1700ec..e3a07ed 100644 --- a/lib.go +++ b/lib.go @@ -305,6 +305,94 @@ func Exec(str string, opts ...*Opts) ([]*exec.Cmd, error) { } +func ExecStr(str string, opts ...*Opts) (string, error) { + sb := strings.Builder{} + wd, err := os.Getwd() + + if err != nil { + return "", err + } + ret := make([]*exec.Cmd, 0) + opt := &Opts{ + Await: false, + Wd: wd, + SetupProc: func(cmd *exec.Cmd) { + + }, + } + if opts != nil && len(opts) > 0 { + opt = opts[0] + } + + if opt.SetupProc == nil { + opt.SetupProc = func(cmd *exec.Cmd) { + + } + } + + if opt.Trace { + bs := debug.Stack() + log.Printf("Running: %s\n%s", str, string(bs)) + } + + cmdwd := opt.Wd + + prepCmd := func(l Line) *exec.Cmd { + cmd := exec.Command(l.Tokens[0], l.Tokens[1:]...) + cmd.Stdout = log.Writer() + cmd.Stderr = log.Writer() + cmd.Dir = cmdwd + opt.SetupProc(cmd) + ret = append(ret, cmd) + return cmd + } + + lines, err := Lines(str) + + if err != nil { + return "", err + } + for _, l := range lines { + + switch l.LType { + case LINETYPE_COMMENT: + continue + case LINETYPE_CHANGEWD: + + if filepath.IsAbs(l.Tokens[1]) { + cmdwd = l.Tokens[1] + } else { + cmdwd, err = filepath.Abs(filepath.Join(wd, l.Tokens[1])) + if err != nil { + return "", err + } + } + log.Printf("CMDWD NOW IS: %s", cmdwd) + continue + case LINETYPE_SERIAL, LINETYPE_PARALLEL: + cmd := prepCmd(l) + if opt.Debug { + log.Printf("Running %s from dir %s with params %v", cmd.Path, cmd.Dir, cmd.Args) + } + bs, err := cmd.CombinedOutput() + sb.Write(bs) + sb.WriteString("\n") + if opt.Debug { + if err != nil { + log.Printf("Error running: %s: %s", cmd.Path, err.Error()) + } + } + if err != nil { + return "", err + } + + } + } + + return sb.String(), err + +} + // Kill call OS to kill pid func Kill(p int) error { switch runtime.GOOS {