1
0
mirror of https://github.com/go-task/task.git synced 2025-06-23 00:38:19 +02:00

feat: enforce gofumpt linter

This commit is contained in:
Pete Davison
2023-03-31 19:13:29 +00:00
committed by Andrey Nering
parent aab51c331f
commit 09c9094a6b
24 changed files with 84 additions and 70 deletions

View File

@ -7,6 +7,7 @@ linters:
enable: enable:
- goimports - goimports
- gofmt - gofmt
- gofumpt
linters-settings: linters-settings:
goimports: goimports:

View File

@ -5,10 +5,19 @@
- Add `.hg` (Mercurial) to the list of ignored directories when using - Add `.hg` (Mercurial) to the list of ignored directories when using
`--watch` (#1098 from @misery). `--watch` (#1098 from @misery).
- More improvements to the release tool (#1096 by @pd93) - More improvements to the release tool (#1096 by @pd93)
- Enforce [gofumpt](https://github.com/mvdan/gofumpt) linter (#1099 by @pd93)
## v3.23.0 - 2023-03-26 ## v3.23.0 - 2023-03-26
Task now has an [official extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=task.vscode-task) contributed by @pd93! :tada: The extension is maintained in a [new repository](https://github.com/go-task/vscode-task) under the `go-task` organization. We're looking to gather feedback from the community so please give it a go and let us know what you think via a [discussion](https://github.com/go-task/vscode-task/discussions), [issue](https://github.com/go-task/vscode-task/issues) or on our [Discord](https://discord.gg/6TY36E39UK)! Task now has an [official extension for Visual Studio
Code](https://marketplace.visualstudio.com/items?itemName=task.vscode-task)
contributed by @pd93! :tada: The extension is maintained in a [new
repository](https://github.com/go-task/vscode-task) under the `go-task`
organization. We're looking to gather feedback from the community so please give
it a go and let us know what you think via a
[discussion](https://github.com/go-task/vscode-task/discussions),
[issue](https://github.com/go-task/vscode-task/issues) or on our
[Discord](https://discord.gg/6TY36E39UK)!
> **NOTE:** > **NOTE:**
> The extension _requires_ v3.23.0 to be installed in order to work. > The extension _requires_ v3.23.0 to be installed in order to work.

View File

@ -62,6 +62,14 @@ tasks:
cmds: cmds:
- golangci-lint run - golangci-lint run
lint:fix:
desc: Runs golangci-lint and fixes any issues
sources:
- './**/*.go'
- .golangci.yml
cmds:
- golangci-lint run --fix
sleepit:build: sleepit:build:
desc: Builds the sleepit test helper desc: Builds the sleepit test helper
sources: sources:

View File

@ -9,7 +9,7 @@ import (
// ParseV3 parses command line argument: tasks and global variables // ParseV3 parses command line argument: tasks and global variables
func ParseV3(args ...string) ([]taskfile.Call, *taskfile.Vars) { func ParseV3(args ...string) ([]taskfile.Call, *taskfile.Vars) {
var calls []taskfile.Call var calls []taskfile.Call
var globals = &taskfile.Vars{} globals := &taskfile.Vars{}
for _, arg := range args { for _, arg := range args {
if !strings.Contains(arg, "=") { if !strings.Contains(arg, "=") {
@ -31,7 +31,7 @@ func ParseV3(args ...string) ([]taskfile.Call, *taskfile.Vars) {
// ParseV2 parses command line argument: tasks and vars of each task // ParseV2 parses command line argument: tasks and vars of each task
func ParseV2(args ...string) ([]taskfile.Call, *taskfile.Vars) { func ParseV2(args ...string) ([]taskfile.Call, *taskfile.Vars) {
var calls []taskfile.Call var calls []taskfile.Call
var globals = &taskfile.Vars{} globals := &taskfile.Vars{}
for _, arg := range args { for _, arg := range args {
if !strings.Contains(arg, "=") { if !strings.Contains(arg, "=") {

View File

@ -203,7 +203,6 @@ func TestArgsV2(t *testing.T) {
if test.ExpectedGlobals.Len() > 0 || globals.Len() > 0 { if test.ExpectedGlobals.Len() > 0 || globals.Len() > 0 {
assert.Equal(t, test.ExpectedGlobals, globals) assert.Equal(t, test.ExpectedGlobals, globals)
} }
}) })
} }
} }

View File

@ -104,7 +104,7 @@ func changelog(version *semver.Version) error {
changelog = changelogReleaseRegex.ReplaceAllString(changelog, fmt.Sprintf("## v%s - %s", version, date)) changelog = changelogReleaseRegex.ReplaceAllString(changelog, fmt.Sprintf("## v%s - %s", version, date))
// Write the changelog to the source file // Write the changelog to the source file
if err := os.WriteFile(changelogSource, []byte(changelog), 0644); err != nil { if err := os.WriteFile(changelogSource, []byte(changelog), 0o644); err != nil {
return err return err
} }
@ -116,7 +116,7 @@ func changelog(version *semver.Version) error {
changelog = changelogIssueRegex.ReplaceAllString(changelog, "[#$1](https://github.com/go-task/task/issues/$1)") changelog = changelogIssueRegex.ReplaceAllString(changelog, "[#$1](https://github.com/go-task/task/issues/$1)")
// Write the changelog to the target file // Write the changelog to the target file
return os.WriteFile(changelogTarget, []byte(changelog), 0644) return os.WriteFile(changelogTarget, []byte(changelog), 0o644)
} }
func setJSONVersion(fileName string, version *semver.Version) error { func setJSONVersion(fileName string, version *semver.Version) error {
@ -130,5 +130,5 @@ func setJSONVersion(fileName string, version *semver.Version) error {
new := versionRegex.ReplaceAllString(string(b), fmt.Sprintf(` "version": "%s",`, version.String())) new := versionRegex.ReplaceAllString(string(b), fmt.Sprintf(` "version": "%s",`, version.String()))
// Write the JSON file // Write the JSON file
return os.WriteFile(fileName, []byte(new), 0644) return os.WriteFile(fileName, []byte(new), 0o644)
} }

View File

@ -19,10 +19,8 @@ Commands
handle Handle signals: on reception of SIGINT perform cleanup before exiting handle Handle signals: on reception of SIGINT perform cleanup before exiting
version Show the sleepit version` version Show the sleepit version`
var ( // Filled by the linker.
// Filled by the linker. var fullVersion = "unknown" // example: v0.0.9-8-g941583d027-dirty
fullVersion = "unknown" // example: v0.0.9-8-g941583d027-dirty
)
func main() { func main() {
os.Exit(run(os.Args[1:])) os.Exit(run(os.Args[1:]))

View File

@ -181,7 +181,7 @@ func main() {
OutputStyle: output, OutputStyle: output,
} }
var listOptions = task.NewListOptions(list, listAll, listJson) listOptions := task.NewListOptions(list, listAll, listJson)
if err := listOptions.Validate(); err != nil { if err := listOptions.Validate(); err != nil {
log.Fatal(err) log.Fatal(err)
} }

View File

@ -30,9 +30,12 @@ invest your time into a PR.
## 2. Making changes ## 2. Making changes
- **Code style** - Try to maintain the existing code style where possible and - **Code style** - Try to maintain the existing code style where possible and
ensure that code is formatted by `gofmt`. We use `golangci-lint` in our CI to ensure that code is formatted by
enforce a consistent style and best-practice. There's a `lint` command in [`gofumpt`](https://github.com/mvdan/gofumpt). We use
the Taskfile to run this locally. [`golangci-lint`](https://golangci-lint.run/) in our CI to enforce a
consistent style and best-practice. You can use the `task lint` command to run
this locally and the `task lint:fix` command to automatically fix any issues
that are found.
- **Documentation** - Ensure that you add/update any relevant documentation. See - **Documentation** - Ensure that you add/update any relevant documentation. See
the [updating documentation](#updating-documentation) section below. the [updating documentation](#updating-documentation) section below.
- **Tests** - Ensure that you add/update any relevant tests and that all tests - **Tests** - Ensure that you add/update any relevant tests and that all tests
@ -60,9 +63,9 @@ documentation and any examples are up-to-date. Ensure that any examples follow
the [Taskfile Styleguide](./styleguide.md). the [Taskfile Styleguide](./styleguide.md).
If you added a new field, command or flag, ensure that you add it to the [API If you added a new field, command or flag, ensure that you add it to the [API
Reference](./api_reference.md). New fields also need to be added to the Reference](./api_reference.md). New fields also need to be added to the [JSON
[JSON Schema]. The descriptions for fields in the API Schema]. The descriptions for fields in the API reference and the schema should
reference and the schema should match. match.
### Writing tests ### Writing tests
@ -74,13 +77,13 @@ required to run the tests are stored.
When making a changes, consider whether new tests are required. These tests When making a changes, consider whether new tests are required. These tests
should ensure that the functionality you are adding will continue to work in the should ensure that the functionality you are adding will continue to work in the
future. Existing tests may also need updating if you have changed Task's future. Existing tests may also need updating if you have changed Task's
behaviour. behavior.
## 3. Committing your code ## 3. Committing your code
Try to write meaningful commit messages and avoid having too many commits on Try to write meaningful commit messages and avoid having too many commits on the
the PR. Most PRs should likely have a single commit (although for bigger PRs it PR. Most PRs should likely have a single commit (although for bigger PRs it may
may be reasonable to split it in a few). Git squash and rebase is your friend! be reasonable to split it in a few). Git squash and rebase is your friend!
## 4. Submitting a PR ## 4. Submitting a PR
@ -117,8 +120,10 @@ If you have questions, feel free to ask them in the `#help` forum channel on our
[Node.js]: https://nodejs.org/en/ [Node.js]: https://nodejs.org/en/
[Yarn]: https://yarnpkg.com/ [Yarn]: https://yarnpkg.com/
[Docusaurus]: https://docusaurus.io [Docusaurus]: https://docusaurus.io
[JSON Schema]: https://github.com/go-task/task/blob/master/docs/static/schema.json [JSON Schema]:
https://github.com/go-task/task/blob/master/docs/static/schema.json
[open issues]: https://github.com/go-task/task/issues [open issues]: https://github.com/go-task/task/issues
[good first issue]: https://github.com/go-task/task/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22 [good first issue]:
https://github.com/go-task/task/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
[Discord server]: https://discord.gg/6TY36E39UK [Discord server]: https://discord.gg/6TY36E39UK
[Discussion]: https://github.com/go-task/task/discussions [Discussion]: https://github.com/go-task/task/discussions

View File

@ -8,10 +8,8 @@ import (
"mvdan.cc/sh/v3/interp" "mvdan.cc/sh/v3/interp"
) )
var ( // ErrTaskfileAlreadyExists is returned on creating a Taskfile if one already exists
// ErrTaskfileAlreadyExists is returned on creating a Taskfile if one already exists var ErrTaskfileAlreadyExists = errors.New("task: A Taskfile already exists")
ErrTaskfileAlreadyExists = errors.New("task: A Taskfile already exists")
)
type taskNotFoundError struct { type taskNotFoundError struct {
taskName string taskName string

View File

@ -28,10 +28,8 @@ type RunCommandOptions struct {
Stderr io.Writer Stderr io.Writer
} }
var ( // ErrNilOptions is returned when a nil options is given
// ErrNilOptions is returned when a nil options is given var ErrNilOptions = errors.New("execext: nil options given")
ErrNilOptions = errors.New("execext: nil options given")
)
// RunCommand runs a shell command // RunCommand runs a shell command
func RunCommand(ctx context.Context, opts *RunCommandOptions) error { func RunCommand(ctx context.Context, opts *RunCommandOptions) error {

View File

@ -8,27 +8,35 @@ import (
"github.com/fatih/color" "github.com/fatih/color"
) )
type Color func() PrintFunc type (
type PrintFunc func(io.Writer, string, ...any) Color func() PrintFunc
PrintFunc func(io.Writer, string, ...any)
)
func Default() PrintFunc { func Default() PrintFunc {
return color.New(envColor("TASK_COLOR_RESET", color.Reset)).FprintfFunc() return color.New(envColor("TASK_COLOR_RESET", color.Reset)).FprintfFunc()
} }
func Blue() PrintFunc { func Blue() PrintFunc {
return color.New(envColor("TASK_COLOR_BLUE", color.FgBlue)).FprintfFunc() return color.New(envColor("TASK_COLOR_BLUE", color.FgBlue)).FprintfFunc()
} }
func Green() PrintFunc { func Green() PrintFunc {
return color.New(envColor("TASK_COLOR_GREEN", color.FgGreen)).FprintfFunc() return color.New(envColor("TASK_COLOR_GREEN", color.FgGreen)).FprintfFunc()
} }
func Cyan() PrintFunc { func Cyan() PrintFunc {
return color.New(envColor("TASK_COLOR_CYAN", color.FgCyan)).FprintfFunc() return color.New(envColor("TASK_COLOR_CYAN", color.FgCyan)).FprintfFunc()
} }
func Yellow() PrintFunc { func Yellow() PrintFunc {
return color.New(envColor("TASK_COLOR_YELLOW", color.FgYellow)).FprintfFunc() return color.New(envColor("TASK_COLOR_YELLOW", color.FgYellow)).FprintfFunc()
} }
func Magenta() PrintFunc { func Magenta() PrintFunc {
return color.New(envColor("TASK_COLOR_MAGENTA", color.FgMagenta)).FprintfFunc() return color.New(envColor("TASK_COLOR_MAGENTA", color.FgMagenta)).FprintfFunc()
} }
func Red() PrintFunc { func Red() PrintFunc {
return color.New(envColor("TASK_COLOR_RED", color.FgRed)).FprintfFunc() return color.New(envColor("TASK_COLOR_RED", color.FgRed)).FprintfFunc()
} }
@ -41,7 +49,6 @@ func envColor(env string, defaultColor color.Attribute) color.Attribute {
override, err := strconv.Atoi(os.Getenv(env)) override, err := strconv.Atoi(os.Getenv(env))
if err == nil { if err == nil {
return color.Attribute(override) return color.Attribute(override)
} }
return defaultColor return defaultColor
} }

View File

@ -17,7 +17,7 @@ import (
func TestInterleaved(t *testing.T) { func TestInterleaved(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var o output.Output = output.Interleaved{} var o output.Output = output.Interleaved{}
var w, _, _ = o.WrapWriter(&b, io.Discard, "", nil) w, _, _ := o.WrapWriter(&b, io.Discard, "", nil)
fmt.Fprintln(w, "foo\nbar") fmt.Fprintln(w, "foo\nbar")
assert.Equal(t, "foo\nbar\n", b.String()) assert.Equal(t, "foo\nbar\n", b.String())
@ -28,7 +28,7 @@ func TestInterleaved(t *testing.T) {
func TestGroup(t *testing.T) { func TestGroup(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var o output.Output = output.Group{} var o output.Output = output.Group{}
var stdOut, stdErr, cleanup = o.WrapWriter(&b, io.Discard, "", nil) stdOut, stdErr, cleanup := o.WrapWriter(&b, io.Discard, "", nil)
fmt.Fprintln(stdOut, "out\nout") fmt.Fprintln(stdOut, "out\nout")
assert.Equal(t, "", b.String()) assert.Equal(t, "", b.String())
@ -59,7 +59,7 @@ func TestGroupWithBeginEnd(t *testing.T) {
} }
t.Run("simple", func(t *testing.T) { t.Run("simple", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var w, _, cleanup = o.WrapWriter(&b, io.Discard, "", &tmpl) w, _, cleanup := o.WrapWriter(&b, io.Discard, "", &tmpl)
fmt.Fprintln(w, "foo\nbar") fmt.Fprintln(w, "foo\nbar")
assert.Equal(t, "", b.String()) assert.Equal(t, "", b.String())
@ -70,7 +70,7 @@ func TestGroupWithBeginEnd(t *testing.T) {
}) })
t.Run("no output", func(t *testing.T) { t.Run("no output", func(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var _, _, cleanup = o.WrapWriter(&b, io.Discard, "", &tmpl) _, _, cleanup := o.WrapWriter(&b, io.Discard, "", &tmpl)
assert.NoError(t, cleanup(nil)) assert.NoError(t, cleanup(nil))
assert.Equal(t, "", b.String()) assert.Equal(t, "", b.String())
}) })
@ -81,7 +81,7 @@ func TestGroupErrorOnlySwallowsOutputOnNoError(t *testing.T) {
var o output.Output = output.Group{ var o output.Output = output.Group{
ErrorOnly: true, ErrorOnly: true,
} }
var stdOut, stdErr, cleanup = o.WrapWriter(&b, io.Discard, "", nil) stdOut, stdErr, cleanup := o.WrapWriter(&b, io.Discard, "", nil)
_, _ = fmt.Fprintln(stdOut, "std-out") _, _ = fmt.Fprintln(stdOut, "std-out")
_, _ = fmt.Fprintln(stdErr, "std-err") _, _ = fmt.Fprintln(stdErr, "std-err")
@ -89,12 +89,13 @@ func TestGroupErrorOnlySwallowsOutputOnNoError(t *testing.T) {
assert.NoError(t, cleanup(nil)) assert.NoError(t, cleanup(nil))
assert.Empty(t, b.String()) assert.Empty(t, b.String())
} }
func TestGroupErrorOnlyShowsOutputOnError(t *testing.T) { func TestGroupErrorOnlyShowsOutputOnError(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var o output.Output = output.Group{ var o output.Output = output.Group{
ErrorOnly: true, ErrorOnly: true,
} }
var stdOut, stdErr, cleanup = o.WrapWriter(&b, io.Discard, "", nil) stdOut, stdErr, cleanup := o.WrapWriter(&b, io.Discard, "", nil)
_, _ = fmt.Fprintln(stdOut, "std-out") _, _ = fmt.Fprintln(stdOut, "std-out")
_, _ = fmt.Fprintln(stdErr, "std-err") _, _ = fmt.Fprintln(stdErr, "std-err")
@ -106,7 +107,7 @@ func TestGroupErrorOnlyShowsOutputOnError(t *testing.T) {
func TestPrefixed(t *testing.T) { func TestPrefixed(t *testing.T) {
var b bytes.Buffer var b bytes.Buffer
var o output.Output = output.Prefixed{} var o output.Output = output.Prefixed{}
var w, _, cleanup = o.WrapWriter(&b, io.Discard, "prefix", nil) w, _, cleanup := o.WrapWriter(&b, io.Discard, "prefix", nil)
t.Run("simple use cases", func(t *testing.T) { t.Run("simple use cases", func(t *testing.T) {
b.Reset() b.Reset()

View File

@ -147,7 +147,6 @@ func TestPrintDescriptionAsFallback(t *testing.T) {
summary.PrintTask(&l, taskWithoutSummaryOrDescription) summary.PrintTask(&l, taskWithoutSummaryOrDescription)
assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n") assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n")
} }
func TestPrintAllWithSpaces(t *testing.T) { func TestPrintAllWithSpaces(t *testing.T) {
@ -169,5 +168,4 @@ func TestPrintAllWithSpaces(t *testing.T) {
assert.True(t, strings.HasPrefix(buffer.String(), "task: t1")) assert.True(t, strings.HasPrefix(buffer.String(), "task: t1"))
assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n\n\ntask: t2") assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n\n\ntask: t2")
assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n\n\ntask: t3") assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n\n\ntask: t3")
} }

View File

@ -11,9 +11,7 @@ import (
"mvdan.cc/sh/v3/syntax" "mvdan.cc/sh/v3/syntax"
) )
var ( var templateFuncs template.FuncMap
templateFuncs template.FuncMap
)
func init() { func init() {
taskFuncs := template.FuncMap{ taskFuncs := template.FuncMap{

View File

@ -10,10 +10,8 @@ import (
"github.com/go-task/task/v3/taskfile" "github.com/go-task/task/v3/taskfile"
) )
var ( // ErrPreconditionFailed is returned when a precondition fails
// ErrPreconditionFailed is returned when a precondition fails var ErrPreconditionFailed = errors.New("task: precondition not met")
ErrPreconditionFailed = errors.New("task: precondition not met")
)
func (e *Executor) areTaskPreconditionsMet(ctx context.Context, t *taskfile.Task) (bool, error) { func (e *Executor) areTaskPreconditionsMet(ctx context.Context, t *taskfile.Task) (bool, error) {
for _, p := range t.Preconditions { for _, p := range t.Preconditions {
@ -22,7 +20,6 @@ func (e *Executor) areTaskPreconditionsMet(ctx context.Context, t *taskfile.Task
Dir: t.Dir, Dir: t.Dir,
Env: env.Get(t), Env: env.Get(t),
}) })
if err != nil { if err != nil {
e.Logger.Errf(logger.Magenta, "task: %s", p.Msg) e.Logger.Errf(logger.Magenta, "task: %s", p.Msg)
return false, ErrPreconditionFailed return false, ErrPreconditionFailed

View File

@ -404,7 +404,6 @@ func (e *Executor) GetTaskList(filters ...FilterFunc) ([]*taskfile.Task, error)
for key := range e.Taskfile.Tasks { for key := range e.Taskfile.Tasks {
task := e.Taskfile.Tasks[key] task := e.Taskfile.Tasks[key]
g.Go(func() error { g.Go(func() error {
// Check if we should filter the task // Check if we should filter the task
for _, filter := range filters { for _, filter := range filters {
if filter(task) { if filter(task) {

View File

@ -397,7 +397,7 @@ func TestGenerates(t *testing.T) {
fileWithSpaces = "my text file.txt" fileWithSpaces = "my text file.txt"
) )
var srcFile = filepathext.SmartJoin(dir, srcTask) srcFile := filepathext.SmartJoin(dir, srcTask)
for _, task := range []string{srcTask, relTask, absTask, fileWithSpaces} { for _, task := range []string{srcTask, relTask, absTask, fileWithSpaces} {
path := filepathext.SmartJoin(dir, task) path := filepathext.SmartJoin(dir, task)
@ -416,8 +416,8 @@ func TestGenerates(t *testing.T) {
assert.NoError(t, e.Setup()) assert.NoError(t, e.Setup())
for _, theTask := range []string{relTask, absTask, fileWithSpaces} { for _, theTask := range []string{relTask, absTask, fileWithSpaces} {
var destFile = filepathext.SmartJoin(dir, theTask) destFile := filepathext.SmartJoin(dir, theTask)
var upToDate = fmt.Sprintf("task: Task \"%s\" is up to date\n", srcTask) + upToDate := fmt.Sprintf("task: Task \"%s\" is up to date\n", srcTask) +
fmt.Sprintf("task: Task \"%s\" is up to date\n", theTask) fmt.Sprintf("task: Task \"%s\" is up to date\n", theTask)
// Run task for the first time. // Run task for the first time.
@ -704,7 +704,7 @@ func TestStatusVariables(t *testing.T) {
func TestInit(t *testing.T) { func TestInit(t *testing.T) {
const dir = "testdata/init" const dir = "testdata/init"
var file = filepathext.SmartJoin(dir, "Taskfile.yml") file := filepathext.SmartJoin(dir, "Taskfile.yml")
_ = os.Remove(file) _ = os.Remove(file)
if _, err := os.Stat(file); err == nil { if _, err := os.Stat(file); err == nil {
@ -964,7 +964,8 @@ func TestIncludesOptional(t *testing.T) {
TrimSpace: true, TrimSpace: true,
Files: map[string]string{ Files: map[string]string{
"called_dep.txt": "called_dep", "called_dep.txt": "called_dep",
}} },
}
tt.Run(t) tt.Run(t)
} }
@ -1327,7 +1328,6 @@ func TestDisplaysErrorOnUnsupportedVersion(t *testing.T) {
err := e.Setup() err := e.Setup()
assert.Error(t, err) assert.Error(t, err)
assert.Equal(t, "task: Taskfile versions prior to v2 are not supported anymore", err.Error()) assert.Equal(t, "task: Taskfile versions prior to v2 are not supported anymore", err.Error())
} }
func TestShortTaskNotation(t *testing.T) { func TestShortTaskNotation(t *testing.T) {
@ -1576,6 +1576,7 @@ Bye!
t.Log(buff.String()) t.Log(buff.String())
assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder)
} }
func TestOutputGroupErrorOnlySwallowsOutputOnSuccess(t *testing.T) { func TestOutputGroupErrorOnlySwallowsOutputOnSuccess(t *testing.T) {
const dir = "testdata/output_group_error_only" const dir = "testdata/output_group_error_only"
var buff bytes.Buffer var buff bytes.Buffer

View File

@ -32,7 +32,6 @@ type IncludedTaskfiles struct {
// UnmarshalYAML implements the yaml.Unmarshaler interface. // UnmarshalYAML implements the yaml.Unmarshaler interface.
func (tfs *IncludedTaskfiles) UnmarshalYAML(node *yaml.Node) error { func (tfs *IncludedTaskfiles) UnmarshalYAML(node *yaml.Node) error {
switch node.Kind { switch node.Kind {
case yaml.MappingNode: case yaml.MappingNode:
// NOTE(@andreynering): on this style of custom unmarshalling, // NOTE(@andreynering): on this style of custom unmarshalling,
// even number contains the keys, while odd numbers contains // even number contains the keys, while odd numbers contains

View File

@ -7,10 +7,8 @@ import (
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
var ( // ErrCantUnmarshalPrecondition is returned for invalid precond YAML.
// ErrCantUnmarshalPrecondition is returned for invalid precond YAML. var ErrCantUnmarshalPrecondition = errors.New("task: Can't unmarshal precondition value")
ErrCantUnmarshalPrecondition = errors.New("task: Can't unmarshal precondition value")
)
// Precondition represents a precondition necessary for a task to run // Precondition represents a precondition necessary for a task to run
type Precondition struct { type Precondition struct {

View File

@ -25,14 +25,16 @@ func TestPreconditionParse(t *testing.T) {
&taskfile.Precondition{}, &taskfile.Precondition{},
&taskfile.Precondition{Sh: "[ 1 = 0 ]", Msg: "[ 1 = 0 ] failed"}, &taskfile.Precondition{Sh: "[ 1 = 0 ]", Msg: "[ 1 = 0 ] failed"},
}, },
{` {
`
sh: "[ 1 = 2 ]" sh: "[ 1 = 2 ]"
msg: "1 is not 2" msg: "1 is not 2"
`, `,
&taskfile.Precondition{}, &taskfile.Precondition{},
&taskfile.Precondition{Sh: "[ 1 = 2 ]", Msg: "1 is not 2"}, &taskfile.Precondition{Sh: "[ 1 = 2 ]", Msg: "1 is not 2"},
}, },
{` {
`
sh: "[ 1 = 2 ]" sh: "[ 1 = 2 ]"
msg: "1 is not 2" msg: "1 is not 2"
`, `,

View File

@ -263,8 +263,8 @@ func checkCircularIncludes(node *ReaderNode) error {
if node.Parent == nil { if node.Parent == nil {
return errors.New("task: failed to check for include cycle: node.Parent was nil") return errors.New("task: failed to check for include cycle: node.Parent was nil")
} }
var curNode = node curNode := node
var basePath = filepathext.SmartJoin(node.Dir, node.Entrypoint) basePath := filepathext.SmartJoin(node.Dir, node.Entrypoint)
for curNode.Parent != nil { for curNode.Parent != nil {
curNode = curNode.Parent curNode = curNode.Parent
curPath := filepathext.SmartJoin(curNode.Dir, curNode.Entrypoint) curPath := filepathext.SmartJoin(curNode.Dir, curNode.Entrypoint)

View File

@ -34,7 +34,6 @@ type Taskfile struct {
func (tf *Taskfile) UnmarshalYAML(node *yaml.Node) error { func (tf *Taskfile) UnmarshalYAML(node *yaml.Node) error {
switch node.Kind { switch node.Kind {
case yaml.MappingNode: case yaml.MappingNode:
var taskfile struct { var taskfile struct {
Version *semver.Version Version *semver.Version

View File

@ -15,7 +15,6 @@ type Vars struct {
func (vs *Vars) UnmarshalYAML(node *yaml.Node) error { func (vs *Vars) UnmarshalYAML(node *yaml.Node) error {
switch node.Kind { switch node.Kind {
case yaml.MappingNode: case yaml.MappingNode:
// NOTE(@andreynering): on this style of custom unmarshalling, // NOTE(@andreynering): on this style of custom unmarshalling,
// even number contains the keys, while odd numbers contains // even number contains the keys, while odd numbers contains