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 s

View on GitHub (pinned to 52c9bd7908)

Solutions

  1. Validate all glob/range patterns and dimension names BEFORE calling WithConfig (pre-compile with the same predicate library).
  2. Ensure WithConfig only receives filters referencing configured dimensions.
  3. Wrap builder construction in a recover() during development to capture the wrapped error for diagnosis.
  4. 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

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


AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09). Data as JSON: /api/errors/a14d02fd3ed99051. Report an issue: GitHub.