apple/pkl · error · InvalidGlobPatternException

invalidGlobNestedSubpattern

invalidGlobNestedSubpattern

Error message

invalidGlobNestedSubpattern

What it means

Glob patterns support a single level of `{a,b}` alternation groups. toRegexString throws InvalidGlobPatternException with code invalidGlobNestedSubpattern when a `{` appears while already inside a group, since nested subpatterns like `{a,{b,c}}` are unsupported.

Source

Thrown at pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java:161

    var pattern = patterns.get(globPattern);
    if (pattern == null) {
      pattern = Pattern.compile(toRegexString(globPattern));
      patterns.put(globPattern, pattern);
    }
    return pattern;
  }

  /** Converts a glob pattern to an equivalent regular expression pattern */
  public static String toRegexString(String globPattern) throws InvalidGlobPatternException {
    var sb = new StringBuilder("^");
    var inGroup = false;

    for (var i = 0; i < globPattern.length(); i++) {
      var current = globPattern.charAt(i);
      switch (current) {
        case '{' -> {
          if (inGroup) {
            throw new InvalidGlobPatternException(
                ErrorMessages.create("invalidGlobNestedSubpattern"));
          }
          inGroup = true;
          sb.append("(?:(?:");
        }
        case '}' -> {
          if (inGroup) {
            inGroup = false;
            sb.append("))");
          } else {
            sb.append('}');
          }
        }
        case ',' -> {
          if (inGroup) {
            sb.append(")|(?:");
          } else {
            sb.append(',');

View on GitHub (pinned to f3efcbfc9b)

Solutions

  1. Flatten the nested groups into a single level: `{a,b,c}`.
  2. Expand the nested combinations manually into multiple alternative globs.
  3. If generating programmatically, compute the cross-product of the inner groups before building the pattern.

Example fix

// before
glob = "src/{a,{b,c}}.pkl"
// after
glob = "src/{a,b,c}.pkl"
Defensive patterns

Strategy: validation

Validate before calling

boolean noNestedBraces(String glob) {
  int depth = 0;
  for (char c : glob.toCharArray()) {
    if (c == '{') { if (++depth > 1) return false; }
    else if (c == '}') depth--;
  }
  return depth == 0;
}

Try / catch

try { return GlobResolver.toRegexPattern(glob); } catch (InvalidGlobPatternException e) { throw new IllegalArgumentException("Nested glob groups unsupported: " + glob, e); }

Prevention

When it happens

Trigger: Passing a glob containing nested braces, e.g. `src/{a,{b,c}}.pkl` or `{{x,y},z}`, to GlobResolver.toRegexString/toRegexPattern.

Common situations: Patterns copied from tools that support brace nesting (bash supports it); generating patterns programmatically by combining partial globs that each contain braces.

Related errors


AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08). Data as JSON: /api/errors/bed748cface09421. Report an issue: GitHub.