tensorfs 0.9.2__tar.gz → 0.9.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tensorfs-0.9.2 → tensorfs-0.9.3}/Cargo.lock +3 -3
- {tensorfs-0.9.2 → tensorfs-0.9.3}/Cargo.toml +1 -1
- {tensorfs-0.9.2 → tensorfs-0.9.3}/PKG-INFO +1 -1
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/gc.rs +53 -1
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/transaction.rs +6 -3
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/providers.rs +74 -161
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/source_model.rs +289 -113
- tensorfs-0.9.3/crates/tensorfs-core/tests/source_model.rs +505 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/store.rs +19 -1
- {tensorfs-0.9.2 → tensorfs-0.9.3}/pyproject.toml +1 -1
- tensorfs-0.9.2/crates/tensorfs-core/tests/source_model.rs +0 -144
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/filesystem_parent_death_gate.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/mine-vectors.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/channel.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/next_attempt_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/sdxl_lora.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/source.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/object_roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/origin.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/credential.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/download.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/dpop.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/dpop_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/hub.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/publish.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/sources.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/tests.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/unsynced.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/conform.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/ensure.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/filesystem_parent_death_gate.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/owned_store.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/sdxl_lora.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/vectors.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/API.md +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/Cargo.toml +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/cuda.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/cursor.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/device.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/faults.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/host.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/io.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/layout.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/lib.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/plane.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/window.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/census.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/common/mod.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/gpu.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/layout_identity.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/sealed.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/window.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/ensure.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/plane.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/readplan.rs +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/plane.py +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/plane.pyi +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/py.typed +0 -0
- {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/records.py +0 -0
|
@@ -559,7 +559,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
559
559
|
|
|
560
560
|
[[package]]
|
|
561
561
|
name = "tensorfs-core"
|
|
562
|
-
version = "0.9.
|
|
562
|
+
version = "0.9.3"
|
|
563
563
|
dependencies = [
|
|
564
564
|
"base64",
|
|
565
565
|
"fs2",
|
|
@@ -580,7 +580,7 @@ dependencies = [
|
|
|
580
580
|
|
|
581
581
|
[[package]]
|
|
582
582
|
name = "tensorfs-plane"
|
|
583
|
-
version = "0.9.
|
|
583
|
+
version = "0.9.3"
|
|
584
584
|
dependencies = [
|
|
585
585
|
"libc",
|
|
586
586
|
"libloading",
|
|
@@ -590,7 +590,7 @@ dependencies = [
|
|
|
590
590
|
|
|
591
591
|
[[package]]
|
|
592
592
|
name = "tensorfs-py"
|
|
593
|
-
version = "0.9.
|
|
593
|
+
version = "0.9.3"
|
|
594
594
|
dependencies = [
|
|
595
595
|
"pyo3",
|
|
596
596
|
"tensorfs-core",
|
|
@@ -107,7 +107,12 @@ pub fn session_holds(store: &Store) -> Result<(Vec<HeldKey>, Vec<String>)> {
|
|
|
107
107
|
let mut lines: BTreeMap<String, Vec<u8>> = BTreeMap::new();
|
|
108
108
|
let mut sessions = Vec::new();
|
|
109
109
|
for session in tx::sessions(store) {
|
|
110
|
-
|
|
110
|
+
// A root another writer removes (its operation released) or has not yet written
|
|
111
|
+
// holds nothing; it is not this walk's failure.
|
|
112
|
+
let root = match tx::read_session(store.root(), &session) {
|
|
113
|
+
Err(absent) if absent.code == Code::ROOT_ABSENT => continue,
|
|
114
|
+
root => root?,
|
|
115
|
+
};
|
|
111
116
|
// An object the operation's publication custodian already holds is not in flight:
|
|
112
117
|
// the journal stops naming it, so the local copy is ordinary unreferenced bytes.
|
|
113
118
|
let custody = crate::ingest::custody::read_session(store.root(), &session)?;
|
|
@@ -540,4 +545,51 @@ mod tests {
|
|
|
540
545
|
assert!(!present(&leased));
|
|
541
546
|
fs::remove_dir_all(root).unwrap();
|
|
542
547
|
}
|
|
548
|
+
|
|
549
|
+
/// A concurrent ingest that creates and releases its own session root (run 6801 failed
|
|
550
|
+
/// composing on ROOT_ABSENT naming its neighbour 6802's released conversion) never fails
|
|
551
|
+
/// a walk of the others, which keep their holds.
|
|
552
|
+
#[test]
|
|
553
|
+
fn a_session_released_during_the_walk_fails_no_one() {
|
|
554
|
+
let root = std::env::temp_dir().join(format!(
|
|
555
|
+
"tensorfs-gc-released-{}-{}",
|
|
556
|
+
std::process::id(),
|
|
557
|
+
meta::now_nanos_unique()
|
|
558
|
+
));
|
|
559
|
+
let store = Store::init(&root).unwrap();
|
|
560
|
+
let held = store
|
|
561
|
+
.put_stream(
|
|
562
|
+
&mut &b"a live session's candidate"[..],
|
|
563
|
+
None,
|
|
564
|
+
&Fault::default(),
|
|
565
|
+
)
|
|
566
|
+
.unwrap()
|
|
567
|
+
.obj;
|
|
568
|
+
tx::ensure_session_root(&root, "live", "_tensorfs").unwrap();
|
|
569
|
+
tx::name_candidates(&root, "live", std::slice::from_ref(&held)).unwrap();
|
|
570
|
+
let holds = |store: &Store| {
|
|
571
|
+
let (holds, sessions) = session_holds(store).unwrap();
|
|
572
|
+
assert!(sessions.contains(&"live".to_string()), "{sessions:?}");
|
|
573
|
+
assert!(holds.iter().any(|hold| hold.sha256 == held.sha256));
|
|
574
|
+
};
|
|
575
|
+
// Its directory is still there, its root already gone.
|
|
576
|
+
fs::create_dir_all(tx::candidate_dir(&root, "leaving")).unwrap();
|
|
577
|
+
holds(&store);
|
|
578
|
+
let churn = std::thread::spawn({
|
|
579
|
+
let root = root.clone();
|
|
580
|
+
let held = held.clone();
|
|
581
|
+
move || {
|
|
582
|
+
for _ in 0..300 {
|
|
583
|
+
tx::ensure_session_root(&root, "churn", "_tensorfs").unwrap();
|
|
584
|
+
tx::name_candidates(&root, "churn", std::slice::from_ref(&held)).unwrap();
|
|
585
|
+
fs::remove_dir_all(tx::candidate_dir(&root, "churn")).unwrap();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
while !churn.is_finished() {
|
|
590
|
+
holds(&store);
|
|
591
|
+
}
|
|
592
|
+
churn.join().unwrap();
|
|
593
|
+
fs::remove_dir_all(root).unwrap();
|
|
594
|
+
}
|
|
543
595
|
}
|
|
@@ -219,18 +219,21 @@ pub fn write_session(store_root: &Path, root: &IngestSession) -> Result<()> {
|
|
|
219
219
|
};
|
|
220
220
|
let dir = candidate_dir(store_root, &root.session);
|
|
221
221
|
fs::create_dir_all(&dir).map_err(|e| io("mkdir ingest candidate", e))?;
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
// Renamed into place: a concurrent reader sees the whole root or none, never a torn one.
|
|
223
|
+
let staged = dir.join(format!("session.json.{}", crate::meta::now_nanos_unique()));
|
|
224
|
+
fs::write(&staged, root.canonical_bytes()).map_err(|e| io("write ingest session", e))?;
|
|
225
|
+
fs::rename(&staged, dir.join("session.json")).map_err(|e| io("install ingest session", e))
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
pub fn read_session(store_root: &Path, session: &str) -> Result<IngestSession> {
|
|
227
229
|
let p = candidate_dir(store_root, session).join("session.json");
|
|
228
230
|
match fs::read(&p) {
|
|
229
231
|
Ok(b) => IngestSession::parse(&b),
|
|
230
|
-
Err(
|
|
232
|
+
Err(e) if e.kind() == std::io::ErrorKind::NotFound => refuse(
|
|
231
233
|
Code::ROOT_ABSENT,
|
|
232
234
|
format!("no ingest session {session:?}: reaped, never created, or already installed"),
|
|
233
235
|
),
|
|
236
|
+
Err(e) => Err(io("read ingest session", e)),
|
|
234
237
|
}
|
|
235
238
|
}
|
|
236
239
|
|
|
@@ -247,7 +247,7 @@ fn list_selected_observed(
|
|
|
247
247
|
credentials: &dyn CredentialProvider,
|
|
248
248
|
deadline: Deadline,
|
|
249
249
|
ledger: &Ledger,
|
|
250
|
-
|
|
250
|
+
wanted: Option<&dyn Fn(&str) -> bool>,
|
|
251
251
|
mut unnameable: Option<&mut Vec<String>>,
|
|
252
252
|
) -> Result<Vec<SourceMember>> {
|
|
253
253
|
let policy = endpoints.policy(uri);
|
|
@@ -286,7 +286,9 @@ fn list_selected_observed(
|
|
|
286
286
|
let Some(path) = json_str(row, "path") else {
|
|
287
287
|
return refuse(Code::MISSING_FIELD, "a tree row names no path");
|
|
288
288
|
};
|
|
289
|
-
|
|
289
|
+
// Before any check of its own: a gated repository masks the digests of
|
|
290
|
+
// carriers a metadata-only selection never reads.
|
|
291
|
+
if wanted.is_some_and(|wanted| !wanted(path)) {
|
|
290
292
|
continue;
|
|
291
293
|
}
|
|
292
294
|
if !member_path(path) {
|
|
@@ -442,7 +444,8 @@ fn list_selected_observed(
|
|
|
442
444
|
members
|
|
443
445
|
}
|
|
444
446
|
};
|
|
445
|
-
|
|
447
|
+
// A selection that matches nothing is an answer; a source with no member is not.
|
|
448
|
+
if members.is_empty() && wanted.is_none() {
|
|
446
449
|
return refuse(Code::MISSING_FIELD, "the source reaches no member");
|
|
447
450
|
}
|
|
448
451
|
if members.len() > MEMBER_MAX {
|
|
@@ -1283,20 +1286,17 @@ fn resolve_with(
|
|
|
1283
1286
|
})
|
|
1284
1287
|
}
|
|
1285
1288
|
|
|
1286
|
-
/// Resolve
|
|
1287
|
-
///
|
|
1288
|
-
///
|
|
1289
|
-
/// continue to use `resolve` and reviewed profile/carrier selection.
|
|
1290
|
-
///
|
|
1291
|
-
/// A name ending in `/` selects every ordinary file under that folder (a tokenizer or
|
|
1292
|
-
/// processor, whose file set varies by class); tensor carriers there are never selected.
|
|
1289
|
+
/// Resolve the ordinary files `wanted` selects at one immutable HF revision, from one
|
|
1290
|
+
/// listing; `None` when it selects none. Selecting Python bytes never executes them, and
|
|
1291
|
+
/// selecting an index does not expand it into tensor shards: tensor carriers are never
|
|
1292
|
+
/// selected here, they continue to use `resolve` and reviewed profile/carrier selection.
|
|
1293
1293
|
pub fn resolve_files(
|
|
1294
1294
|
uri: &SourceUri,
|
|
1295
|
-
|
|
1295
|
+
wanted: &dyn Fn(&str) -> bool,
|
|
1296
1296
|
endpoints: &Endpoints,
|
|
1297
1297
|
credentials: &dyn CredentialProvider,
|
|
1298
1298
|
deadline: Deadline,
|
|
1299
|
-
) -> Result<Resolution
|
|
1299
|
+
) -> Result<Option<Resolution>> {
|
|
1300
1300
|
let SourceUri::HuggingFace {
|
|
1301
1301
|
org,
|
|
1302
1302
|
repo,
|
|
@@ -1308,70 +1308,32 @@ pub fn resolve_files(
|
|
|
1308
1308
|
"ordinary file selection requires HuggingFace",
|
|
1309
1309
|
);
|
|
1310
1310
|
};
|
|
1311
|
-
if files.is_empty() || files.len() > MEMBER_MAX {
|
|
1312
|
-
return refuse(
|
|
1313
|
-
Code::COUNT_CAP,
|
|
1314
|
-
"ordinary file selection count is outside the bound",
|
|
1315
|
-
);
|
|
1316
|
-
}
|
|
1317
|
-
let (folders, mut names): (Vec<String>, Vec<String>) =
|
|
1318
|
-
files.iter().cloned().partition(|name| name.ends_with('/'));
|
|
1319
|
-
names.sort();
|
|
1320
|
-
names.dedup();
|
|
1321
|
-
if names
|
|
1322
|
-
.iter()
|
|
1323
|
-
.chain(&folders)
|
|
1324
|
-
.map(|name| name.trim_end_matches('/'))
|
|
1325
|
-
.any(|name| !member_path(name) || crate::manifest::check_path(name).is_err())
|
|
1326
|
-
{
|
|
1327
|
-
return refuse(
|
|
1328
|
-
Code::PATH_ILLEGAL,
|
|
1329
|
-
"ordinary file selection requires exact member or folder paths",
|
|
1330
|
-
);
|
|
1331
|
-
}
|
|
1332
1311
|
let ledger = Ledger::new();
|
|
1333
1312
|
let policy = endpoints.policy(uri);
|
|
1334
|
-
let
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
}
|
|
1313
|
+
let ordinary = |m: &str| {
|
|
1314
|
+
!is_safetensors(m) && !is_index(m) && crate::manifest::check_path(m).is_ok() && wanted(m)
|
|
1315
|
+
};
|
|
1316
|
+
let listed = list_selected_observed(
|
|
1317
|
+
uri,
|
|
1318
|
+
endpoints,
|
|
1319
|
+
credentials,
|
|
1320
|
+
deadline,
|
|
1321
|
+
&ledger,
|
|
1322
|
+
Some(&ordinary),
|
|
1323
|
+
None,
|
|
1324
|
+
)?;
|
|
1325
|
+
let mut selected: Vec<&SourceMember> = listed.iter().collect();
|
|
1326
|
+
selected.sort_by(|a, b| a.member.cmp(&b.member));
|
|
1327
|
+
selected.dedup_by(|a, b| a.member == b.member);
|
|
1328
|
+
if selected.is_empty() {
|
|
1329
|
+
return Ok(None);
|
|
1352
1330
|
}
|
|
1353
|
-
|
|
1354
|
-
names.dedup();
|
|
1355
|
-
if names.len() > MEMBER_MAX {
|
|
1331
|
+
if selected.len() > MEMBER_MAX {
|
|
1356
1332
|
return refuse(
|
|
1357
1333
|
Code::COUNT_CAP,
|
|
1358
1334
|
"ordinary file selection count is outside the bound",
|
|
1359
1335
|
);
|
|
1360
1336
|
}
|
|
1361
|
-
// Establish the whole roster before fetching any body. A missing later member
|
|
1362
|
-
// must not turn a partial requested tree into a successful smaller selection.
|
|
1363
|
-
let selected = names
|
|
1364
|
-
.iter()
|
|
1365
|
-
.map(|name| {
|
|
1366
|
-
listed
|
|
1367
|
-
.iter()
|
|
1368
|
-
.find(|member| &member.member == name)
|
|
1369
|
-
.ok_or_else(|| Refusal {
|
|
1370
|
-
code: Code::MISSING_FIELD,
|
|
1371
|
-
detail: format!("the source does not contain requested file {name:?}"),
|
|
1372
|
-
})
|
|
1373
|
-
})
|
|
1374
|
-
.collect::<Result<Vec<_>>>()?;
|
|
1375
1337
|
let listed_bytes = selected.iter().try_fold(0u64, |total, member| {
|
|
1376
1338
|
total.checked_add(member.length.unwrap_or(0))
|
|
1377
1339
|
});
|
|
@@ -1442,11 +1404,11 @@ pub fn resolve_files(
|
|
|
1442
1404
|
});
|
|
1443
1405
|
}
|
|
1444
1406
|
let canonical = format!("hf://{org}/{repo}@{revision}");
|
|
1445
|
-
Ok(Resolution {
|
|
1407
|
+
Ok(Some(Resolution {
|
|
1446
1408
|
selection_sha256: selection_digest(&canonical, &resolved),
|
|
1447
1409
|
canonical,
|
|
1448
1410
|
members: resolved,
|
|
1449
|
-
})
|
|
1411
|
+
}))
|
|
1450
1412
|
}
|
|
1451
1413
|
|
|
1452
1414
|
#[cfg(test)]
|
|
@@ -2278,17 +2240,14 @@ mod tests {
|
|
|
2278
2240
|
allow_local: true,
|
|
2279
2241
|
..Endpoints::default()
|
|
2280
2242
|
};
|
|
2281
|
-
let
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
assert_eq!(
|
|
2289
|
-
selected,
|
|
2290
|
-
resolve_files(&uri, &names, &endpoints, &Anonymous, Deadline::none()).unwrap()
|
|
2291
|
-
);
|
|
2243
|
+
let wanted = |m: &str| m == "config.json" || m == "tokenizer files/tokenizer.json";
|
|
2244
|
+
let resolved = || {
|
|
2245
|
+
resolve_files(&uri, &wanted, &endpoints, &Anonymous, Deadline::none())
|
|
2246
|
+
.unwrap()
|
|
2247
|
+
.unwrap()
|
|
2248
|
+
};
|
|
2249
|
+
let selected = resolved();
|
|
2250
|
+
assert_eq!(selected, resolved());
|
|
2292
2251
|
assert_eq!(
|
|
2293
2252
|
selected
|
|
2294
2253
|
.members
|
|
@@ -2359,21 +2318,18 @@ mod tests {
|
|
|
2359
2318
|
}
|
|
2360
2319
|
|
|
2361
2320
|
#[test]
|
|
2362
|
-
fn
|
|
2363
|
-
|
|
2321
|
+
fn files_select_nothing_absent_and_refuse_over_budget_before_fetching_bodies() {
|
|
2322
|
+
let oversized = format!(
|
|
2323
|
+
r#"[{{"type":"file","path":"config.json","size":{}}}]"#,
|
|
2324
|
+
FILE_SELECTION_MAX_BYTES + 1
|
|
2325
|
+
);
|
|
2326
|
+
for (listing, name, outcome) in [
|
|
2364
2327
|
(
|
|
2365
|
-
vec!["absent.json".into(), "config.json".into()],
|
|
2366
2328
|
r#"[{"type":"file","path":"config.json","size":2}]"#.to_string(),
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
(
|
|
2370
|
-
vec!["config.json".into()],
|
|
2371
|
-
format!(
|
|
2372
|
-
r#"[{{"type":"file","path":"config.json","size":{}}}]"#,
|
|
2373
|
-
FILE_SELECTION_MAX_BYTES + 1
|
|
2374
|
-
),
|
|
2375
|
-
Code::SIZE_CAP,
|
|
2329
|
+
"absent.json",
|
|
2330
|
+
None,
|
|
2376
2331
|
),
|
|
2332
|
+
(oversized, "config.json", Some(Code::SIZE_CAP)),
|
|
2377
2333
|
] {
|
|
2378
2334
|
let (base, _, handle) =
|
|
2379
2335
|
origin(1, move |_| ok_body(listing.as_bytes(), "application/json"));
|
|
@@ -2383,33 +2339,14 @@ mod tests {
|
|
|
2383
2339
|
allow_local: true,
|
|
2384
2340
|
..Endpoints::default()
|
|
2385
2341
|
};
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
code
|
|
2391
|
-
|
|
2342
|
+
let wanted = |m: &str| m == name;
|
|
2343
|
+
let resolved = resolve_files(&uri, &wanted, &endpoints, &Anonymous, Deadline::none());
|
|
2344
|
+
match outcome {
|
|
2345
|
+
None => assert_eq!(resolved.unwrap(), None),
|
|
2346
|
+
Some(code) => assert_eq!(resolved.unwrap_err().code, code),
|
|
2347
|
+
}
|
|
2392
2348
|
handle.join().unwrap();
|
|
2393
2349
|
}
|
|
2394
|
-
let uri = SourceUri::parse(&format!("hf://org/repo@{}", "ab".repeat(20))).unwrap();
|
|
2395
|
-
for names in [
|
|
2396
|
-
vec!["../config.json".into()],
|
|
2397
|
-
vec!["*.json".into()],
|
|
2398
|
-
vec!["/config.json".into()],
|
|
2399
|
-
] {
|
|
2400
|
-
assert_eq!(
|
|
2401
|
-
resolve_files(
|
|
2402
|
-
&uri,
|
|
2403
|
-
&names,
|
|
2404
|
-
&Endpoints::default(),
|
|
2405
|
-
&Anonymous,
|
|
2406
|
-
Deadline::none()
|
|
2407
|
-
)
|
|
2408
|
-
.unwrap_err()
|
|
2409
|
-
.code,
|
|
2410
|
-
Code::PATH_ILLEGAL
|
|
2411
|
-
);
|
|
2412
|
-
}
|
|
2413
2350
|
}
|
|
2414
2351
|
|
|
2415
2352
|
#[test]
|
|
@@ -2434,14 +2371,10 @@ mod tests {
|
|
|
2434
2371
|
allow_local: true,
|
|
2435
2372
|
..Endpoints::default()
|
|
2436
2373
|
};
|
|
2437
|
-
let
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
&Anonymous,
|
|
2442
|
-
Deadline::none(),
|
|
2443
|
-
)
|
|
2444
|
-
.unwrap();
|
|
2374
|
+
let wanted = |m: &str| m.starts_with("tokenizer/") || m == "unet/config.json";
|
|
2375
|
+
let selected = resolve_files(&uri, &wanted, &endpoints, &Anonymous, Deadline::none())
|
|
2376
|
+
.unwrap()
|
|
2377
|
+
.unwrap();
|
|
2445
2378
|
let members: Vec<&str> = selected.members.iter().map(|m| m.member.as_str()).collect();
|
|
2446
2379
|
assert_eq!(
|
|
2447
2380
|
members,
|
|
@@ -2451,17 +2384,10 @@ mod tests {
|
|
|
2451
2384
|
"unet/config.json"
|
|
2452
2385
|
]
|
|
2453
2386
|
);
|
|
2387
|
+
let vae = |m: &str| m.starts_with("vae/");
|
|
2454
2388
|
assert_eq!(
|
|
2455
|
-
resolve_files(
|
|
2456
|
-
|
|
2457
|
-
&["vae/".into()],
|
|
2458
|
-
&endpoints,
|
|
2459
|
-
&Anonymous,
|
|
2460
|
-
Deadline::none()
|
|
2461
|
-
)
|
|
2462
|
-
.unwrap_err()
|
|
2463
|
-
.code,
|
|
2464
|
-
Code::MISSING_FIELD
|
|
2389
|
+
resolve_files(&uri, &vae, &endpoints, &Anonymous, Deadline::none()).unwrap(),
|
|
2390
|
+
None
|
|
2465
2391
|
);
|
|
2466
2392
|
handle.join().unwrap();
|
|
2467
2393
|
assert!(!seen
|
|
@@ -2489,16 +2415,11 @@ mod tests {
|
|
|
2489
2415
|
allow_local: true,
|
|
2490
2416
|
..Endpoints::default()
|
|
2491
2417
|
};
|
|
2418
|
+
let config = |m: &str| m == "config.json";
|
|
2492
2419
|
assert_eq!(
|
|
2493
|
-
resolve_files(
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
&endpoints,
|
|
2497
|
-
&Anonymous,
|
|
2498
|
-
Deadline::none()
|
|
2499
|
-
)
|
|
2500
|
-
.unwrap_err()
|
|
2501
|
-
.code,
|
|
2420
|
+
resolve_files(&uri, &config, &endpoints, &Anonymous, Deadline::none())
|
|
2421
|
+
.unwrap_err()
|
|
2422
|
+
.code,
|
|
2502
2423
|
Code::LENGTH_MISMATCH
|
|
2503
2424
|
);
|
|
2504
2425
|
handle.join().unwrap();
|
|
@@ -2524,14 +2445,10 @@ mod tests {
|
|
|
2524
2445
|
allow_local: true,
|
|
2525
2446
|
..Endpoints::default()
|
|
2526
2447
|
};
|
|
2527
|
-
let
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
&Anonymous,
|
|
2532
|
-
Deadline::none(),
|
|
2533
|
-
)
|
|
2534
|
-
.unwrap();
|
|
2448
|
+
let config = |m: &str| m == "config.json";
|
|
2449
|
+
let selected = resolve_files(&uri, &config, &endpoints, &Anonymous, Deadline::none())
|
|
2450
|
+
.unwrap()
|
|
2451
|
+
.unwrap();
|
|
2535
2452
|
let root = temporary("changed-files");
|
|
2536
2453
|
let store = Store::init(&root).unwrap();
|
|
2537
2454
|
let producer = ObjectRef::of(b"changed-files-producer").id();
|
|
@@ -2575,14 +2492,10 @@ mod tests {
|
|
|
2575
2492
|
allow_local: true,
|
|
2576
2493
|
..Endpoints::default()
|
|
2577
2494
|
};
|
|
2578
|
-
let
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
&Anonymous,
|
|
2583
|
-
Deadline::none(),
|
|
2584
|
-
)
|
|
2585
|
-
.unwrap();
|
|
2495
|
+
let empty = |m: &str| m == "empty.py";
|
|
2496
|
+
let selected = resolve_files(&uri, &empty, &endpoints, &Anonymous, Deadline::none())
|
|
2497
|
+
.unwrap()
|
|
2498
|
+
.unwrap();
|
|
2586
2499
|
assert_eq!(selected.members[0].object, ObjectRef::of(b""));
|
|
2587
2500
|
let root = temporary("empty-files");
|
|
2588
2501
|
let store = Store::init(&root).unwrap();
|