{"record":{"id":"2ef64d963a54e807","repo":"kovidgoyal/kitty","slug":"not-an-appropriate-file-type","errorCode":null,"errorMessage":"Not an appropriate file type","messagePattern":"Not an appropriate file type","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"kitty/file_transmission.py","lineNumber":89,"sourceCode":"\ndef iter_file_metadata(file_specs: Iterable[tuple[str, str]]) -> Iterator[Union['FileTransmissionCommand', 'TransmissionError']]:\n    file_map: DefaultDict[tuple[int, int], list[FileTransmissionCommand]] = defaultdict(list)\n    counter = count()\n\n    def skey(sr: os.stat_result) -> tuple[int, int]:\n        return sr.st_dev, sr.st_ino\n\n    def make_ftc(path: str, spec_id: str, sr: os.stat_result | None = None, parent: str = '') -> FileTransmissionCommand:\n        if sr is None:\n            sr = os.stat(path, follow_symlinks=False)\n        if stat.S_ISLNK(sr.st_mode):\n            ftype = FileType.symlink\n        elif stat.S_ISDIR(sr.st_mode):\n            ftype = FileType.directory\n        elif stat.S_ISREG(sr.st_mode):\n            ftype = FileType.regular\n        else:\n            raise ValueError('Not an appropriate file type')\n        ans = FileTransmissionCommand(\n            action=Action.file,\n            file_id=spec_id,\n            mtime=sr.st_mtime_ns,\n            permissions=stat.S_IMODE(sr.st_mode),\n            name=path,\n            status=str(next(counter)),\n            size=sr.st_size,\n            ftype=ftype,\n            parent=parent,\n        )\n        file_map[skey(sr)].append(ans)\n        return ans\n\n    def add_dir(ftc: FileTransmissionCommand) -> None:\n        try:\n            lr = os.listdir(ftc.name)\n        except OSError:","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/file_transmission.py#L71-L107","documentation":"make_ftc inspects an lstat result and classifies the path as symlink, directory, or regular file. Anything else (socket, FIFO, device file, etc.) cannot be transmitted and raises ValueError('Not an appropriate file type').","triggerScenarios":"Calling kitty's file-transmission metadata builder on a path whose st_mode is not S_ISLNK/S_ISDIR/S_ISREG — e.g. /dev/null, a unix socket, or a named pipe discovered during add_dir/iter_file_metadata traversal.","commonSituations":"Globbing a directory tree that contains sockets or FIFOs (e.g. forwarding into a runtime dir); explicitly passing /dev/... paths; picking up transient files created by other processes during traversal.","solutions":["Filter non-regular files before transmission (stat.S_ISREG / ISLNK / ISDIR check).","Exclude device/socket directories like /dev, /proc, /run from the transfer set.","Retry after removing the transient socket/fifo if it was short-lived."],"exampleFix":"# before\nfor p in paths:\n    make_ftc(p)\n# after\nfor p in paths:\n    m = os.lstat(p).st_mode\n    if stat.S_ISREG(m) or stat.S_ISLNK(m) or stat.S_ISDIR(m):\n        make_ftc(p)","handlingStrategy":"type-guard","validationCode":"import stat, os\nm = os.lstat(path).st_mode\nassert stat.S_ISREG(m) or stat.S_ISDIR(m) or stat.S_ISLNK(m), path","typeGuard":"def is_transmittable(path: str) -> bool:\n    import stat, os\n    m = os.lstat(path).st_mode\n    return stat.S_ISREG(m) or stat.S_ISDIR(m) or stat.S_ISLNK(m)","tryCatchPattern":"try:\n    make_ftc(path)\nexcept ValueError:\n    logging.warning('skipping unsupported file type: %s', path)","preventionTips":["Filter transfers with is_transmittable before enqueueing.","Exclude /dev, /proc, sockets and FIFOs from picked paths."],"tags":["kitty","file-transfer","unsupported-file-type"],"backgroundTag":"unsupported-file-type","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}