twpayne/chezmoi · error
%s:%d: %w
Error message
%s:%d: %w
What it means
When reading an ignore-file style pattern list (e.g. .chezmoiignore), each line must be a valid relative path. NewUntrustedRelPath rejected the line, and the error is wrapped with the source file and line number so the offending pattern can be located.
Source
Thrown at internal/chezmoi/sourcestate.go:1540
dir, err := sourceRelPath.Dir().TargetRelPath("")
if err != nil {
return err
}
lineNumber := 0
for line := range bytes.Lines(data) {
lineNumber++
line = commentRx.ReplaceAll(line, nil)
line = bytes.TrimSpace(line)
if len(line) == 0 {
continue
}
include := PatternSetInclude
line, ok := bytes.CutPrefix(line, []byte{'!'})
if ok {
include = PatternSetExclude
}
if _, err := NewUntrustedRelPath(string(line)); err != nil {
return fmt.Errorf("%s:%d: %w", sourceAbsPath, lineNumber, err)
}
pattern := dir.JoinString(string(line)).String()
if err := patternSet.Add(pattern, include); err != nil {
return fmt.Errorf("%s:%d: %w", sourceAbsPath, lineNumber, err)
}
}
return nil
}
// addTemplateData adds all template data in sourceAbsPath to s.
func (s *SourceState) addTemplateData(sourceAbsPath AbsPath) error {
format, err := FormatFromAbsPath(sourceAbsPath)
if err != nil {
return err
}
data, err := s.system.ReadFile(sourceAbsPath)
if err != nil {
return fmt.Errorf("%s: %w", sourceAbsPath, err)View on GitHub (pinned to f901167e46)
Solutions
- Fix the offending line at the reported line number to be a plain relative path or glob
- Remove absolute paths from the ignore file and use target-relative patterns
- Trim stray whitespace/empty entries from pattern lines
Example fix
# before (.chezmoiignore line 3) /tmp/cache # after .cache/tmp
Defensive patterns
Strategy: validation
Validate before calling
for i, line := range strings.Split(ignoreFile, "\n") {
if _, err := NewUntrustedRelPath(strings.TrimPrefix(line, "!")); err != nil {
fmt.Printf("invalid pattern at line %d: %v\n", i+1, err)
}
} Prevention
- Use only relative paths/globs in .chezmoiignore
- Trim whitespace and remove empty/absolute lines before committing
When it happens
Trigger: A line in .chezmoiignore (or a pattern set file) is not a valid untrusted relative path — e.g. absolute path, empty line content after '!' prefix handling, or illegal path characters — at sourceAbsPath:lineNumber.
Common situations: Accidentally adding an absolute pattern like "/tmp/foo", patterns with invalid characters, or OS-illegal names (e.g. "con:" on Windows) into .chezmoiignore.
Related errors
- expected a string, got a %T
- %s: invalid pattern
- %s: %s: empty relative path
- %s: %s: relative path outside target directory
AI-assisted analysis of twpayne/chezmoi@f901167e46 (2026-09-01).
Data as JSON: /api/errors/482fdc2e6ad0f803.
Report an issue: GitHub.