hashicorp/packer · error
unsupported scope: %s
Error message
unsupported scope: %s
What it means
Inside Generate, g.config.Scope is mapped to a source.Scope; only 'all-layers', '' and 'squashed' are recognized. Any other value returns `unsupported scope: %s`. Normally unreachable because ParseScopeFromArgs and NewGenerator normalize scope, but code that populates Config directly can insert invalid values.
Source
Thrown at internal/sbom/generator_syft.go:44
getSourceCfg := syft.DefaultGetSourceConfig()
if len(g.config.Exclude) > 0 {
getSourceCfg = getSourceCfg.WithExcludeConfig(source.ExcludeConfig{Paths: g.config.Exclude})
}
src, err := syft.GetSource(ctx, sourceInput, getSourceCfg)
if err != nil {
return nil, fmt.Errorf("failed to get source: %w", err)
}
defer func() { _ = src.Close() }()
var scope source.Scope
switch g.config.Scope {
case ScopeAllLayers:
scope = source.AllLayersScope
case "", ScopeSquashed:
scope = source.SquashedScope
default:
return nil, fmt.Errorf("unsupported scope: %s", g.config.Scope)
}
sbomCfg := syft.DefaultCreateSBOMConfig().
WithSearchConfig(cataloging.SearchConfig{
Scope: scope,
}).
WithParallelism(g.config.Parallelism)
sbomResult, err := syft.CreateSBOM(ctx, src, sbomCfg)
if err != nil {
return nil, fmt.Errorf("failed to create SBOM: %w", err)
}
return g.encodeToFormat(sbomResult)
}
// encodeToFormat encodes the SBOM to the requested format.
func (g *Generator) encodeToFormat(sbomData *sbom.SBOM) ([]byte, error) {View on GitHub (pinned to eb36e3c3e4)
Solutions
- Set Scope only via ParseScopeFromArgs, or leave it empty so NewGenerator defaults to squashed
- Accept only "squashed" or "all-layers" in the HCL/template config surface and validate early
- Update any stored config that holds a non-canonical scope string
Example fix
// before
gen := sbom.NewGenerator(sbom.Config{Scope: scopeFromUser}) // raw, unvalidated
// after
scope, err := sbom.ParseScopeFromArgs(scopeFromUser)
if err != nil { return err }
gen := sbom.NewGenerator(sbom.Config{Scope: scope}) Defensive patterns
Strategy: validation
Validate before calling
scope, err := sbom.ParseScopeFromArgs(cfg.Scope)
if err != nil { return err }
cfg.Scope = scope
gen := sbom.NewGenerator(cfg) Type guard
func validScope(s string) bool { return s == "" || s == "squashed" || s == "all-layers" } Try / catch
out, err := gen.Generate(ctx)
if err != nil {
if strings.HasPrefix(err.Error(), "unsupported scope") { return fmt.Errorf("fix Scope in config: %w", err) }
return err
} Prevention
- Never assign raw user strings to Config.Scope without ParseScopeFromArgs
- Centralize scope parsing at config load
- Constrain template fields for scope to known values
When it happens
Trigger: Constructing sbom.Config{Scope: "directory"} or another raw string and calling Generate without passing it through ParseScopeFromArgs/NewGenerator; config sources bypassing validation (HCL field set to an arbitrary value).
Common situations: Users setting scope via template fields with values like "all-layers:" or "squashed+uncompressed" copied from other tools; programmatic callers of the internal package skipping ParseScopeFromArgs.
Related errors
- unsupported format: %s
- unsupported scope: %s (supported: squashed, all-layers)
- failed to get source: %w
- failed to create SBOM: %w
- failed to create CycloneDX encoder: %w
AI-assisted analysis of hashicorp/packer@eb36e3c3e4 (2026-09-05).
Data as JSON: /api/errors/0d292ec60466f6fd.
Report an issue: GitHub.