You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package sourcepolicy
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/moby/buildkit/solver/pb"
|
|
spb "github.com/moby/buildkit/sourcepolicy/pb"
|
|
"github.com/moby/buildkit/util/bklog"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// mutate is a MutateFn which converts the source operation to the identifier and attributes provided by the policy.
|
|
// If there is no change, then the return value should be false and is not considered an error.
|
|
func mutate(ctx context.Context, op *pb.SourceOp, rule *spb.Rule, selector *selectorCache, ref string) (bool, error) {
|
|
if rule.Updates == nil {
|
|
return false, errors.Errorf("missing destination for convert rule")
|
|
}
|
|
|
|
dest := rule.Updates.Identifier
|
|
if dest == "" {
|
|
dest = rule.Selector.Identifier
|
|
}
|
|
dest, err := selector.Format(ref, dest)
|
|
if err != nil {
|
|
return false, errors.Wrap(err, "error formatting destination")
|
|
}
|
|
|
|
bklog.G(ctx).Debugf("sourcepolicy: converting %s to %s, pattern: %s", ref, dest, rule.Updates.Identifier)
|
|
|
|
var mutated bool
|
|
if op.Identifier != dest && dest != "" {
|
|
mutated = true
|
|
op.Identifier = dest
|
|
}
|
|
|
|
if rule.Updates.Attrs != nil {
|
|
if op.Attrs == nil {
|
|
op.Attrs = make(map[string]string, len(rule.Updates.Attrs))
|
|
}
|
|
for k, v := range rule.Updates.Attrs {
|
|
if op.Attrs[k] != v {
|
|
bklog.G(ctx).Debugf("setting attr %s=%s", k, v)
|
|
op.Attrs[k] = v
|
|
mutated = true
|
|
}
|
|
}
|
|
}
|
|
|
|
return mutated, nil
|
|
}
|