diff --git a/cmd/task/task.go b/cmd/task/task.go index 8eff5db5..20e4d612 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -158,6 +158,12 @@ func main() { OutputStyle: output, } + + if (list || listAll) && silent { + e.ListTaskNames(listAll) + return + } + if err := e.Setup(); err != nil { log.Fatal(err) } diff --git a/help.go b/help.go index ca0d7841..315daaae 100644 --- a/help.go +++ b/help.go @@ -2,7 +2,10 @@ package task import ( "fmt" + "io" + "os" "sort" + "strings" "text/tabwriter" "github.com/go-task/task/v3/internal/logger" @@ -70,3 +73,30 @@ func (e *Executor) tasksWithDesc() (tasks []*taskfile.Task) { sort.Slice(tasks, func(i, j int) bool { return tasks[i].Task < tasks[j].Task }) return } + +// PrintTaskNames prints only the task names in a Taskfile. +// Only tasks with a non-empty description are printed if allTasks is false. +// Otherwise, all task names are printed. +func (e *Executor) ListTaskNames(allTasks bool) { + // if called from cmd/task.go, e.Taskfile has not yet been parsed + if nil == e.Taskfile && e.readTaskfile() != nil { + return + } + // use stdout if no output defined + var w io.Writer = os.Stdout + if e.Stdout != nil { + w = e.Stdout + } + // create a string slice from all map values (*taskfile.Task) + s := make([]string, 0, len(e.Taskfile.Tasks)) + for _, t := range e.Taskfile.Tasks { + if allTasks || t.Desc != "" { + s = append(s, strings.TrimRight(t.Task, ":")) + } + } + // sort and print all task names + sort.Strings(s) + for _, t := range s { + fmt.Fprintln(w, t) + } +} diff --git a/task.go b/task.go index 672d3e60..6b9cc39e 100644 --- a/task.go +++ b/task.go @@ -104,8 +104,13 @@ func (e *Executor) Run(ctx context.Context, calls ...taskfile.Call) error { return g.Wait() } -// Setup setups Executor's internal state -func (e *Executor) Setup() error { +// readTaskfile selects and parses the entrypoint. +func (e *Executor) readTaskfile() error { + // select the default entrypoint if not provided + if e.Entrypoint == "" { + e.Entrypoint = "Taskfile.yml" + } + var err error e.Taskfile, err = read.Taskfile(&read.ReaderNode{ Dir: e.Dir, @@ -113,6 +118,12 @@ func (e *Executor) Setup() error { Parent: nil, Optional: false, }) + return err +} + +// Setup setups Executor's internal state +func (e *Executor) Setup() error { + err := e.readTaskfile() if err != nil { return err }