{"record":{"id":"ef607babbcc82f1b","repo":"slimtoolkit/slim","slug":"malformed-change-data-hash-matcher-s","errorCode":null,"errorMessage":"malformed change data hash matcher: %s","messagePattern":"malformed change data hash matcher: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/app/master/command/xray/cli.go","lineNumber":525,"sourceCode":"\t\t\t}\n\t\t}\n\n\t\tmatchers = append(matchers, &m)\n\t}\n\n\treturn matchers, nil\n}\n\nfunc parseChangeDataHashMatchers(values []string) ([]*dockerimage.ChangeDataHashMatcher, error) {\n\tvar matchers []*dockerimage.ChangeDataHashMatcher\n\n\tfor _, raw := range values {\n\t\tvar m dockerimage.ChangeDataHashMatcher\n\n\t\tif strings.HasPrefix(raw, \"dump:\") {\n\t\t\tparts := strings.SplitN(raw, \":\", 3)\n\t\t\tif len(parts) != 3 {\n\t\t\t\treturn nil, fmt.Errorf(\"malformed change data hash matcher: %s\", raw)\n\t\t\t}\n\n\t\t\tm.Dump = true\n\n\t\t\toutTarget := strings.TrimSpace(parts[1])\n\t\t\tif len(outTarget) == 0 || outTarget == dockerimage.CDMDumpToConsole {\n\t\t\t\tm.DumpConsole = true\n\t\t\t} else {\n\t\t\t\tm.DumpDir = outTarget\n\t\t\t}\n\n\t\t\tm.Hash = strings.ToLower(strings.TrimSpace(parts[2]))\n\n\t\t\t//\"dump:output:hash\"\n\t\t\t//\"::hash\"\n\t\t\t//\"hash\"\n\t\t} else {\n\t\t\tif !strings.HasPrefix(raw, \":\") {","sourceCodeStart":507,"sourceCodeEnd":543,"githubUrl":"https://github.com/slimtoolkit/slim/blob/81940d17fa112cc678e32209214bcb2355cb3004/pkg/app/master/command/xray/cli.go#L507-L543","documentation":"parseChangeDataHashMatchers in the xray command (pkg/app/master/command/xray/cli.go:525) parses --change-data-hash values. A value starting with 'dump:' must have the 3-part form 'dump:output:hash' (SplitN on ':' into exactly 3 parts); shorter values like 'dump:console' or 'dump:/tmp/hashes' return \"malformed change data hash matcher: %s\".","triggerScenarios":"Passing a --change-data-hash value beginning with 'dump:' with only 2 colon-separated fields — e.g. 'dump:console' or 'dump:/tmp/dump' — omitting the hash field.","commonSituations":"Stopping after the dump target and forgetting the hash; pasting data-matcher dump syntax (4 fields) or path-matcher dump syntax without the final field; documentation examples truncated.","solutions":["Use the 3-field form: dump:<output-dir-or-empty>:<hash>, e.g. dump:/tmp/out:sha256:... becomes problematic — prefer dump::'d41d8...' with an empty output field if the hash itself contains no colons.","If your hash contains colons (e.g. 'sha256:abc...'), note SplitN's 3-part limit keeps the remainder in the last field, so 'dump:/tmp/out:sha256:abc' still works — the missing-field case is what fails.","Without dumping, pass just the hash string, e.g. --change-data-hash 'd41d8cd98f00b204e9800998ecf8427e'.","Count separators: a 'dump:'-prefixed hash matcher needs at least 2 colons."],"exampleFix":"// before\n--change-data-hash 'dump:/tmp/out'\n// after\n--change-data-hash 'dump:/tmp/out:d41d8cd98f00b204e9800998ecf8427e'","handlingStrategy":"validation","validationCode":"// validate a dump-form change-data-hash matcher before invoking the CLI\nfunc validDumpHashMatcher(raw string) bool {\n    if !strings.HasPrefix(raw, \"dump:\") {\n        return true\n    }\n    return len(strings.SplitN(raw, \":\", 3)) == 3\n}","typeGuard":null,"tryCatchPattern":"matchers, err := parseChangeDataHashMatchers(values)\nif err != nil {\n    if strings.HasPrefix(err.Error(), \"malformed change data hash matcher\") {\n        fmt.Fprintf(os.Stderr, \"expected dump:out:hash (2+ colons): %v\\n\", err)\n        os.Exit(2)\n    }\n    return err\n}","preventionTips":["Hash matcher dump form = 3 fields: dump:out:hash — always include the hash.","Algorithms prefixes like 'sha256:abc...' are fine; the last field absorbs extra colons (SplitN limit 3).","Without dumping, pass just the hex hash string.","Store hashes in variables to avoid hand-built strings with missing fields."],"tags":["cli","xray","matcher-syntax","slimtoolkit"],"backgroundTag":"malformed-matcher-syntax","analyzedSha":"81940d17fa112cc678e32209214bcb2355cb3004","analyzedAt":"2026-08-31T23:06:12.682Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}