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 trimmedUnknowns []string
var invalidFields []string
reloadedFields := map[string]struct{}{}
for {
maxAttempts--
if maxAttempts <= 0 {
@@ -133,6 +134,9 @@ func runEval(ctx context.Context, dockerCli command.Cli, source string, opts eva
}
lastUnknowns = slices.Clone(trimmedUnknowns)
toReload, invalid := selectReloadFields(opts.fields, trimmedUnknowns)
for _, f := range toReload {
reloadedFields[f] = struct{}{}
}
invalidFields = invalid
if len(toReload) > 0 {
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
}
invalidFields = filterInvalidFields(invalidFields, reloadedFields)
if len(invalidFields) > 0 {
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
}
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 {
var best string
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) {
t.Run("non material field", func(t *testing.T) {
prereq, ok := materialFieldPrerequisites("image.provenance")