mirror of
https://github.com/go-task/task.git
synced 2026-07-10 04:22:03 +02:00
Engine: - Emit DirectiveKeepOrder for task variables so the `requires` declaration order is preserved instead of being sorted by the shell. - Return full `--flag=value` candidates for the inline `--output=` form so all shells match against the whole current token. - Add `--no-aliases` / `--no-descriptions` completion flags (via complete.Options) parsed from the __complete invocation; the zsh wrapper maps its show-aliases and verbose zstyles onto them. - Skip Taskfile setup when completing flags (NeedsTaskfile) and load the task list lazily; drop unused parameters; document exported identifiers. Shell wrappers: - zsh: reindent to tabs (.editorconfig), bridge zstyles to engine flags. - fish: reindent to 2 spaces, handle every file-completion directive in the wrapper (--no-files disables the native fallback), drop the duplicated yml/yaml extension list now that it lives only in the engine. - bash: prefix-filter by hand to preserve values containing spaces, exclude `=` from word breaks so `--output=` reaches the engine as one token. - powershell: filter candidates by the current word, fall back to file completion for DirectiveDefault. NoSpace is not representable in fish/PowerShell completion APIs; documented in the wrappers.
56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/spf13/pflag"
|
|
|
|
"github.com/go-task/task/v3"
|
|
"github.com/go-task/task/v3/internal/complete"
|
|
)
|
|
|
|
func runComplete(args []string) error {
|
|
// Strip the completion-control flags the wrapper prepends; the rest is the
|
|
// user's command line to complete.
|
|
opts, args := complete.ParseOptions(args)
|
|
|
|
dir, entrypoint, global := extractTaskfileFlags(args)
|
|
|
|
e := task.NewExecutor(
|
|
task.WithDir(dir),
|
|
task.WithEntrypoint(entrypoint),
|
|
task.WithStdout(io.Discard),
|
|
task.WithStderr(io.Discard),
|
|
task.WithVersionCheck(false),
|
|
)
|
|
if global {
|
|
if home, err := os.UserHomeDir(); err == nil {
|
|
e.Options(task.WithDir(home))
|
|
}
|
|
}
|
|
|
|
// Loading the Taskfile parses YAML (and may hit the network for remote
|
|
// Taskfiles), so skip it entirely when completing flags or their values.
|
|
// Best-effort: a missing or broken Taskfile must not break completion.
|
|
if complete.NeedsTaskfile(args, pflag.CommandLine) {
|
|
_ = e.Setup()
|
|
}
|
|
|
|
suggs, dirv := complete.Complete(e, pflag.CommandLine, args, opts)
|
|
complete.Write(os.Stdout, suggs, dirv)
|
|
return nil
|
|
}
|
|
|
|
func extractTaskfileFlags(args []string) (dir, entrypoint string, global bool) {
|
|
fs := pflag.NewFlagSet("complete", pflag.ContinueOnError)
|
|
fs.SetOutput(io.Discard)
|
|
fs.ParseErrorsAllowlist.UnknownFlags = true
|
|
fs.Usage = func() {}
|
|
fs.StringVarP(&dir, "dir", "d", "", "")
|
|
fs.StringVarP(&entrypoint, "taskfile", "t", "", "")
|
|
fs.BoolVarP(&global, "global", "g", false, "")
|
|
_ = fs.Parse(args)
|
|
return
|
|
}
|