diff --git a/CHANGELOG.md b/CHANGELOG.md index d348e660..c7d83880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Fixed some bugs regarding minor version checks on `version:`. - Add `preconditions:` to task ([#205](https://github.com/go-task/task/pull/205)). - Create directory informed on `dir:` if it doesn't exist diff --git a/go.mod b/go.mod index 33ddcd46..1b479dd7 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/go-task/task/v2 require ( - github.com/Masterminds/semver v1.4.2 + github.com/Masterminds/semver v1.4.2 // indirect github.com/Masterminds/sprig v2.16.0+incompatible github.com/aokoli/goutils v1.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect diff --git a/internal/taskfile/version/version.go b/internal/taskfile/version/version.go deleted file mode 100644 index b2776c31..00000000 --- a/internal/taskfile/version/version.go +++ /dev/null @@ -1,58 +0,0 @@ -package version - -import ( - "github.com/Masterminds/semver" -) - -var ( - v1 = mustVersion("1") - v2 = mustVersion("2") - v21 = mustVersion("2.1") - v22 = mustVersion("2.2") - v23 = mustVersion("2.3") - v24 = mustVersion("2.4") - v25 = mustVersion("2.5") -) - -// IsV1 returns if is a given Taskfile version is version 1 -func IsV1(v *semver.Constraints) bool { - return v.Check(v1) -} - -// IsV2 returns if is a given Taskfile version is at least version 2 -func IsV2(v *semver.Constraints) bool { - return v.Check(v2) -} - -// IsV21 returns if is a given Taskfile version is at least version 2.1 -func IsV21(v *semver.Constraints) bool { - return v.Check(v21) -} - -// IsV22 returns if is a given Taskfile version is at least version 2.2 -func IsV22(v *semver.Constraints) bool { - return v.Check(v22) -} - -// IsV23 returns if is a given Taskfile version is at least version 2.3 -func IsV23(v *semver.Constraints) bool { - return v.Check(v23) -} - -// IsV24 returns if is a given Taskfile version is at least version 2.4 -func IsV24(v *semver.Constraints) bool { - return v.Check(v24) -} - -// IsV25 returns if is a given Taskfile version is at least version 2.5 -func IsV25(v *semver.Constraints) bool { - return v.Check(v25) -} - -func mustVersion(s string) *semver.Version { - v, err := semver.NewVersion(s) - if err != nil { - panic(err) - } - return v -} diff --git a/task.go b/task.go index 8e3dfab2..1332c46c 100644 --- a/task.go +++ b/task.go @@ -2,9 +2,11 @@ package task import ( "context" + "errors" "fmt" "io" "os" + "strconv" "sync" "sync/atomic" @@ -17,9 +19,7 @@ import ( "github.com/go-task/task/v2/internal/summary" "github.com/go-task/task/v2/internal/taskfile" "github.com/go-task/task/v2/internal/taskfile/read" - "github.com/go-task/task/v2/internal/taskfile/version" - "github.com/Masterminds/semver" "golang.org/x/sync/errgroup" ) @@ -95,11 +95,6 @@ func (e *Executor) Setup() error { return err } - v, err := semver.NewConstraint(e.Taskfile.Version) - if err != nil { - return fmt.Errorf(`task: could not parse taskfile version "%s": %v`, e.Taskfile.Version, err) - } - if e.Stdin == nil { e.Stdin = os.Stdin } @@ -114,14 +109,30 @@ func (e *Executor) Setup() error { Stderr: e.Stderr, Verbose: e.Verbose, } - switch { - case version.IsV1(v): + + v, err := strconv.ParseFloat(e.Taskfile.Version, 64) + if err != nil { + return fmt.Errorf(`task: Could not parse taskfile version "%s": %v`, e.Taskfile.Version, err) + } + // consider as equal to the greater version if round + if v == 2.0 { + v = 2.6 + } + + if v < 1 { + return fmt.Errorf(`task: Taskfile version should be greater or equal to v1`) + } + if v > 2.6 { + return fmt.Errorf(`task: Taskfile versions greater than v2.6 not implemented in the version of Task`) + } + + if v < 2 { e.Compiler = &compilerv1.CompilerV1{ Dir: e.Dir, Vars: e.taskvars, Logger: e.Logger, } - case version.IsV2(v), version.IsV21(v), version.IsV22(v), version.IsV23(v): + } else { // v >= 2 e.Compiler = &compilerv2.CompilerV2{ Dir: e.Dir, Taskvars: e.taskvars, @@ -129,17 +140,15 @@ func (e *Executor) Setup() error { Expansions: e.Taskfile.Expansions, Logger: e.Logger, } - - case version.IsV24(v): - return fmt.Errorf(`task: Taskfile versions greater than v2.4 not implemented in the version of Task`) } - if !version.IsV21(v) && e.Taskfile.Output != "" { + if v < 2.1 && e.Taskfile.Output != "" { return fmt.Errorf(`task: Taskfile option "output" is only available starting on Taskfile version v2.1`) } - if !version.IsV22(v) && len(e.Taskfile.Includes) > 0 { + if v < 2.2 && len(e.Taskfile.Includes) > 0 { return fmt.Errorf(`task: Including Taskfiles is only available starting on Taskfile version v2.2`) } + if e.OutputStyle != "" { e.Taskfile.Output = e.OutputStyle } @@ -154,8 +163,8 @@ func (e *Executor) Setup() error { return fmt.Errorf(`task: output option "%s" not recognized`, e.Taskfile.Output) } - if !version.IsV21(v) { - err := fmt.Errorf(`task: Taskfile option "ignore_error" is only available starting on Taskfile version v2.1`) + if v <= 2.1 { + err := errors.New(`task: Taskfile option "ignore_error" is only available starting on Taskfile version v2.1`) for _, task := range e.Taskfile.Tasks { if task.IgnoreError { @@ -169,6 +178,14 @@ func (e *Executor) Setup() error { } } + if v < 2.6 { + for _, task := range e.Taskfile.Tasks { + if len(task.Preconditions) > 0 { + return errors.New(`task: Task option "preconditions" is only available starting on Taskfile version v2.6`) + } + } + } + e.taskCallCount = make(map[string]*int32, len(e.Taskfile.Tasks)) e.mkdirMutexMap = make(map[string]*sync.Mutex, len(e.Taskfile.Tasks)) for k := range e.Taskfile.Tasks {