# ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ========= Copyright 2026 @ Strukto.AI All Rights Reserved. ========= from collections.abc import AsyncIterator from mirage.accessor.databricks_volume import DatabricksVolumeAccessor from mirage.cache.index import IndexCacheStore from mirage.cache.read_through import cached_prefix_bytes from mirage.commands.builtin.generic.head import head as generic_head from mirage.commands.builtin.generic.head import head_multi from mirage.commands.builtin.utils.stream import _resolve_source from mirage.commands.registry import command from mirage.commands.spec import SPECS from mirage.core.databricks_volume.glob import resolve_glob from mirage.core.databricks_volume.stream import range_read, read_stream from mirage.io.stream import yield_bytes from mirage.io.types import ByteSource, IOResult from mirage.types import PathSpec @command("head", resource="databricks_volume", spec=SPECS["head"]) async def head( accessor: DatabricksVolumeAccessor, paths: list[PathSpec], *texts: str, stdin: AsyncIterator[bytes] | bytes | None = None, n: str | None = None, c: str | None = None, q: bool = False, v: bool = False, index: IndexCacheStore = None, **_extra: object, ) -> tuple[ByteSource | None, IOResult]: n_int = int(n) if n is not None else None c_int = int(c) if c is not None else None if paths: paths = await resolve_glob(accessor, paths, index) # Single file with -c >= 0: serve the first c_int bytes from the # cache when warm, otherwise fetch only those bytes via a range # request instead of streaming the whole file. A negative -c (all but # the last N bytes) cannot be a prefix fetch, so fall through to the # generic head, which reads the whole object. if len(paths) == 1 and c_int is not None and c_int >= 0: data = await cached_prefix_bytes(paths[0], c_int) if data is None: data = await range_read(accessor, paths[0], 0, c_int) return yield_bytes(data), IOResult() return head_multi(paths, read=read_stream, accessor=accessor, index=index, n=n_int, c=c_int, show_headers=(v or len(paths) > 1) and not q), IOResult() source = _resolve_source(stdin, "head: missing operand") return generic_head(source, n=n_int, c=c_int), IOResult()