diff --git a/go.mod b/go.mod index 4a58534f..e5bf4ce0 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/go-task/task/v3 -go 1.20 +go 1.21 require ( github.com/Masterminds/semver/v3 v3.2.1 @@ -15,7 +15,6 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 github.com/zeebo/xxh3 v1.0.2 - golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e golang.org/x/sync v0.6.0 golang.org/x/term v0.17.0 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index 16f30620..ba62c1f0 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,26 @@ github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= +github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -30,6 +35,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE= github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY= +github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/sajari/fuzzy v1.0.0 h1:+FmwVvJErsd0d0hAPlj4CxqxUtQY/fOoY0DwX4ykpRY= github.com/sajari/fuzzy v1.0.0/go.mod h1:OjYR6KxoWOe9+dOlXeiCJd4dIbED4Oo8wpS89o0pwOo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -43,10 +49,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e h1:723BNChdd0c2Wk6WOE320qGBiPtYx0F0Bbm1kriShfE= -golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/exp/maps.go b/internal/exp/maps.go new file mode 100644 index 00000000..9d660750 --- /dev/null +++ b/internal/exp/maps.go @@ -0,0 +1,26 @@ +// This package is intended as a place to copy functions from the +// golang.org/x/exp package. Copying these functions allows us to rely on our +// own code instead of an external package that may change unpredictably in the +// future. +// +// It also prevents problems with transitive dependencies whereby a +// package that imports Task (and therefore our version of golang.org/x/exp) +// cannot import a different version of golang.org/x/exp. +// +// Finally, it serves as a place to track functions that may be able to be +// removed in the future if they are added to the standard library. This is also +// why this package is under the internal directory since these functions are +// not intended to be used outside of Task. +package exp + +import "cmp" + +// Keys is a copy of https://pkg.go.dev/golang.org/x/exp@v0.0.0-20240103183307-be819d1f06fc/maps#Keys. +// This is not yet included in the standard library. See https://github.com/golang/go/issues/61538. +func Keys[K cmp.Ordered, V any](m map[K]V) []K { + var keys []K + for key := range m { + keys = append(keys, key) + } + return keys +} diff --git a/internal/experiments/experiments.go b/internal/experiments/experiments.go index 5eb8b83d..1db71dca 100644 --- a/internal/experiments/experiments.go +++ b/internal/experiments/experiments.go @@ -5,12 +5,12 @@ import ( "io" "os" "path" + "slices" "strings" "text/tabwriter" "github.com/joho/godotenv" "github.com/spf13/pflag" - "golang.org/x/exp/slices" "github.com/go-task/task/v3/internal/logger" ) diff --git a/internal/logger/logger.go b/internal/logger/logger.go index c031346f..cde5f597 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -4,11 +4,11 @@ import ( "bufio" "io" "os" + "slices" "strconv" "strings" "github.com/fatih/color" - "golang.org/x/exp/slices" "github.com/go-task/task/v3/errors" "github.com/go-task/task/v3/internal/term" diff --git a/internal/omap/orderedmap.go b/internal/omap/orderedmap.go index c57b9023..cf7fc22c 100644 --- a/internal/omap/orderedmap.go +++ b/internal/omap/orderedmap.go @@ -1,26 +1,26 @@ package omap import ( + "cmp" "fmt" + "slices" - "golang.org/x/exp/constraints" - "golang.org/x/exp/maps" - "golang.org/x/exp/slices" "gopkg.in/yaml.v3" "github.com/go-task/task/v3/internal/deepcopy" + "github.com/go-task/task/v3/internal/exp" ) // An OrderedMap is a wrapper around a regular map that maintains an ordered // list of the map's keys. This allows you to run deterministic and ordered // operations on the map such as printing/serializing/iterating. -type OrderedMap[K constraints.Ordered, V any] struct { +type OrderedMap[K cmp.Ordered, V any] struct { s []K m map[K]V } // New will create a new OrderedMap of the given type and return it. -func New[K constraints.Ordered, V any]() OrderedMap[K, V] { +func New[K cmp.Ordered, V any]() OrderedMap[K, V] { return OrderedMap[K, V]{ s: make([]K, 0), m: make(map[K]V), @@ -29,14 +29,14 @@ func New[K constraints.Ordered, V any]() OrderedMap[K, V] { // FromMap will create a new OrderedMap from the given map. Since Golang maps // are unordered, the order of the created OrderedMap will be random. -func FromMap[K constraints.Ordered, V any](m map[K]V) OrderedMap[K, V] { +func FromMap[K cmp.Ordered, V any](m map[K]V) OrderedMap[K, V] { om := New[K, V]() om.m = m - om.s = maps.Keys(m) + om.s = exp.Keys(m) return om } -func FromMapWithOrder[K constraints.Ordered, V any](m map[K]V, order []K) OrderedMap[K, V] { +func FromMapWithOrder[K cmp.Ordered, V any](m map[K]V, order []K) OrderedMap[K, V] { om := New[K, V]() if len(m) != len(order) { panic("length of map and order must be equal") diff --git a/internal/omap/orderedmap_test.go b/internal/omap/orderedmap_test.go index 14220831..c1adc9b3 100644 --- a/internal/omap/orderedmap_test.go +++ b/internal/omap/orderedmap_test.go @@ -43,13 +43,7 @@ func TestSortFunc(t *testing.T) { om.Set(1, "one") om.Set(2, "two") om.SortFunc(func(a, b int) int { - if a < b { - return 1 - } - if a > b { - return -1 - } - return 0 + return b - a }) assert.Equal(t, []int{3, 2, 1}, om.s) } diff --git a/internal/slicesext/slicesext.go b/internal/slicesext/slicesext.go index 25b120a5..8b539bc8 100644 --- a/internal/slicesext/slicesext.go +++ b/internal/slicesext/slicesext.go @@ -1,11 +1,11 @@ package slicesext import ( - "golang.org/x/exp/constraints" - "golang.org/x/exp/slices" + "cmp" + "slices" ) -func UniqueJoin[T constraints.Ordered](ss ...[]T) []T { +func UniqueJoin[T cmp.Ordered](ss ...[]T) []T { var length int for _, s := range ss { length += len(s) diff --git a/internal/templater/templater.go b/internal/templater/templater.go index 9a123467..b7cf3cd8 100644 --- a/internal/templater/templater.go +++ b/internal/templater/templater.go @@ -2,11 +2,10 @@ package templater import ( "bytes" + "maps" "strings" "text/template" - "golang.org/x/exp/maps" - "github.com/go-task/task/v3/taskfile/ast" ) diff --git a/task.go b/task.go index 9200a471..41609c5f 100644 --- a/task.go +++ b/task.go @@ -6,6 +6,7 @@ import ( "io" "os" "runtime" + "slices" "sync" "sync/atomic" "time" @@ -24,7 +25,6 @@ import ( "github.com/go-task/task/v3/taskfile/ast" "github.com/sajari/fuzzy" - "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" ) diff --git a/taskfile/ast/include.go b/taskfile/ast/include.go index b55762cc..10b420c8 100644 --- a/taskfile/ast/include.go +++ b/taskfile/ast/include.go @@ -5,11 +5,11 @@ import ( "path/filepath" "strings" + "gopkg.in/yaml.v3" + "github.com/go-task/task/v3/internal/execext" "github.com/go-task/task/v3/internal/filepathext" omap "github.com/go-task/task/v3/internal/omap" - - "gopkg.in/yaml.v3" ) // Include represents information about included taskfiles