Compare commits

..
1 Commits
Author SHA1 Message Date
clawbot e16c46804d Say "skipped" in scan's warnings for skipped paths (closes #170) (#195)
check / check (push) Successful in 1m29s
2026-11-11 13:37:14 +01:00
2 changed files with 16 additions and 9 deletions

No files matched your search

+4 -5
View File
@@ -689,11 +689,10 @@ scan: skipped /srv/a/closed (permission denied)
scan: skipped /srv/a/pipe (a FIFO) scan: skipped /srv/a/pipe (a FIFO)
``` ```
The summary counts each path named in such a warning. When a file with several The summary counts each path named in such a warning. A line for a path left out
hard links cannot be read, each of its paths gets a warning. A line for a path on purpose starts with `scan: left out` instead, and is not counted. A search of
left out on purpose starts with `scan: left out` instead, and is not counted. A the log for `scan: skipped` therefore finds the paths the summary counts. When a
search of the log for `scan: skipped` therefore finds the paths the summary file with several hard links cannot be read, each of its paths gets a warning.
counts.
#### Stopping a scan #### Stopping a scan
+12 -4
View File
@@ -752,8 +752,9 @@ func TestWalkPassesOverRemovedPaths(t *testing.T) {
// TestScanWarnsAboutUnreadablePaths checks that a permission error is // TestScanWarnsAboutUnreadablePaths checks that a permission error is
// still warned about and counted as skipped, unlike a removed path. The // still warned about and counted as skipped, unlike a removed path. The
// walk reaches an unreadable directory, and a file in a directory that // walk reaches an unreadable directory. It also reaches a file and a
// can be read but not searched. Another such file is an operand. // subdirectory in a directory that can be read but not searched. Another
// such file is an operand.
// //
//nolint:paralleltest // captureStderr replaces the process-wide os.Stderr //nolint:paralleltest // captureStderr replaces the process-wide os.Stderr
func TestScanWarnsAboutUnreadablePaths(t *testing.T) { func TestScanWarnsAboutUnreadablePaths(t *testing.T) {
@@ -765,6 +766,7 @@ func TestScanWarnsAboutUnreadablePaths(t *testing.T) {
dir := t.TempDir() dir := t.TempDir()
tree := filepath.Join(dir, "tree") tree := filepath.Join(dir, "tree")
walked := writeFile(t, tree, "unsearchable/f", []byte("x")) walked := writeFile(t, tree, "unsearchable/f", []byte("x"))
subdir := filepath.Join(filepath.Dir(walked), "d")
operand := writeFile(t, dir, "unsearchable/f", []byte("y")) operand := writeFile(t, dir, "unsearchable/f", []byte("y"))
unreadable := filepath.Join(tree, "unreadable") unreadable := filepath.Join(tree, "unreadable")
@@ -773,6 +775,11 @@ func TestScanWarnsAboutUnreadablePaths(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
err = os.Mkdir(subdir, 0o750)
if err != nil {
t.Fatal(err)
}
modes := map[string]fs.FileMode{ modes := map[string]fs.FileMode{
unreadable: 0, unreadable: 0,
filepath.Dir(walked): 0o400, filepath.Dir(walked): 0o400,
@@ -793,14 +800,15 @@ func TestScanWarnsAboutUnreadablePaths(t *testing.T) {
} }
st := syncTree(t, openTestDB(t), tree, operand) st := syncTree(t, openTestDB(t), tree, operand)
if st != (scanStats{skipped: 3}) { if st != (scanStats{skipped: 4}) {
t.Errorf("stats = %+v, want 3 skipped and nothing else", st) t.Errorf("stats = %+v, want 4 skipped and nothing else", st)
} }
got := stderr() got := stderr()
for _, warning := range []string{ for _, warning := range []string{
"scan: skipped " + unreadable + " (permission denied)\n", "scan: skipped " + unreadable + " (permission denied)\n",
"scan: skipped " + walked + " (permission denied)\n", "scan: skipped " + walked + " (permission denied)\n",
"scan: skipped " + subdir + " (permission denied)\n",
"scan: skipped " + operand + " (permission denied)\n", "scan: skipped " + operand + " (permission denied)\n",
} { } {
if !strings.Contains(got, warning) { if !strings.Contains(got, warning) {