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.
Files changed (222) hide show
  1. {tensorfs-0.9.2 → tensorfs-0.9.3}/Cargo.lock +3 -3
  2. {tensorfs-0.9.2 → tensorfs-0.9.3}/Cargo.toml +1 -1
  3. {tensorfs-0.9.2 → tensorfs-0.9.3}/PKG-INFO +1 -1
  4. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/gc.rs +53 -1
  5. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/transaction.rs +6 -3
  6. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/providers.rs +74 -161
  7. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/source_model.rs +289 -113
  8. tensorfs-0.9.3/crates/tensorfs-core/tests/source_model.rs +505 -0
  9. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/store.rs +19 -1
  10. {tensorfs-0.9.2 → tensorfs-0.9.3}/pyproject.toml +1 -1
  11. tensorfs-0.9.2/crates/tensorfs-core/tests/source_model.rs +0 -144
  12. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/Cargo.toml +0 -0
  13. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/build.rs +0 -0
  14. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/filesystem_parent_death_gate.rs +0 -0
  15. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  16. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/mine-vectors.rs +0 -0
  17. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  18. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  19. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  20. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/asset_update.rs +0 -0
  21. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/b64.rs +0 -0
  22. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  23. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
  24. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  25. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  26. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  27. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  28. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  29. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  30. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  31. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/canon.rs +0 -0
  32. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/capability.rs +0 -0
  33. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  34. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/catalog.rs +0 -0
  35. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/cbor.rs +0 -0
  36. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  37. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  38. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/corpus.rs +0 -0
  39. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  40. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/channel.rs +0 -0
  41. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  42. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  43. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  44. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  45. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  46. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/next_attempt_tests.rs +0 -0
  47. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  48. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  49. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  50. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  51. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  52. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/derived.rs +0 -0
  53. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/descriptors.rs +0 -0
  54. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/disk.rs +0 -0
  55. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/dtype.rs +0 -0
  56. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/durability.rs +0 -0
  57. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
  58. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  59. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ensure.rs +0 -0
  60. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/err.rs +0 -0
  61. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fetch.rs +0 -0
  62. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
  63. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fill.rs +0 -0
  64. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/fit.rs +0 -0
  65. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/header.rs +0 -0
  66. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/home.rs +0 -0
  67. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ids.rs +0 -0
  68. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  69. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  70. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  71. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  72. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  73. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  74. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  75. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  76. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  77. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  78. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  79. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  80. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  81. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  82. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/sdxl_lora.rs +0 -0
  83. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  84. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  85. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/jcs.rs +0 -0
  86. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
  87. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/lib.rs +0 -0
  88. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/limits.rs +0 -0
  89. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/machine.rs +0 -0
  90. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/manifest.rs +0 -0
  91. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/meta.rs +0 -0
  92. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/object_roots.rs +0 -0
  93. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/origin.rs +0 -0
  94. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/project.rs +0 -0
  95. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/read.rs +0 -0
  96. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/receipt.rs +0 -0
  97. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/reclaim.rs +0 -0
  98. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/registry.rs +0 -0
  99. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/relation.rs +0 -0
  100. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  101. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/repository.rs +0 -0
  102. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/sha256.rs +0 -0
  103. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  104. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/spec.rs +0 -0
  105. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/stats.rs +0 -0
  106. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/storage.rs +0 -0
  107. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/store.rs +0 -0
  108. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/api.rs +0 -0
  109. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/credential.rs +0 -0
  110. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
  111. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/download.rs +0 -0
  112. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/dpop.rs +0 -0
  113. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/dpop_tests.rs +0 -0
  114. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/http.rs +0 -0
  115. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  116. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  117. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  118. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  119. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  120. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  121. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/publish.rs +0 -0
  122. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  123. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/push.rs +0 -0
  124. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/sources.rs +0 -0
  125. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
  126. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  127. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/unsynced.rs +0 -0
  128. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/src/vectors.rs +0 -0
  129. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  130. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  131. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/as_is.rs +0 -0
  132. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  133. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  134. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
  135. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  136. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/conform.rs +0 -0
  137. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/ensure.rs +0 -0
  138. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  139. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  140. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
  141. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/filesystem_parent_death_gate.py +0 -0
  142. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fit.rs +0 -0
  143. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  144. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  145. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  146. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  147. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  148. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  149. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  150. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  151. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  152. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  153. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/home.rs +0 -0
  154. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  155. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  156. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  157. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
  158. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/liveness.rs +0 -0
  159. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/owned_store.rs +0 -0
  160. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  161. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  162. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  163. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  164. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  165. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  166. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  167. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  168. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/sdxl_lora.rs +0 -0
  169. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  170. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  171. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_download.rs +0 -0
  172. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  173. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  174. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  175. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  176. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  177. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  178. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  179. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/vectors.rs +0 -0
  180. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/version.rs +0 -0
  181. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-core/tests/write_through.rs +0 -0
  182. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/API.md +0 -0
  183. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/Cargo.toml +0 -0
  184. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
  185. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
  186. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
  187. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/cuda.rs +0 -0
  188. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/cursor.rs +0 -0
  189. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/device.rs +0 -0
  190. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/faults.rs +0 -0
  191. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/host.rs +0 -0
  192. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/io.rs +0 -0
  193. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/layout.rs +0 -0
  194. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/lib.rs +0 -0
  195. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/plane.rs +0 -0
  196. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/src/window.rs +0 -0
  197. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/census.rs +0 -0
  198. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/common/mod.rs +0 -0
  199. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/gpu.rs +0 -0
  200. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
  201. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/layout_identity.rs +0 -0
  202. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/sealed.rs +0 -0
  203. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-plane/tests/window.rs +0 -0
  204. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/Cargo.toml +0 -0
  205. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/docs.rs +0 -0
  206. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/ensure.rs +0 -0
  207. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/errors.rs +0 -0
  208. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/ingest.rs +0 -0
  209. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/lib.rs +0 -0
  210. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/plane.rs +0 -0
  211. {tensorfs-0.9.2 → tensorfs-0.9.3}/crates/tensorfs-py/src/readplan.rs +0 -0
  212. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/__init__.py +0 -0
  213. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_derived_channel.py +0 -0
  214. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_ext.pyi +0 -0
  215. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_source_channel.py +0 -0
  216. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/_tensors.py +0 -0
  217. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/derived.py +0 -0
  218. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/errors.py +0 -0
  219. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/plane.py +0 -0
  220. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/plane.pyi +0 -0
  221. {tensorfs-0.9.2 → tensorfs-0.9.3}/python/tensorfs/py.typed +0 -0
  222. {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.2"
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.2"
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.2"
593
+ version = "0.9.3"
594
594
  dependencies = [
595
595
  "pyo3",
596
596
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-plane", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.9.2"
6
+ version = "0.9.3"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.9.2
3
+ Version: 0.9.3
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -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
- let root = tx::read_session(store.root(), &session)?;
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
- fs::write(dir.join("session.json"), root.canonical_bytes())
223
- .map_err(|e| io("write ingest session", e))
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(_) => refuse(
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
- files: Option<&[String]>,
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
- if files.is_some_and(|files| !files.iter().any(|file| file == path)) {
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
- if members.is_empty() {
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 only explicitly named ordinary files at one immutable HF revision.
1287
- /// No suffix has special meaning here: selecting Python bytes never executes them,
1288
- /// and selecting an index does not expand it into tensor shards. Tensor carriers
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
- files: &[String],
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 filter = folders.is_empty().then_some(names.as_slice());
1335
- let listed =
1336
- list_selected_observed(uri, endpoints, credentials, deadline, &ledger, filter, None)?;
1337
- for folder in &folders {
1338
- let before = names.len();
1339
- names.extend(
1340
- listed
1341
- .iter()
1342
- .filter(|m| m.member.starts_with(folder.as_str()))
1343
- .filter(|m| !is_safetensors(&m.member) && !is_index(&m.member))
1344
- .map(|m| m.member.clone()),
1345
- );
1346
- if names.len() == before {
1347
- return refuse(
1348
- Code::MISSING_FIELD,
1349
- format!("the source has no ordinary file under {folder:?}"),
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
- names.sort();
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 mut names = vec![
2282
- "config.json".into(),
2283
- "tokenizer files/tokenizer.json".into(),
2284
- ];
2285
- let selected =
2286
- resolve_files(&uri, &names, &endpoints, &Anonymous, Deadline::none()).unwrap();
2287
- names.reverse();
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 explicit_files_refuse_missing_and_over_budget_before_fetching_bodies() {
2363
- for (names, listing, code) in [
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
- Code::MISSING_FIELD,
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
- assert_eq!(
2387
- resolve_files(&uri, &names, &endpoints, &Anonymous, Deadline::none())
2388
- .unwrap_err()
2389
- .code,
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 selected = resolve_files(
2438
- &uri,
2439
- &["tokenizer/".into(), "unet/config.json".into()],
2440
- &endpoints,
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
- &uri,
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
- &uri,
2495
- &["config.json".into()],
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 selected = resolve_files(
2528
- &uri,
2529
- &["config.json".into()],
2530
- &endpoints,
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 selected = resolve_files(
2579
- &uri,
2580
- &["empty.py".into()],
2581
- &endpoints,
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();