gohugoio/hugo · critical
failed to apply filters: %w
Error message
failed to apply filters: %w
What it means
IntSetsBuilder.WithConfig applies three filters (languages, versions, roles) via applyFilter and, if any returned an error, panics with a wrapped %w (vectorstores.go:828-830). This treats filter setup failure as a programmer error/invariant violation rather than a recoverable condition. The underlying cause is one of the 'failed to create filter' or 'failed to match' errors.
Source
Thrown at hugolib/sitesmatrix/vectorstores.go:829
if err != nil {
return nil, fmt.Errorf("failed to match %s %q: %w", what, values, err)
}
for i := range iter {
if result == nil {
result = hmaps.NewOrderedIntSet()
}
result.Set(i)
}
return result, nil
}
l, err1 := applyFilter("languages", cfg.Globs.Languages, b.cfg.ConfiguredLanguages)
v, err2 := applyFilter("versions", cfg.Globs.Versions, b.cfg.ConfiguredVersions)
r, err3 := applyFilter("roles", cfg.Globs.Roles, b.cfg.ConfiguredRoles)
if err := cmp.Or(err1, err2, err3); err != nil {
panic(fmt.Errorf("failed to apply filters: %w", err))
}
b.GlobFilterMisses = Bools{
len(cfg.Globs.Languages) > 0 && l == nil,
len(cfg.Globs.Versions) > 0 && v == nil,
len(cfg.Globs.Roles) > 0 && r == nil,
}
b.s.languages = l
b.s.versions = v
b.s.roles = r
return b
}
func (s *IntSetsBuilder) WithLanguageIndices(idxs ...int) *IntSetsBuilder {
if len(idxs) == 0 {
return sView on GitHub (pinned to 52c9bd7908)
Solutions
- Validate all glob/range patterns and dimension names BEFORE calling WithConfig (pre-compile with the same predicate library).
- Ensure WithConfig only receives filters referencing configured dimensions.
- Wrap builder construction in a recover() during development to capture the wrapped error for diagnosis.
- Treat any occurrence as a bug in the calling code's input validation.
Example fix
// before
b := builder.WithConfig(IntSetsConfig{Globs: IntSetsGlobs{Languages: []string{"[bad"}}}) // panics
// after: validate first
for _, g := range globs.Languages {
if _, err := predicate.NewIndexStringPredicateFromGlobsAndRanges([]string{g}, langs.ResolveIndex, hglob.GetGlobDot); err != nil {
return err
}
}
b := builder.WithConfig(IntSetsConfig{Globs: globs}) Defensive patterns
Strategy: validation
Validate before calling
// Validate all three dimensions' globs BEFORE calling WithConfig to avoid the panic.
func safeWithConfig(b *IntSetsBuilder, cfg IntSetsConfig, c *ConfiguredDimensions) (*IntSetsBuilder, error) {
checks := []struct{ name string; vals []string; m ConfiguredDimension }{
{"languages", cfg.Globs.Languages, c.ConfiguredLanguages},
{"versions", cfg.Globs.Versions, c.ConfiguredVersions},
{"roles", cfg.Globs.Roles, c.ConfiguredRoles},
}
for _, ck := range checks {
for _, g := range ck.vals {
if _, err := predicate.NewIndexStringPredicateFromGlobsAndRanges([]string{g}, ck.m.ResolveIndex, hglob.GetGlobDot); err != nil {
return nil, fmt.Errorf("invalid %s glob %q: %w", ck.name, g, err)
}
}
}
return b.WithConfig(cfg), nil
} Try / catch
// During development, wrap WithConfig to capture the panic as an error.
func recoverWithConfig(b *IntSetsBuilder, cfg IntSetsConfig) (out *IntSetsBuilder, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("WithConfig panic: %v", r)
}
}()
return b.WithConfig(cfg), nil
} Prevention
- Never pass unvalidated user/config glob strings to WithConfig.
- Pre-compile each glob with the predicate library in a helper before building.
- Treat a panic here as an input-validation bug in the caller.
When it happens
Trigger: Any invalid glob/range pattern or unresolvable dimension name in cfg.Globs passed to IntSetsBuilder.WithConfig triggers the panic via the applyFilter error path. Because callers don't expect an error return from WithConfig, it panics.
Common situations: Constructing an IntSetsBuilder programmatically with user-supplied filter strings without prior validation; a config refactor that introduces a bad default glob.
Related errors
- failed to create filter for %s: %w
- unknown dimension %q
- failed to calculate hash for IntSets: %w
- failed to match %s %q: %w
- role name cannot be empty
AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09).
Data as JSON: /api/errors/a14d02fd3ed99051.
Report an issue: GitHub.