{"record":{"id":"bed748cface09421","repo":"apple/pkl","slug":"invalidglobnestedsubpattern","errorCode":"invalidGlobNestedSubpattern","errorMessage":"invalidGlobNestedSubpattern","messagePattern":"invalidGlobNestedSubpattern","errorType":"error_code","errorClass":"InvalidGlobPatternException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java","lineNumber":161,"sourceCode":"    var pattern = patterns.get(globPattern);\n    if (pattern == null) {\n      pattern = Pattern.compile(toRegexString(globPattern));\n      patterns.put(globPattern, pattern);\n    }\n    return pattern;\n  }\n\n  /** Converts a glob pattern to an equivalent regular expression pattern */\n  public static String toRegexString(String globPattern) throws InvalidGlobPatternException {\n    var sb = new StringBuilder(\"^\");\n    var inGroup = false;\n\n    for (var i = 0; i < globPattern.length(); i++) {\n      var current = globPattern.charAt(i);\n      switch (current) {\n        case '{' -> {\n          if (inGroup) {\n            throw new InvalidGlobPatternException(\n                ErrorMessages.create(\"invalidGlobNestedSubpattern\"));\n          }\n          inGroup = true;\n          sb.append(\"(?:(?:\");\n        }\n        case '}' -> {\n          if (inGroup) {\n            inGroup = false;\n            sb.append(\"))\");\n          } else {\n            sb.append('}');\n          }\n        }\n        case ',' -> {\n          if (inGroup) {\n            sb.append(\")|(?:\");\n          } else {\n            sb.append(',');","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java#L143-L179","documentation":"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.","triggerScenarios":"Passing a glob containing nested braces, e.g. `src/{a,{b,c}}.pkl` or `{{x,y},z}`, to GlobResolver.toRegexString/toRegexPattern.","commonSituations":"Patterns copied from tools that support brace nesting (bash supports it); generating patterns programmatically by combining partial globs that each contain braces.","solutions":["Flatten the nested groups into a single level: `{a,b,c}`.","Expand the nested combinations manually into multiple alternative globs.","If generating programmatically, compute the cross-product of the inner groups before building the pattern."],"exampleFix":"// before\nglob = \"src/{a,{b,c}}.pkl\"\n// after\nglob = \"src/{a,b,c}.pkl\"","handlingStrategy":"validation","validationCode":"boolean noNestedBraces(String glob) {\n  int depth = 0;\n  for (char c : glob.toCharArray()) {\n    if (c == '{') { if (++depth > 1) return false; }\n    else if (c == '}') depth--;\n  }\n  return depth == 0;\n}\n","typeGuard":null,"tryCatchPattern":"try { return GlobResolver.toRegexPattern(glob); } catch (InvalidGlobPatternException e) { throw new IllegalArgumentException(\"Nested glob groups unsupported: \" + glob, e); }\n","preventionTips":["Flatten nested brace groups before building patterns.","Expand cross-products programmatically when generating globs.","Document single-level brace support."],"tags":["pkl","glob","pattern","unsupported-feature"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}