{"record":{"id":"e2ebff606676fc6b","repo":"alibaba/open-code-review","slug":"file-path-q-is-a-directory","errorCode":null,"errorMessage":"file path %q is a directory","messagePattern":"file path %q is a directory","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/diff/workspace_file.go","lineNumber":41,"sourceCode":"\tfullPath := filepath.Join(repoRoot, relPath)\n\tif !pathutil.WithinBase(repoRoot, fullPath) {\n\t\treturn nil, fmt.Errorf(\"file path %q is outside repository\", relPath)\n\t}\n\n\tparent, err := filepath.EvalSymlinks(filepath.Dir(fullPath))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve parent path for %q: %w\", relPath, err)\n\t}\n\tif !pathutil.WithinBase(repoRoot, parent) {\n\t\treturn nil, fmt.Errorf(\"file path %q is outside repository\", relPath)\n\t}\n\n\tinfo, err := os.Lstat(fullPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"stat file %q: %w\", relPath, err)\n\t}\n\tif info.IsDir() {\n\t\treturn nil, fmt.Errorf(\"file path %q is a directory\", relPath)\n\t}\n\tif info.Mode()&os.ModeSymlink != 0 {\n\t\ttarget, err := os.Readlink(fullPath)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"read symlink %q: %w\", relPath, err)\n\t\t}\n\t\treturn []byte(target), nil\n\t}\n\n\tresolvedPath, err := filepath.EvalSymlinks(fullPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"resolve file %q: %w\", relPath, err)\n\t}\n\tif !pathutil.WithinBase(repoRoot, resolvedPath) {\n\t\treturn nil, fmt.Errorf(\"file path %q is outside repository\", relPath)\n\t}\n\tcontent, err := os.ReadFile(resolvedPath)\n\tif err != nil {","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/alibaba/open-code-review/blob/5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f/internal/diff/workspace_file.go#L23-L59","documentation":"Type guard in readWorkspaceFileForDiff: after Lstat, the entry is a directory rather than a regular file. This fires when the workspace change list (e.g. untracked entries from git) contains a directory; directory contents are not reviewable as a single file diff, so the read is refused.","triggerScenarios":"Thrown at internal/diff/workspace_file.go:41 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Review the files inside the directory individually instead of the directory path","Exclude directories from the workspace change list before requesting diffs","If git reported the directory (untracked dir), expand it into its constituent files"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f","analyzedAt":"2026-09-02T02:08:09.116Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}