{"record":{"id":"f6a5369d824fc23a","repo":"nodejs/node","slug":"dictionary-path-already-set-n","errorCode":null,"errorMessage":"dictionary path already set\\n","messagePattern":"dictionary path already set\\\\n","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"deps/brotli/c/tools/brotli.c","lineNumber":494,"sourceCode":"            fprintf(stderr,\n                    \"lgwin parameter (%d) smaller than the minimum (%d)\\n\",\n                    params->lgwin, BROTLI_MIN_WINDOW_BITS);\n            return COMMAND_INVALID;\n          }\n        } else if (c == 'C') {\n          if (comment_set) {\n            fprintf(stderr, \"comment already set\\n\");\n            return COMMAND_INVALID;\n          }\n          params->comment_len = MAX_COMMENT_LEN;\n          if (!ParseBase64(argv[i], params->comment, &params->comment_len)) {\n            fprintf(stderr, \"invalid base64-encoded comment\\n\");\n            return COMMAND_INVALID;\n          }\n          comment_set = BROTLI_TRUE;\n        } else if (c == 'D') {\n          if (params->dictionary_path) {\n            fprintf(stderr, \"dictionary path already set\\n\");\n            return COMMAND_INVALID;\n          }\n          params->dictionary_path = argv[i];\n        } else if (c == 'S') {\n          if (suffix_set) {\n            fprintf(stderr, \"suffix already set\\n\");\n            return COMMAND_INVALID;\n          }\n          suffix_set = BROTLI_TRUE;\n          params->suffix = argv[i];\n        }\n      }\n    } else {  /* Double-dash. */\n      arg = &arg[2];\n      if (strcmp(\"best\", arg) == 0) {\n        if (quality_set) {\n          fprintf(stderr, \"quality already set\\n\");\n          return COMMAND_INVALID;","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/nodejs/node/blob/1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e/deps/brotli/c/tools/brotli.c#L476-L512","documentation":"`-D PATH` provides a custom dictionary file for compression/decompression (`params->dictionary_path`). It is latched by a non-null check; a second `-D` is rejected so the active dictionary is unambiguous.","triggerScenarios":"`brotli -D dict1 -D dict2 in`, or `-D` combined with `--dictionary=...`.","commonSituations":"Layered configs that both inject a dictionary path; switching dictionaries without removing the previous flag.","solutions":["Pass exactly one dictionary path.","Merge dictionaries offline into a single file if both are needed."],"exampleFix":"# before\nbrotli -D a.dict -D b.dict in\n# after\nbrotli -D a.dict in","handlingStrategy":"validation","validationCode":"# bash: at most one dictionary setter\nd=$(printf '%s\\n' \"$@\" | grep -cE '^(-D|--dictionary=.*)$')\nif [ \"$d\" -gt 1 ]; then echo \"multiple dictionary flags\" >&2; exit 2; fi\nbrotli \"$@\"","typeGuard":null,"tryCatchPattern":"# bash\nif ! brotli \"$@\"; then rc=$?; echo \"brotli exit $rc; dedupe dictionary flags\" >&2; exit \"$rc\"; fi","preventionTips":["Merge dictionaries offline into a single file if multiple are needed.","Pick one source for the dictionary path: CLI, env, or config — not several."],"tags":["cli","brotli","argument-parsing","duplicate-flag","dictionary"],"backgroundTag":null,"analyzedSha":"1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e","analyzedAt":"2026-08-13T00:53:24.642Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}