Escape tab, newline, CR and backslash in report paths (closes #7)
check / check (push) Successful in 1m29s
check / check (push) Successful in 1m29s
A path holding a tab or newline split a row of the report or trees output. The path columns of both now write a backslash, tab, newline and carriage return as \\, \t, \n and \r; every other byte is written unchanged. Grouping and sorting still use the stored path. Warnings on stderr are escaped the same way in warnf, so each stays one line. In trees, the root directory's node now has the path "/" instead of an empty string, and its children's paths start with a single slash. README states the rule under "Report output format". Model: opus-5-5
This commit was merged in pull request #70.
This commit is contained in:
@@ -87,7 +87,7 @@ func runReport(ctx context.Context) error {
|
||||
for _, g := range dupes {
|
||||
for _, p := range g.paths[1:] {
|
||||
_, err = fmt.Fprintf(out, "%s\t%s\t%d\n",
|
||||
g.paths[0], p, g.size)
|
||||
escapePath(g.paths[0]), escapePath(p), g.size)
|
||||
if err != nil {
|
||||
return fmt.Errorf("write stdout: %w", err)
|
||||
}
|
||||
@@ -156,6 +156,21 @@ func collectDupeGroups(recs []scanRec) []dupeGroup {
|
||||
return dupes
|
||||
}
|
||||
|
||||
// escapePath returns a path as it is written in a report column (README
|
||||
// "Report output format"): a backslash, tab, newline or carriage return
|
||||
// becomes \\, \t, \n or \r, and every other byte is kept as it is.
|
||||
// Grouping and sorting use the raw path, never this form.
|
||||
func escapePath(p string) string {
|
||||
// Most paths need no escaping; skip building a replacer for them.
|
||||
if !strings.ContainsAny(p, "\\\t\n\r") {
|
||||
return p
|
||||
}
|
||||
|
||||
return strings.NewReplacer(
|
||||
`\`, `\\`, "\t", `\t`, "\n", `\n`, "\r", `\r`,
|
||||
).Replace(p)
|
||||
}
|
||||
|
||||
// humanBytes formats a byte count in human units (binary prefixes).
|
||||
func humanBytes(n int64) string {
|
||||
const unit = 1024
|
||||
|
||||
Reference in New Issue
Block a user