policy: avoid stale invalid field warnings in eval

Track fields reloaded during eval --print resolution loops and filter
final invalid-field warnings against that set.

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi
2026-02-26 09:14:31 -08:00
parent 4880756a0f
commit 88cba2c367
2 changed files with 32 additions and 0 deletions
+19
View File
@@ -118,6 +118,7 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
var lastUnknowns []string var lastUnknowns []string
var trimmedUnknowns []string var trimmedUnknowns []string
var invalidFields []string var invalidFields []string
reloadedFields := map[string]struct{}{}
for { for {
maxAttempts-- maxAttempts--
if maxAttempts <= 0 { if maxAttempts <= 0 {
@@ -133,6 +134,9 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
} }
lastUnknowns = slices.Clone(trimmedUnknowns) lastUnknowns = slices.Clone(trimmedUnknowns)
toReload, invalid := selectReloadFields(opts.fields, trimmedUnknowns) toReload, invalid := selectReloadFields(opts.fields, trimmedUnknowns)
for _, f := range toReload {
reloadedFields[f] = struct{}{}
}
invalidFields = invalid invalidFields = invalid
if len(toReload) > 0 { if len(toReload) > 0 {
retry, next, err := policy.ResolveInputUnknowns(ctx, &input, srcReq.Source, toReload, platform, &p, metaResolver, verifier, nil) retry, next, err := policy.ResolveInputUnknowns(ctx, &input, srcReq.Source, toReload, platform, &p, metaResolver, verifier, nil)
@@ -157,6 +161,7 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
} }
break break
} }
invalidFields = filterInvalidFields(invalidFields, reloadedFields)
if len(invalidFields) > 0 { if len(invalidFields) > 0 {
logrus.Warnf("invalid fields: %v", strings.Join(invalidFields, ", ")) logrus.Warnf("invalid fields: %v", strings.Join(invalidFields, ", "))
@@ -292,6 +297,20 @@ func selectReloadFields(fields []string, unknowns []string) ([]string, []string)
return slices.Collect(maps.Keys(reload)), invalid return slices.Collect(maps.Keys(reload)), invalid
} }
func filterInvalidFields(invalid []string, reloadedFields map[string]struct{}) []string {
if len(invalid) == 0 {
return nil
}
out := make([]string, 0, len(invalid))
for _, field := range invalid {
if _, ok := reloadedFields[field]; ok {
continue
}
out = append(out, field)
}
return out
}
func findUnknownAncestor(field string, unknowns []string) string { func findUnknownAncestor(field string, unknowns []string) string {
var best string var best string
for _, unknown := range unknowns { for _, unknown := range unknowns {
+13
View File
@@ -127,6 +127,19 @@ func TestSelectReloadFields(t *testing.T) {
}) })
} }
func TestFilterInvalidFields(t *testing.T) {
out := filterInvalidFields([]string{
"git.tag",
"image.checksum",
}, map[string]struct{}{
"git.tag": {},
})
require.Equal(t, []string{"image.checksum"}, out)
out = filterInvalidFields([]string{"foo.bar"}, nil)
require.Equal(t, []string{"foo.bar"}, out)
}
func TestMaterialFieldPrerequisites(t *testing.T) { func TestMaterialFieldPrerequisites(t *testing.T) {
t.Run("non material field", func(t *testing.T) { t.Run("non material field", func(t *testing.T) {
prereq, ok := materialFieldPrerequisites("image.provenance") prereq, ok := materialFieldPrerequisites("image.provenance")