gohugoio/hugo · error

failed to match %s %q: %w

Error message

failed to match %s %q: %w

What it means

After successfully compiling a glob/range filter, calling matcher.IndexMatch(filter) returned an error (vectorstores.go:810-812). The filter object is valid but applying it against the configured dimension's index failed — e.g. resolving a named index that does not exist, or an inconsistent dimension configuration.

Source

Thrown at hugolib/sitesmatrix/vectorstores.go:812

				if what == "languages" {
					for i := range matcher.ForEachIndex() {
						result.Set(i)
					}
				} else {
					result.Set(matcher.IndexDefault())
				}
			}

			return result, nil
		}

		filter, err := predicate.NewIndexStringPredicateFromGlobsAndRanges(values, matcher.ResolveIndex, hglob.GetGlobDot)
		if err != nil {
			return nil, fmt.Errorf("failed to create filter for %s: %w", what, err)
		}
		iter, err := matcher.IndexMatch(filter)
		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))
	}

View on GitHub (pinned to 52c9bd7908)

Solutions

  1. Compare the filter values against the actually configured languages/versions/roles and remove or correct mismatches.
  2. Ensure the dimension configuration (ConfiguredLanguages/Versions/Roles) is fully loaded before applying filters.
  3. If the filter comes from URL/config input, restrict it to known dimension members.

Example fix

// before
cfg.Globs.Languages = []string{"pt-br"}  // not configured

// after
cfg.Globs.Languages = []string{"pt"}      // configured language
Defensive patterns

Strategy: validation

Validate before calling

// Ensure filter values reference only configured dimension members.
func filterMatchesConfigured(values []string, configured []string) error {
    set := map[string]bool{}
    for _, c := range configured { set[c] = true }
    for _, v := range values {
        if !set[v] {
            return fmt.Errorf("filter value %q is not a configured dimension member", v)
        }
    }
    return nil
}

Prevention

When it happens

Trigger: A glob filter that references a language/version/role name that cannot be resolved by matcher.ResolveIndex during matching, or an internal index mismatch in the configured dimension. The %q value shows the patterns; %s the dimension.

Common situations: Filtering by a language code (e.g. "pt-br") that is not configured in languages; a version glob matching a name removed from the versions config; role filter against an undefined role.

Related errors


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