{"record":{"id":"4833553d46c20a18","repo":"charmbracelet/crush","slug":"failed-to-delete-directory-recursively-w","errorCode":null,"errorMessage":"failed to delete directory recursively: %w","messagePattern":"failed to delete directory recursively: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/lsp/util/edit.go","lineNumber":200,"sourceCode":"\t\t\t\tif _, err := os.Stat(path); err == nil {\n\t\t\t\t\treturn nil // File exists and we're ignoring it\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif err := os.WriteFile(path, []byte(\"\"), 0o644); err != nil {\n\t\t\treturn fmt.Errorf(\"failed to create file: %w\", err)\n\t\t}\n\t}\n\n\tif change.DeleteFile != nil {\n\t\tpath, err := change.DeleteFile.URI.Path()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid URI: %w\", err)\n\t\t}\n\n\t\tif change.DeleteFile.Options != nil && change.DeleteFile.Options.Recursive {\n\t\t\tif err := os.RemoveAll(path); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete directory recursively: %w\", err)\n\t\t\t}\n\t\t} else {\n\t\t\tif err := os.Remove(path); err != nil {\n\t\t\t\treturn fmt.Errorf(\"failed to delete file: %w\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif change.RenameFile != nil {\n\t\tvar newPath, oldPath string\n\t\tvar err error\n\n\t\toldPath, err = change.RenameFile.OldURI.Path()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tnewPath, err = change.RenameFile.NewURI.Path()","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/lsp/util/edit.go#L182-L218","documentation":"For a DeleteFile change with Options.Recursive set, applyDocumentChange calls os.RemoveAll; failure is wrapped with this message. It means a recursive directory deletion could not complete (permission, file in use, non-empty constraints imposed by the OS).","triggerScenarios":"Recursive delete of a directory where any contained file/directory cannot be removed due to permissions, an open handle, or filesystem errors.","commonSituations":"Deleting directories containing read-only files; removing folders with files locked by another process or editor; sandbox restrictions blocking deletion.","solutions":["Verify write permission on the directory and all its contents.","Close editors/processes holding handles to files inside the tree.","Check for read-only mounts or immutable attributes.","Fall back to manual deletion and inspect the wrapped OS error for the offending path."],"exampleFix":"// before\n// read-only files inside tree\nutil.ApplyWorkspaceEdit(ctx, delEdit)\n// after\nfilepath.Walk(dir, func(p string, info os.FileInfo, err error) error {\n    return os.Chmod(p, 0o755)\n})\nutil.ApplyWorkspaceEdit(ctx, delEdit)","handlingStrategy":"try-catch","validationCode":"if err := filepath.Walk(dir, func(p string, info os.FileInfo, err error) error {\n    if err != nil { return err }\n    return os.Chmod(p, 0o755)\n}); err != nil {\n    return err\n}","typeGuard":null,"tryCatchPattern":"var rmErr *fs.PathError\nif errors.As(err, &rmErr) {\n    log.Printf(\"recursive delete blocked at %s: %v\", rmErr.Path, rmErr.Err)\n}","preventionTips":["Ensure write permission on every node of the tree.","Close processes holding files inside the directory.","Confirm the mount is not read-only before recursive deletes."],"tags":["lsp","file-io","delete"],"backgroundTag":"directory-delete-failed","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}