From d9f8168c73700954885ac2c6e5065daa7045def9 Mon Sep 17 00:00:00 2001 From: "Jonathan A. Sternberg" Date: Mon, 10 Feb 2025 10:12:50 -0600 Subject: [PATCH] buildflags: make work on go 1.22 by reverting rangefunc usage Reverts the usage of rangefunc and attempts to keep the foundation of it in for when we move to go 1.23. We have downstream dependencies that aren't ready to move to go 1.23. We can likely move after go 1.24 is released. Signed-off-by: Jonathan A. Sternberg --- go.mod | 2 +- util/buildflags/attests_cty.go | 13 ++++++++----- util/buildflags/cache_cty.go | 20 ++++++++++++-------- util/buildflags/export_cty.go | 13 ++++++++----- util/buildflags/secrets_cty.go | 13 ++++++++----- util/buildflags/ssh_cty.go | 13 ++++++++----- util/buildflags/utils.go | 9 ++++++--- 7 files changed, 51 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index df8baede6bc0..6ae8abff93f5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/docker/buildx -go 1.23.0 +go 1.22.0 require ( github.com/Masterminds/semver/v3 v3.2.1 diff --git a/util/buildflags/attests_cty.go b/util/buildflags/attests_cty.go index e2592ac54f54..014b4bdf043d 100644 --- a/util/buildflags/attests_cty.go +++ b/util/buildflags/attests_cty.go @@ -22,16 +22,19 @@ func (e *Attests) FromCtyValue(in cty.Value, p cty.Path) error { return p.NewErrorf("%s", convert.MismatchMessage(got, want)) } -func (e *Attests) fromCtyValue(in cty.Value, p cty.Path) error { +func (e *Attests) fromCtyValue(in cty.Value, p cty.Path) (err error) { *e = make([]*Attest, 0, in.LengthInt()) - for value := range eachElement(in) { + + yield := func(value cty.Value) bool { entry := &Attest{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if err = entry.FromCtyValue(value, p); err != nil { + return false } *e = append(*e, entry) + return true } - return nil + eachElement(in)(yield) + return err } func (e Attests) ToCtyValue() cty.Value { diff --git a/util/buildflags/cache_cty.go b/util/buildflags/cache_cty.go index 0a818f978886..2e36140f302f 100644 --- a/util/buildflags/cache_cty.go +++ b/util/buildflags/cache_cty.go @@ -21,26 +21,30 @@ func (o *CacheOptions) FromCtyValue(in cty.Value, p cty.Path) error { return p.NewErrorf("%s", convert.MismatchMessage(got, want)) } -func (o *CacheOptions) fromCtyValue(in cty.Value, p cty.Path) error { +func (o *CacheOptions) fromCtyValue(in cty.Value, p cty.Path) (err error) { *o = make([]*CacheOptionsEntry, 0, in.LengthInt()) - for value := range eachElement(in) { + + yield := func(value cty.Value) bool { // Special handling for a string type to handle ref only format. if value.Type() == cty.String { - entries, err := ParseCacheEntry([]string{value.AsString()}) + var entries CacheOptions + entries, err = ParseCacheEntry([]string{value.AsString()}) if err != nil { - return err + return false } *o = append(*o, entries...) - continue + return true } entry := &CacheOptionsEntry{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if err = entry.FromCtyValue(value, p); err != nil { + return false } *o = append(*o, entry) + return true } - return nil + eachElement(in)(yield) + return err } func (o CacheOptions) ToCtyValue() cty.Value { diff --git a/util/buildflags/export_cty.go b/util/buildflags/export_cty.go index 88743d8ddc34..df5a3dbd73bb 100644 --- a/util/buildflags/export_cty.go +++ b/util/buildflags/export_cty.go @@ -21,16 +21,19 @@ func (e *Exports) FromCtyValue(in cty.Value, p cty.Path) error { return p.NewErrorf("%s", convert.MismatchMessage(got, want)) } -func (e *Exports) fromCtyValue(in cty.Value, p cty.Path) error { +func (e *Exports) fromCtyValue(in cty.Value, p cty.Path) (err error) { *e = make([]*ExportEntry, 0, in.LengthInt()) - for value := range eachElement(in) { + + yield := func(value cty.Value) bool { entry := &ExportEntry{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if err = entry.FromCtyValue(value, p); err != nil { + return false } *e = append(*e, entry) + return true } - return nil + eachElement(in)(yield) + return err } func (e Exports) ToCtyValue() cty.Value { diff --git a/util/buildflags/secrets_cty.go b/util/buildflags/secrets_cty.go index 7e9ba28d2077..5c5238a5fe6a 100644 --- a/util/buildflags/secrets_cty.go +++ b/util/buildflags/secrets_cty.go @@ -28,16 +28,19 @@ func (s *Secrets) FromCtyValue(in cty.Value, p cty.Path) error { return p.NewErrorf("%s", convert.MismatchMessage(got, want)) } -func (s *Secrets) fromCtyValue(in cty.Value, p cty.Path) error { +func (s *Secrets) fromCtyValue(in cty.Value, p cty.Path) (err error) { *s = make([]*Secret, 0, in.LengthInt()) - for value := range eachElement(in) { + + yield := func(value cty.Value) bool { entry := &Secret{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if err = entry.FromCtyValue(value, p); err != nil { + return false } *s = append(*s, entry) + return true } - return nil + eachElement(in)(yield) + return err } func (s Secrets) ToCtyValue() cty.Value { diff --git a/util/buildflags/ssh_cty.go b/util/buildflags/ssh_cty.go index 694a74212655..7ea4d75a07d2 100644 --- a/util/buildflags/ssh_cty.go +++ b/util/buildflags/ssh_cty.go @@ -28,16 +28,19 @@ func (s *SSHKeys) FromCtyValue(in cty.Value, p cty.Path) error { return p.NewErrorf("%s", convert.MismatchMessage(got, want)) } -func (s *SSHKeys) fromCtyValue(in cty.Value, p cty.Path) error { +func (s *SSHKeys) fromCtyValue(in cty.Value, p cty.Path) (err error) { *s = make([]*SSH, 0, in.LengthInt()) - for value := range eachElement(in) { + + yield := func(value cty.Value) bool { entry := &SSH{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if err = entry.FromCtyValue(value, p); err != nil { + return false } *s = append(*s, entry) + return true } - return nil + eachElement(in)(yield) + return err } func (s SSHKeys) ToCtyValue() cty.Value { diff --git a/util/buildflags/utils.go b/util/buildflags/utils.go index 6535bb10cccf..c7aeffd5c060 100644 --- a/util/buildflags/utils.go +++ b/util/buildflags/utils.go @@ -1,8 +1,6 @@ package buildflags import ( - "iter" - "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/gocty" ) @@ -57,7 +55,12 @@ func isEmptyOrUnknown(v cty.Value) bool { return !v.IsKnown() || (v.Type() == cty.String && v.AsString() == "") } -func eachElement(in cty.Value) iter.Seq[cty.Value] { +// Seq is a temporary definition of iter.Seq until we are able to migrate +// to using go1.23 as our minimum version. This can be removed when go1.24 +// is released and usages can be changed to use rangefunc. +type Seq[V any] func(yield func(V) bool) + +func eachElement(in cty.Value) Seq[cty.Value] { return func(yield func(v cty.Value) bool) { for elem := in.ElementIterator(); elem.Next(); { _, value := elem.Element()