Files
wehub-resource-sync bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:44 +08:00

114 lines
4.0 KiB
Python

from mirage.cache.index import IndexCacheStore
from mirage.commands.builtin.find_eval import (FindEntry, PredNode, build_tree,
keep, start_basename,
tree_has_type)
from mirage.core.dify.path import resolve_path
from mirage.core.dify.stat import stat
from mirage.core.dify.walk import walk
from mirage.types import PathSpec
from mirage.utils.key_prefix import mount_key, mount_prefix_of
async def find(
accessor,
path: PathSpec,
name: str | None = None,
type: str | None = None,
min_size: int | None = None,
max_size: int | None = None,
maxdepth: int | None = None,
name_exclude: str | None = None,
or_names: list[str] | None = None,
mtime_min: float | None = None,
mtime_max: float | None = None,
iname: str | None = None,
path_pattern: str | None = None,
mindepth: int | None = None,
empty: bool = False,
tree: PredNode | None = None,
index: IndexCacheStore | None = None,
) -> list[str]:
if index is None:
raise ValueError("find: missing index")
results = await walk(accessor,
path,
index,
include_root=True,
maxdepth=maxdepth,
strip_prefix=True)
tree = tree if tree is not None else build_tree(name=name,
iname=iname,
path_pattern=path_pattern,
type=type,
name_exclude=name_exclude,
or_names=or_names)
needs_kind = (tree_has_type(tree) or min_size is not None
or max_size is not None)
start_name = start_basename(path)
filtered: list[str] = []
for item in results:
if await _matches(accessor, item,
mount_prefix_of(path.virtual, path.resource_path),
index, path.mount_path, tree, needs_kind, min_size,
max_size, mindepth, start_name):
filtered.append(item)
return sorted(filtered)
async def _matches(
accessor,
item: str,
prefix: str,
index: IndexCacheStore,
root: str,
tree: PredNode,
needs_kind: bool,
min_size: int | None,
max_size: int | None,
mindepth: int | None,
start_name: str,
) -> bool:
root_norm = root.rstrip("/") or "/"
item_norm = item.rstrip("/") or "/"
item_name = (start_name if item_norm == root_norm else
item.rstrip("/").rsplit("/", 1)[-1])
spec = PathSpec.from_str_path(item, mount_key(item, prefix))
kind = "f"
if needs_kind:
resolved = await resolve_path(accessor, spec, index)
kind = "d" if resolved.is_dir else "f"
entry = FindEntry(key=item,
name=item_name,
kind=kind,
depth=_relative_depth(item, root))
if not keep(entry, tree, mindepth):
return False
# Directories count as size 0 for -size (deliberate GNU divergence).
if min_size is not None or max_size is not None:
if kind == "d":
size = 0
else:
item_stat = await stat(accessor, spec, index)
if item_stat.size is None:
return False
size = item_stat.size
if min_size is not None and size < min_size:
return False
if max_size is not None and size > max_size:
return False
return True
def _relative_depth(item: str, root: str) -> int:
root_norm = root.rstrip("/") or "/"
item_norm = item.rstrip("/") or "/"
if item_norm == root_norm:
return 0
if root_norm == "/":
relative = item_norm.strip("/")
else:
relative = item_norm.removeprefix(root_norm).lstrip("/")
if not relative:
return 0
return relative.count("/") + 1