{"record":{"id":"f853abd37286f06d","repo":"elastic/elasticsearch","slug":"missing-pattern-for-invalid-pattern-rule","errorCode":null,"errorMessage":"Missing [pattern] for invalid pattern rule","messagePattern":"Missing \\[pattern\\] for invalid pattern rule","errorType":"validation","errorClass":"InvalidUserDataException","httpStatus":null,"severity":"error","filePath":"build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/precommit/ForbiddenPatternsTask.java","lineNumber":192,"sourceCode":"    }\n\n    @Input\n    public Map<String, String> getPatterns() {\n        return Collections.unmodifiableMap(patterns);\n    }\n\n    public void exclude(String... excludes) {\n        filesFilter.exclude(excludes);\n    }\n\n    public void rule(Map<String, String> props) {\n        String name = props.remove(\"name\");\n        if (name == null) {\n            throw new InvalidUserDataException(\"Missing [name] for invalid pattern rule\");\n        }\n        String pattern = props.remove(\"pattern\");\n        if (pattern == null) {\n            throw new InvalidUserDataException(\"Missing [pattern] for invalid pattern rule\");\n        }\n        if (props.isEmpty() == false) {\n            throw new InvalidUserDataException(\"Unknown arguments for ForbiddenPatterns rule mapping: \" + props.keySet().toString());\n        }\n        // TODO: fail if pattern contains a newline, it won't work (currently)\n        patterns.put(name, pattern);\n    }\n\n    @Internal\n    abstract ListProperty<FileTree> getSourceFolders();\n\n    @Internal\n    abstract Property<File> getRootDir();\n\n    @Input\n    @Optional\n    Provider<String> getRootDirPath() {\n        return getRootDir().map(t -> t.toPath().relativize(projectLayout.getProjectDirectory().getAsFile().toPath()).toString());","sourceCodeStart":174,"sourceCodeEnd":210,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/precommit/ForbiddenPatternsTask.java#L174-L210","documentation":"Thrown by ForbiddenPatternsTask.rule(Map) when the 'name' key is present but the 'pattern' key is missing. A rule needs a regex pattern to be useful; without one the task rejects the rule as invalid user data.","triggerScenarios":"Calling rule([name: 'foo']) — map has 'name' but no 'pattern'.","commonSituations":"A rule block that names the rule but forgets the pattern line; refactor that moved the pattern into a variable that resolved to null.","solutions":["Add the 'pattern' entry, e.g. rule(name: 'no-tabs', pattern: '\\t').","Verify the pattern expression is non-null before passing it.","Re-run to confirm."],"exampleFix":"// before\nrule name: 'no-tabs'\n\n// after\nrule name: 'no-tabs', pattern: '\\\\t'","handlingStrategy":"validation","validationCode":"if (!props.containsKey(\"pattern\")) throw new InvalidUserDataException(\"Missing [pattern] for invalid pattern rule\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always supply pattern as a non-null literal or verified variable.","Use named-argument DSL style so the pair is visually checked.","Unit-test the regex separately before wiring it in."],"tags":["gradle","forbidden-patterns","precommit","task-config","validation"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}