From 9ba44f3e6e1b7f9b4c4c86559838b60e83399188 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Sat, 1 Jul 2017 15:05:51 -0300 Subject: [PATCH] allow custom Stdin, Stdout and Stderr while running as a lib --- cmd/task/task.go | 5 +++++ help.go | 5 ++--- log.go | 13 +++++++++++++ task.go | 26 ++++++++++++++++++++------ variable_handling.go | 2 +- watch.go | 12 +++++------- 6 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 log.go diff --git a/cmd/task/task.go b/cmd/task/task.go index 4abafb0f..85f668f4 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -3,6 +3,7 @@ package main import ( "fmt" "log" + "os" "github.com/go-task/task" @@ -61,6 +62,10 @@ hello: e := task.Executor{ Force: force, Watch: watch, + + Stdin: os.Stdin, + Stdout: os.Stdout, + Stderr: os.Stderr, } if err := e.ReadTaskfile(); err != nil { log.Fatal(err) diff --git a/help.go b/help.go index 2673c294..d8053818 100644 --- a/help.go +++ b/help.go @@ -2,7 +2,6 @@ package task import ( "fmt" - "os" "sort" "text/tabwriter" ) @@ -12,10 +11,10 @@ func (e *Executor) printExistingTasksHelp() { if len(tasks) == 0 { return } - fmt.Println("Available tasks for this project:") + e.println("Available tasks for this project:") // Format in tab-separated columns with a tab stop of 8. - w := tabwriter.NewWriter(os.Stdout, 0, 8, 0, '\t', 0) + w := tabwriter.NewWriter(e.Stdout, 0, 8, 0, '\t', 0) for _, task := range tasks { fmt.Fprintln(w, fmt.Sprintf("- %s:\t%s", task, e.Tasks[task].Desc)) } diff --git a/log.go b/log.go new file mode 100644 index 00000000..e5ee75b8 --- /dev/null +++ b/log.go @@ -0,0 +1,13 @@ +package task + +import ( + "fmt" +) + +func (e *Executor) println(args ...interface{}) { + fmt.Fprintln(e.Stdout, args...) +} + +func (e *Executor) printfln(format string, args ...interface{}) { + fmt.Fprintf(e.Stdout, format+"\n", args...) +} diff --git a/task.go b/task.go index 599d5968..cc69bdfe 100644 --- a/task.go +++ b/task.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "fmt" - "log" + "io" "os" "path/filepath" "strings" @@ -26,6 +26,10 @@ type Executor struct { Force bool Watch bool + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer + watchingFiles map[string]struct{} } @@ -52,6 +56,16 @@ func (e *Executor) Run(args ...string) error { return ErrCyclicDependencyDetected } + if e.Stdin == nil { + e.Stdin = os.Stdin + } + if e.Stdout == nil { + e.Stdout = os.Stdout + } + if e.Stderr == nil { + e.Stderr = os.Stderr + } + // check if given tasks exist for _, a := range args { if _, ok := e.Tasks[a]; !ok { @@ -93,7 +107,7 @@ func (e *Executor) RunTask(ctx context.Context, name string) error { return err } if upToDate { - log.Printf(`task: Task "%s" is up to date`, name) + e.printfln(`task: Task "%s" is up to date`, name) return nil } } @@ -231,13 +245,13 @@ func (e *Executor) runCommand(ctx context.Context, task string, i int) error { Command: c, Dir: dir, Env: envs, - Stdin: os.Stdin, - Stderr: os.Stderr, + Stdin: e.Stdin, + Stderr: e.Stderr, } if t.Set == "" { - log.Println(c) - opts.Stdout = os.Stdout + e.println(c) + opts.Stdout = e.Stdout if err = execext.RunCommand(opts); err != nil { return err } diff --git a/variable_handling.go b/variable_handling.go index 26db4002..08cd7685 100644 --- a/variable_handling.go +++ b/variable_handling.go @@ -36,7 +36,7 @@ func (e *Executor) handleDynamicVariableContent(value string) (string, error) { Command: strings.TrimPrefix(value, "$"), Dir: e.Dir, Stdout: buff, - Stderr: os.Stderr, + Stderr: e.Stderr, } if err := execext.RunCommand(opts); err != nil { return "", err diff --git a/watch.go b/watch.go index 49f2127a..d203fe34 100644 --- a/watch.go +++ b/watch.go @@ -2,8 +2,6 @@ package task import ( "context" - "fmt" - "log" "strings" "time" @@ -13,12 +11,12 @@ import ( // watchTasks start watching the given tasks func (e *Executor) watchTasks(args ...string) error { - log.Printf("task: Started watching for tasks: %s", strings.Join(args, ", ")) + e.printfln("task: Started watching for tasks: %s", strings.Join(args, ", ")) // run tasks on init for _, a := range args { if err := e.RunTask(context.Background(), a); err != nil { - fmt.Println(err) + e.println(err) break } } @@ -32,7 +30,7 @@ func (e *Executor) watchTasks(args ...string) error { go func() { for { if err := e.registerWatchedFiles(watcher, args); err != nil { - log.Printf("Error watching files: %v", err) + e.printfln("Error watching files: %v", err) } time.Sleep(time.Second * 2) } @@ -44,12 +42,12 @@ loop: case <-watcher.Events: for _, a := range args { if err := e.RunTask(context.Background(), a); err != nil { - fmt.Println(err) + e.println(err) continue loop } } case err := <-watcher.Errors: - fmt.Println(err) + e.println(err) continue loop } }