From 3ae9970da5ff06f1da4712c984e393bbaa4c2a9a Mon Sep 17 00:00:00 2001 From: "Jonathan A. Sternberg" Date: Mon, 10 Feb 2025 11:03:46 -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 | 22 +++++++++++++--------- 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, 52 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index df8baede6..6ae8abff9 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 e2592ac54..2b60b167f 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) (retErr 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 retErr = entry.FromCtyValue(value, p); retErr != nil { + return false } *e = append(*e, entry) + return true } - return nil + eachElement(in)(yield) + return retErr } func (e Attests) ToCtyValue() cty.Value { diff --git a/util/buildflags/cache_cty.go b/util/buildflags/cache_cty.go index 0a818f978..7186b025c 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) (retErr 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()}) - if err != nil { - return err + var entries CacheOptions + entries, retErr = ParseCacheEntry([]string{value.AsString()}) + if retErr != nil { + return false } *o = append(*o, entries...) - continue + return true } entry := &CacheOptionsEntry{} - if err := entry.FromCtyValue(value, p); err != nil { - return err + if retErr = entry.FromCtyValue(value, p); retErr != nil { + return false } *o = append(*o, entry) + return true } - return nil + eachElement(in)(yield) + return retErr } func (o CacheOptions) ToCtyValue() cty.Value { diff --git a/util/buildflags/export_cty.go b/util/buildflags/export_cty.go index 88743d8dd..3df3eb298 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) (retErr 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 retErr = entry.FromCtyValue(value, p); retErr != nil { + return false } *e = append(*e, entry) + return true } - return nil + eachElement(in)(yield) + return retErr } func (e Exports) ToCtyValue() cty.Value { diff --git a/util/buildflags/secrets_cty.go b/util/buildflags/secrets_cty.go index 7e9ba28d2..aaadfc39a 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) (retErr 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 retErr = entry.FromCtyValue(value, p); retErr != nil { + return false } *s = append(*s, entry) + return true } - return nil + eachElement(in)(yield) + return retErr } func (s Secrets) ToCtyValue() cty.Value { diff --git a/util/buildflags/ssh_cty.go b/util/buildflags/ssh_cty.go index 694a74212..ef5807298 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) (retErr 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 retErr = entry.FromCtyValue(value, p); retErr != nil { + return false } *s = append(*s, entry) + return true } - return nil + eachElement(in)(yield) + return retErr } func (s SSHKeys) ToCtyValue() cty.Value { diff --git a/util/buildflags/utils.go b/util/buildflags/utils.go index 6535bb10c..c7aeffd5c 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()