{"record":{"id":"c503d284cf89d02d","repo":"ipfs/kubo","slug":"invalid-format-string-q","errorCode":null,"errorMessage":"invalid format string: %q","messagePattern":"invalid format string: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/commands/cid.go","lineNumber":75,"sourceCode":"\tArguments: []cmds.Argument{\n\t\tcmds.StringArg(\"cid\", true, true, \"CIDs to format.\").EnableStdin(),\n\t},\n\tOptions: []cmds.Option{\n\t\tcmds.StringOption(cidFormatOptionName, \"Printf style format string.\").WithDefault(\"%s\"),\n\t\tcmds.StringOption(cidToVersionOptionName, \"CID version to convert to.\"),\n\t\tcmds.StringOption(cidCodecOptionName, \"CID multicodec to convert to.\"),\n\t\tcmds.StringOption(cidMultibaseOptionName, \"Multibase to display CID in.\"),\n\t},\n\tRun: func(req *cmds.Request, resp cmds.ResponseEmitter, env cmds.Environment) error {\n\t\tfmtStr, _ := req.Options[cidFormatOptionName].(string)\n\t\tverStr, _ := req.Options[cidToVersionOptionName].(string)\n\t\tcodecStr, _ := req.Options[cidCodecOptionName].(string)\n\t\tbaseStr, _ := req.Options[cidMultibaseOptionName].(string)\n\n\t\topts := cidFormatOpts{}\n\n\t\tif strings.IndexByte(fmtStr, '%') == -1 {\n\t\t\treturn fmt.Errorf(\"invalid format string: %q\", fmtStr)\n\t\t}\n\t\topts.fmtStr = fmtStr\n\n\t\tif codecStr != \"\" {\n\t\t\tvar codec mc.Code\n\t\t\terr := codec.Set(codecStr)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\topts.newCodec = uint64(codec)\n\t\t} // otherwise, leave it as 0 (not a valid IPLD codec)\n\n\t\tswitch verStr {\n\t\tcase \"\":\n\t\t\tif baseStr != \"\" {\n\t\t\t\topts.verConv = toCidV1\n\t\t\t}\n\t\tcase \"0\":","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/core/commands/cid.go#L57-L93","documentation":"`ipfs cid format` rejects a format string that contains no '%' directive. The command validates that the user-supplied --format actually interpolates CID components before building cidFormatOpts; a string with no % placeholder would render constant output, so it is treated as invalid.","triggerScenarios":"Running `ipfs cid format --format=<string>` (or `cidFmt` option programmatically) where fmtStr contains no '%' byte, e.g. `--format=cid` instead of `--format=%s`.","commonSituations":"Users passing a plain label or forgetting printf-style placeholders; scripts that build the format string dynamically and drop the %; confusion with non-printf format syntaxes.","solutions":["Add at least one printf-style directive to --format, e.g. --format='%s' or --format=%v-%c","Check the formatted string comes from the right variable and wasn't shell-expanded away (quote % in shells)"],"exampleFix":"// before\nipfs cid format --format=cid <cid>\n// after\nipfs cid format --format=%s <cid>","handlingStrategy":"validation","validationCode":"if !strings.Contains(f, \"%\") {\n    return fmt.Errorf(\"format string must contain a %% directive: %q\", f)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include a printf directive like %s in --format","Quote the format string in shells so % is not consumed","Test new format strings on a known CID before scripting them"],"tags":["cli","cid","format-string","validation"],"backgroundTag":"invalid-format-string","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}