{"record":{"id":"b5d05a1092033bbe","repo":"jdx/mise","slug":"glob-pattern-is-not-valid-utf-8","errorCode":null,"errorMessage":"glob pattern is not valid UTF-8: {}","messagePattern":"glob pattern is not valid UTF-8: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/task_source_checker.rs","lineNumber":527,"sourceCode":"    if !globbing && let Some(file_name) = base.file_name().map(|name| name.to_os_string()) {\n        base.pop();\n        glob_pattern.push(file_name);\n        pattern_depth = 1;\n    }\n\n    while !base.as_os_str().is_empty() && !base.exists() {\n        let Some(file_name) = base.file_name().map(|name| name.to_os_string()) else {\n            break;\n        };\n        base.pop();\n        let mut prefixed_pattern = PathBuf::from(file_name);\n        prefixed_pattern.push(glob_pattern);\n        glob_pattern = prefixed_pattern;\n        pattern_depth += 1;\n    }\n\n    let Some(mut glob_pattern) = pattern_from_path(&glob_pattern) else {\n        bail!(\"glob pattern is not valid UTF-8: {}\", pattern.display());\n    };\n    if glob_pattern.starts_with('!') {\n        glob_pattern.insert(0, '\\\\');\n    }\n\n    let mut builder = GlobWalkerBuilder::new(&base, glob_pattern)\n        .follow_links(true)\n        .sort_by(|a, b| a.file_name().cmp(b.file_name()))\n        .case_insensitive(case_insensitive);\n    if !recursive {\n        builder = builder.max_depth(pattern_depth);\n    }\n    Ok(builder.build()?)\n}\n\n/// Return a successful walk entry, pruning expected errors from following\n/// symlinks that loop or point to a missing target.\npub(crate) fn prune_symlink_walk_error(","sourceCodeStart":509,"sourceCodeEnd":545,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/task/task_source_checker.rs#L509-L545","documentation":"glob_walk builds a glob::Pattern from the task pattern path; if the pattern (after prefixing) is not valid UTF-8, pattern_from_path returns None and glob_walk bails, reporting the original Path display. The underlying glob matcher requires UTF-8 patterns, so non-UTF-8 paths cannot be walked.","triggerScenarios":"Resolving task sources/outputs where the pattern path (base dir or glob component) contains invalid UTF-8 bytes — typically from filenames created outside UTF-8 locales or corrupted archive extraction.","commonSituations":"Files unpacked with mangled encoding; patterns derived from non-UTF-8 environment variables or filesystem names; project checkouts on filesystems with legacy byte encodings.","solutions":["Rename the offending file/directory to a valid UTF-8 name","Regenerate or re-extract the files with a UTF-8-safe tool (e.g. `unzip -O UTF-8` or convmv)","Rewrite the task pattern to point only at UTF-8 paths"],"exampleFix":"# before\n$ ls src\n'\\xff\\xfe'notes.md\n# after\nconvmv -f latin1 -t utf8 -r --notest src\n# then mise task sources = ['src/*.md'] works","handlingStrategy":"validation","validationCode":"// node: reject non-UTF-8 pattern paths before running tasks\nconst isUtf8 = (s) => Buffer.from(s, 'utf8').toString('utf8') === s;\nif (!isUtf8(patternPath)) throw new Error('pattern must be valid UTF-8: ' + patternPath);","typeGuard":"// node\nconst isValidUtf8Path = (p) => { try { Buffer.from(p, 'utf8'); return Buffer.compare(Buffer.from(p, 'utf8'), Buffer.from(Buffer.from(p, 'utf8').toString('utf8'))) === 0; } catch { return false; } };","tryCatchPattern":null,"preventionTips":["Keep file names ASCII/UTF-8 in projects mise manages","Re-extract archives with UTF-8-aware tools (unzip -O UTF-8, convmv)","Avoid deriving task patterns from raw byte env vars or legacy-encoded filenames"],"tags":["glob","encoding","utf-8","filesystem"],"backgroundTag":"invalid-argument-format","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}