def read_attribute()

in antlir/btrfs_diff/parse_send_stream.py [0:0]


def read_attribute(infile):
    attr_header = AttributeHeader.from_file(infile)
    attr_data = infile.read(attr_header.length)
    if len(attr_data) != attr_header.length:
        raise RuntimeError(f"{attr_header} got {len(attr_data)} bytes")

    if attr_header.kind == AttributeKind.UUID:
        return attr_header.kind, conv_uuid(attr_data)
    elif attr_header.kind == AttributeKind.CTRANSID:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.INO:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.SIZE:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.MODE:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.UID:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.GID:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.RDEV:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.CTIME:
        return attr_header.kind, conv_time(attr_data)
    elif attr_header.kind == AttributeKind.MTIME:
        return attr_header.kind, conv_time(attr_data)
    elif attr_header.kind == AttributeKind.ATIME:
        return attr_header.kind, conv_time(attr_data)
    elif attr_header.kind == AttributeKind.XATTR_NAME:
        return attr_header.kind, attr_data
    elif attr_header.kind == AttributeKind.XATTR_DATA:
        return attr_header.kind, attr_data
    elif attr_header.kind == AttributeKind.PATH:
        return attr_header.kind, os.path.normpath(attr_data)
    elif attr_header.kind == AttributeKind.PATH_TO:
        return attr_header.kind, os.path.normpath(attr_data)
    elif attr_header.kind == AttributeKind.PATH_LINK:
        # NB This is NOT normalized since we don't want to normalize symlinks
        return attr_header.kind, attr_data
    elif attr_header.kind == AttributeKind.FILE_OFFSET:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.DATA:
        return attr_header.kind, attr_data
    elif attr_header.kind == AttributeKind.CLONE_UUID:
        return attr_header.kind, conv_uuid(attr_data)
    elif attr_header.kind == AttributeKind.CLONE_CTRANSID:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.CLONE_PATH:
        return attr_header.kind, os.path.normpath(attr_data)
    elif attr_header.kind == AttributeKind.CLONE_OFFSET:
        return attr_header.kind, conv_uint64(attr_data)
    elif attr_header.kind == AttributeKind.CLONE_LEN:
        return attr_header.kind, conv_uint64(attr_data)

    raise RuntimeError(f"Fix me: unhandled {attr_header}")  # pragma: no cover