{"record":{"id":"dc8b973f850df1db","repo":"ipfs/kubo","slug":"file-argument-was-nil-dc8b97","errorCode":null,"errorMessage":"file argument was nil","messagePattern":"file argument was nil","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/commands/cmdenv/file.go","lineNumber":20,"sourceCode":"\nimport (\n\t\"fmt\"\n\n\t\"github.com/ipfs/boxo/files\"\n)\n\n// GetFileArg returns the next file from the directory or an error\nfunc GetFileArg(it files.DirIterator) (files.File, error) {\n\tif !it.Next() {\n\t\terr := it.Err()\n\t\tif err == nil {\n\t\t\terr = fmt.Errorf(\"expected a file argument\")\n\t\t}\n\t\treturn nil, err\n\t}\n\tfile := files.FileFromEntry(it)\n\tif file == nil {\n\t\treturn nil, fmt.Errorf(\"file argument was nil\")\n\t}\n\treturn file, nil\n}\n","sourceCodeStart":2,"sourceCodeEnd":24,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/core/commands/cmdenv/file.go#L2-L24","documentation":"After obtaining an entry from a DirIterator, GetFileArg converts it with files.FileFromEntry; if the entry is not a regular file (e.g. it is a subdirectory or a symlink to a dir), FileFromEntry returns nil and this error is returned. It means the next entry exists but is not usable as a file.","triggerScenarios":"Iterating a directory that contains subdirectories when the consumer expects only files (e.g. recursive add walking entries); a nil File result from files.FileFromEntry on directory entries.","commonSituations":"`ipfs add` on a directory needing recursive handling where the caller didn't descend into subdirs; constructing nested files.Directory inputs in tests; RPC multipart bodies containing directory entries.","solutions":["Only pass file entries (or recurse into subdirectories yourself before calling GetFileArg)","Use the recursive option in add-style commands so directories are handled by the command","Filter the iterator: skip entries where files.FileFromEntry(it) == nil instead of erroring"],"exampleFix":"// before\nfile, err := cmdenv.GetFileArg(it)\n// after\nif it.Next() {\n    if files.FileFromEntry(it) == nil {\n        continue // skip directory/special entries\n    }\n    file, err := cmdenv.GetFileArg(it)","handlingStrategy":"validation","validationCode":"if it.Next() && files.FileFromEntry(it) == nil {\n    // entry is a directory/special node; recurse or skip before calling GetFileArg\n}","typeGuard":"func isFileEntry(it files.DirIterator) bool {\n    return files.FileFromEntry(it) != nil\n}","tryCatchPattern":"file, err := cmdenv.GetFileArg(it)\nif err != nil {\n    if strings.Contains(err.Error(), \"file argument was nil\") {\n        // skip or recurse into directory entry\n    }\n    return err\n}","preventionTips":["Flatten or recurse into nested directories before consuming entries","Use recursive add modes for directory trees","Filter directory entries out of test inputs"],"tags":["cli","files","directory"],"backgroundTag":"nil-file-entry","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}