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:
committed by
Andrey Nering
parent
aab51c331f
commit
09c9094a6b
@ -7,6 +7,7 @@ linters:
|
|||||||
enable:
|
enable:
|
||||||
- goimports
|
- goimports
|
||||||
- gofmt
|
- gofmt
|
||||||
|
- gofumpt
|
||||||
|
|
||||||
linters-settings:
|
linters-settings:
|
||||||
goimports:
|
goimports:
|
||||||
|
11
CHANGELOG.md
11
CHANGELOG.md
@ -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.
|
||||||
|
@ -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:
|
||||||
|
@ -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, "=") {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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:]))
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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{
|
||||||
|
@ -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
|
||||||
|
1
task.go
1
task.go
@ -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) {
|
||||||
|
13
task_test.go
13
task_test.go
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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"
|
||||||
`,
|
`,
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user