getzola/zola · error

Invalid glob pattern: , error =

Error message

Invalid {name} glob pattern: {pat}, error = {e}

What it means

`build_ignore_glob_set` builds a `GlobSet` from user-supplied glob patterns. Each pattern is compiled with `Glob::new`; on failure it bails with the pattern and the underlying globset error. Malformed globs (unbalanced brackets, invalid syntax) cannot be compiled.

Solutions

  1. Fix the glob pattern named in the error to valid globset syntax
  2. Test the pattern syntax (e.g. balanced `[]`, `{}`, `*`/`**` usage)
  3. Simplify to a plain filename or prefix pattern if advanced syntax isn't needed

Example fix

// before
ignored_content = ["**["]
// after
ignored_content = ["**/drafts/**"]
Defensive patterns

Strategy: validation

Validate before calling

fn globs_valid(pats: &[String]) -> bool {
    pats.iter().all(|p| globset::Glob::new(p).is_ok())
}

Try / catch

match build_ignore_glob_set(&pats, "ignored_content") {
    Ok(gs) => use(gs),
    Err(e) if e.to_string().contains("Invalid") && e.to_string().contains("glob pattern") => {
        eprintln!("check the pattern named in: {e}");
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Passing an invalid glob string to the ignored-files/ignored-content configuration (e.g. `[extra]` or `[build]` ignore settings) such as `"**["` or an unclosed `{}`, parsed via `parse`/`resolve_globset`.

Common situations: Typos in config.toml glob patterns; copying shell-style globs unsupported by the globset syntax; quotes/escaping issues in TOML.

Related errors


AI-assisted analysis of getzola/zola@61d3082821 (2026-09-03). Data as JSON: /api/errors/03b7ce1a2a5a8bfd. Report an issue: GitHub.

Appendix: source

Thrown at components/utils/src/globs.rs:15

use globset::{Glob, GlobSet, GlobSetBuilder};

use errors::{Result, bail};

pub fn build_ignore_glob_set(ignore: &Vec<String>, name: &str) -> Result<GlobSet> {
    // Convert the file glob strings into a compiled glob set matcher. We want to do this once,
    // at program initialization, rather than for every page, for example. We arrange for the
    // globset matcher to always exist (even though it has to be inside an Option at the
    // moment because of the TOML serializer); if the glob set is empty the `is_match` function
    // of the globber always returns false.
    let mut glob_set_builder = GlobSetBuilder::new();
    for pat in ignore {
        let glob = match Glob::new(pat) {
            Ok(g) => g,
            Err(e) => bail!("Invalid {name} glob pattern: {pat}, error = {e}"),
        };
        glob_set_builder.add(glob);
    }
    Ok(glob_set_builder.build()?)
}

View on GitHub (pinned to 61d3082821)