hf-xet 1.5.0.dev3__tar.gz → 1.5.1.dev0__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.
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/Cargo.toml +8 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/PKG-INFO +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/Cargo.lock +23 -33
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/Cargo.toml +1 -1
- hf_xet-1.5.1.dev0/hf_xet/src/background_progress.rs +168 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/lib.rs +1 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_file_download_group.rs +40 -25
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_upload_commit.rs +40 -25
- hf_xet-1.5.1.dev0/xet_client/src/cas_client/chunk_window_builder.rs +393 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/interface.rs +16 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/mod.rs +1 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/remote_client.rs +46 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/retry_wrapper.rs +46 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_client.rs +29 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/server.rs +8 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/simulation_control_client.rs +11 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/memory_client.rs +38 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/simulation_client.rs +8 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/simulation_server.rs +8 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_types/mod.rs +39 -3
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/disk.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/mod.rs +3 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/interpolation_search.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/session_directory.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_file_handle.rs +2 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_file_manager.rs +2 -7
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_format.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_in_memory.rs +2 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/streaming_shard.rs +58 -6
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/xorb_structs.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/bg4_prediction.rs +2 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/compression_stats/collect_compression_stats.rs +2 -2
- hf_xet-1.5.1.dev0/xet_core_structures/src/xorb_object/constants.rs +76 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/xorb_object_format.rs +19 -4
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/chunking.rs +17 -6
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/data_aggregator.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/file_deduplication.rs +9 -6
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/interface.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/mod.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/parallel chunking.lyx +52 -3
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/parallel chunking.pdf +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/bin/example.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/data_client.rs +4 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/file_cleaner.rs +43 -19
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/file_upload_session.rs +59 -14
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/mod.rs +3 -0
- hf_xet-1.5.1.dev0/xet_data/src/processing/range_upload.rs +2105 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_session_resume.rs +1 -1
- hf_xet-1.5.1.dev0/xet_data/tests/test_stable_chunk_boundary_detection.rs +312 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/file_download_group.rs +1 -1
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/upload_commit.rs +0 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/client.rs +2 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/file_utils/safe_file_creator.rs +2 -2
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/configuration_utils.rs +2 -2
- hf_xet-1.5.0.dev3/xet_core_structures/src/xorb_object/constants.rs +0 -29
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/.gitignore +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/LICENSE +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/config.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/headers.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/functions.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/progress_update.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/runtime.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/token_refresh.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/legacy/types.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/logging.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/profiling.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_download_stream_group.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_download_stream_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_file_download_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_file_upload_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_stream_upload_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/py_xet_session.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/src/utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/conftest.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_config.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_file_download.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_progress.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_session.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_stream_download.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/hf_xet/tests/test_upload_commit.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/pyproject.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/Cargo.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/adaptive_concurrency/controller.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/adaptive_concurrency/exp_weighted_olr.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/adaptive_concurrency/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/adaptive_concurrency/rtt_prediction.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/auth.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/exports.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/multipart.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/progress_tracked_streams.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/client_testing_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/client_unit_testing.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/deletion_controls.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/deletion_unit_testing.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/direct_access_client.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/handlers.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/latency_simulation.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/main.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/simulation_handlers.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/local_server/simulation_types.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/network_simulation/bandwidth_limit_router.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/network_simulation/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/network_simulation/network_profile.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/random_xorb.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/socket_proxy.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_client/simulation/xorb_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/cas_types/key.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/bin/analysis.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/cache_manager.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/disk/cache_file_header.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/disk/cache_item.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/disk/test_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/chunk_cache/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/common/auth/basics.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/common/auth/interface.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/common/auth.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/common/http_client.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/common/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/hub_client/client.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/hub_client/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/hub_client/types.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/src/lib.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_client/tests/test_shard_upload_timeout.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/Cargo.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/benches/bg_split_regroup_bench.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/benches/compression_bench.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/data_structures/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/lib.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/aggregated_hashes.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/data_hash.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/merkle_hash_subtree.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/passthrough_hasher.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/merklehash/passthrough_hashmap.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/chunk_verification.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/constants.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/file_structs.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/set_operations.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_benchmark.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_file.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/shard_file_reconstructor.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/metadata_shard/utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/utils/exp_weighted_moving_avg.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/utils/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/utils/serialization_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/bg4.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/bg4_prediction_benchmark.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/compression_stats/compression_prediction_tests.py +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/byte_grouping/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/chunk.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/compression_scheme.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/raw_xorb_data.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/xorb_chunk_format/deserialize_async.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_core_structures/src/xorb_object/xorb_chunk_format.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/Cargo.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/benches/reconstruction_bench.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/examples/chunk/main.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/examples/hash/main.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/examples/xorb-check/main.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/dedup_metrics.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/deduplication/defrag_prevention.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/data_writer.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/download_stream.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/sequential_writer.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/unordered_download_stream.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/data_writer/unordered_writer.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/file_reconstructor.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/reconstruction_terms/file_term.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/reconstruction_terms/manager.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/reconstruction_terms/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/reconstruction_terms/retrieval_urls.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/reconstruction_terms/xorb_block.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/file_reconstruction/run_state.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/lib.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/bin/xtool.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/configurations.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/constants.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/deduplication_interface.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/file_download_session.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/migration_tool/hub_client_token_refresher.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/migration_tool/migrate.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/migration_tool/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/remote_client_interface.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/sha256.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/shard_interface.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/test_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/processing/xet_file.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/progress_tracking/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/progress_tracking/progress_types.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/progress_tracking/speed_tracker.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/src/progress_tracking/upload_tracking.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/integration_tests/initialize.sh +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/integration_tests/test_basic_clean_smudge.sh +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/integration_tests.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_clean_smudge.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_clean_smudge_multirange.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_full_file_download.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_range_downloads.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_data/tests/test_unordered_download.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/Cargo.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/examples/example.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/examples/example_sync.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/legacy/data_client.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/legacy/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/legacy/progress_tracking/callback_bridge.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/legacy/progress_tracking/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/legacy/progress_tracking/progress_verification_wrapper.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/lib.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/auth_group_builder.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/common.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/download_stream_group.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/download_stream_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/errors.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/file_download_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/session.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/task_runtime.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/upload_file_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/src/xet_session/upload_stream_handle.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/tests/test_legacy_data_client.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_pkg/tests/test_xet_session.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/Cargo.toml +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/README.md +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/aliases.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/chunk_cache.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/data.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/deduplication.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/log.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/reconstruction.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/session.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/shard.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/system_monitor.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/groups/xorb.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/macros.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/python.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/config/xet_config.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/cache_dir.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/common.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/context.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/exports.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/file_handle_limits.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/par_utils.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/runtime.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/core/sync_primatives.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/error_printer/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/fd_diagnostics.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/file_utils/file_metadata.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/file_utils/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/file_utils/privilege_context.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/lib.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/logging/config.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/logging/constants.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/logging/init.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/logging/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/logging/system_monitor.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/adjustable_semaphore.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/async_iterator.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/async_read.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/byte_size.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/config_enum.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/errors.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/file_paths.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/guards.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/limited_joinset.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/mod.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/output_bytes.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/pipe.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/rw_task_lock.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/singleflight.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/src/utils/unique_id.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/bin/log_test_executable.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/config_env_test.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/config_values_test.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/integration_tests.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/primary_config_test.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/test_error.rs +0 -0
- {hf_xet-1.5.0.dev3 → hf_xet-1.5.1.dev0}/xet_runtime/tests/test_option.rs +0 -0
|
@@ -12,7 +12,13 @@ members = [
|
|
|
12
12
|
"git_xet",
|
|
13
13
|
"simulation",
|
|
14
14
|
]
|
|
15
|
-
exclude = [
|
|
15
|
+
exclude = [
|
|
16
|
+
"simulation/chunk_cache_bench",
|
|
17
|
+
"hf_xet",
|
|
18
|
+
"wasm/hf_xet_wasm",
|
|
19
|
+
"wasm/hf_xet_thin_wasm",
|
|
20
|
+
"examples/xet_pkg_napi",
|
|
21
|
+
]
|
|
16
22
|
|
|
17
23
|
[workspace.package]
|
|
18
24
|
version = "1.5.2"
|
|
@@ -52,7 +58,7 @@ console-subscriber = "0.5"
|
|
|
52
58
|
countio = { version = "0.3", features = ["futures"] }
|
|
53
59
|
crc32fast = "1.5"
|
|
54
60
|
csv = "1"
|
|
55
|
-
ctor = "
|
|
61
|
+
ctor = "1"
|
|
56
62
|
dirs = "6.0"
|
|
57
63
|
futures = "0.3"
|
|
58
64
|
humantime = "2.1"
|
|
@@ -633,20 +633,14 @@ dependencies = [
|
|
|
633
633
|
|
|
634
634
|
[[package]]
|
|
635
635
|
name = "ctor"
|
|
636
|
-
version = "0.
|
|
636
|
+
version = "1.0.3"
|
|
637
637
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
638
|
-
checksum = "
|
|
638
|
+
checksum = "5c24d2b2b7c12a2fffb7c5c8fd0dcda7ca14b4600fa2d3701b6079aefb6fa180"
|
|
639
639
|
dependencies = [
|
|
640
|
-
"
|
|
641
|
-
"
|
|
640
|
+
"link-section",
|
|
641
|
+
"linktime-proc-macro",
|
|
642
642
|
]
|
|
643
643
|
|
|
644
|
-
[[package]]
|
|
645
|
-
name = "ctor-proc-macro"
|
|
646
|
-
version = "0.0.7"
|
|
647
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
648
|
-
checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1"
|
|
649
|
-
|
|
650
644
|
[[package]]
|
|
651
645
|
name = "debugid"
|
|
652
646
|
version = "0.8.0"
|
|
@@ -707,21 +701,6 @@ dependencies = [
|
|
|
707
701
|
"syn",
|
|
708
702
|
]
|
|
709
703
|
|
|
710
|
-
[[package]]
|
|
711
|
-
name = "dtor"
|
|
712
|
-
version = "0.1.1"
|
|
713
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
714
|
-
checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301"
|
|
715
|
-
dependencies = [
|
|
716
|
-
"dtor-proc-macro",
|
|
717
|
-
]
|
|
718
|
-
|
|
719
|
-
[[package]]
|
|
720
|
-
name = "dtor-proc-macro"
|
|
721
|
-
version = "0.0.6"
|
|
722
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
723
|
-
checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5"
|
|
724
|
-
|
|
725
704
|
[[package]]
|
|
726
705
|
name = "dunce"
|
|
727
706
|
version = "1.0.5"
|
|
@@ -1110,7 +1089,7 @@ dependencies = [
|
|
|
1110
1089
|
|
|
1111
1090
|
[[package]]
|
|
1112
1091
|
name = "hf_xet"
|
|
1113
|
-
version = "1.5.
|
|
1092
|
+
version = "1.5.1-dev0"
|
|
1114
1093
|
dependencies = [
|
|
1115
1094
|
"async-trait",
|
|
1116
1095
|
"hf-xet",
|
|
@@ -1617,6 +1596,18 @@ dependencies = [
|
|
|
1617
1596
|
"libc",
|
|
1618
1597
|
]
|
|
1619
1598
|
|
|
1599
|
+
[[package]]
|
|
1600
|
+
name = "link-section"
|
|
1601
|
+
version = "0.15.0"
|
|
1602
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1603
|
+
checksum = "4641b91711debb59c61b07eb5e30521ed6d9e2bdd9fd04f934e7da3a5bc386d4"
|
|
1604
|
+
|
|
1605
|
+
[[package]]
|
|
1606
|
+
name = "linktime-proc-macro"
|
|
1607
|
+
version = "0.1.0"
|
|
1608
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1609
|
+
checksum = "a44cd706ff0d503ee32b2071166510ca27e281228de10cd3aa8d35ff94560f81"
|
|
1610
|
+
|
|
1620
1611
|
[[package]]
|
|
1621
1612
|
name = "linux-raw-sys"
|
|
1622
1613
|
version = "0.12.1"
|
|
@@ -1875,15 +1866,14 @@ checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107"
|
|
|
1875
1866
|
|
|
1876
1867
|
[[package]]
|
|
1877
1868
|
name = "openssl"
|
|
1878
|
-
version = "0.10.
|
|
1869
|
+
version = "0.10.79"
|
|
1879
1870
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1880
|
-
checksum = "
|
|
1871
|
+
checksum = "bf0b434746ee2832f4f0baf10137e1cabb18cbe6912c69e2e33263c45250f542"
|
|
1881
1872
|
dependencies = [
|
|
1882
1873
|
"bitflags 2.11.0",
|
|
1883
1874
|
"cfg-if 1.0.4",
|
|
1884
1875
|
"foreign-types",
|
|
1885
1876
|
"libc",
|
|
1886
|
-
"once_cell",
|
|
1887
1877
|
"openssl-macros",
|
|
1888
1878
|
"openssl-sys",
|
|
1889
1879
|
]
|
|
@@ -1916,9 +1906,9 @@ dependencies = [
|
|
|
1916
1906
|
|
|
1917
1907
|
[[package]]
|
|
1918
1908
|
name = "openssl-sys"
|
|
1919
|
-
version = "0.9.
|
|
1909
|
+
version = "0.9.115"
|
|
1920
1910
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1921
|
-
checksum = "
|
|
1911
|
+
checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781"
|
|
1922
1912
|
dependencies = [
|
|
1923
1913
|
"cc",
|
|
1924
1914
|
"libc",
|
|
@@ -2553,9 +2543,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
|
|
|
2553
2543
|
|
|
2554
2544
|
[[package]]
|
|
2555
2545
|
name = "rustls-webpki"
|
|
2556
|
-
version = "0.103.
|
|
2546
|
+
version = "0.103.13"
|
|
2557
2547
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2558
|
-
checksum = "
|
|
2548
|
+
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
|
|
2559
2549
|
dependencies = [
|
|
2560
2550
|
"aws-lc-rs",
|
|
2561
2551
|
"ring",
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
//! Background progress callbacks for upload commits and download groups.
|
|
2
|
+
//!
|
|
3
|
+
//! A dedicated thread polls Rust-side progress atomics and invokes a Python
|
|
4
|
+
//! callable via [`Python::try_attach`]. The poller sleeps on a condvar so
|
|
5
|
+
//! [`BackgroundProgress::stop_and_join`] can wake it immediately instead of
|
|
6
|
+
//! waiting for the full poll interval.
|
|
7
|
+
|
|
8
|
+
use std::collections::HashMap;
|
|
9
|
+
use std::sync::{Arc, Condvar, Mutex};
|
|
10
|
+
use std::thread::JoinHandle;
|
|
11
|
+
use std::time::Duration;
|
|
12
|
+
|
|
13
|
+
use pyo3::exceptions::PyRuntimeError;
|
|
14
|
+
use pyo3::prelude::*;
|
|
15
|
+
use xet_pkg::xet_session::{GroupProgressReport, ItemProgressReport, UniqueId};
|
|
16
|
+
|
|
17
|
+
fn lock_poisoned_err() -> PyErr {
|
|
18
|
+
PyRuntimeError::new_err("progress poller lock poisoned")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn poller_panicked_err() -> PyErr {
|
|
22
|
+
PyRuntimeError::new_err("progress poller thread panicked")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// Background thread that polls progress and invokes a Python callback.
|
|
26
|
+
pub(crate) struct BackgroundProgress {
|
|
27
|
+
/// ``false`` while the poller is running; set to ``true`` in ``stop_and_join``.
|
|
28
|
+
/// Paired with the condvar so setting shutdown wakes a thread blocked in
|
|
29
|
+
/// ``wait_timeout`` (the mutex is released for the duration of the wait).
|
|
30
|
+
wake: Arc<(Mutex<bool>, Condvar)>,
|
|
31
|
+
join: Mutex<Option<JoinHandle<PyResult<()>>>>,
|
|
32
|
+
callback: Py<PyAny>,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
impl BackgroundProgress {
|
|
36
|
+
/// Spawn a thread that calls ``snapshot`` every ``interval_ms`` until shutdown,
|
|
37
|
+
/// the snapshot reports a terminal task state, or the callback fails.
|
|
38
|
+
pub(crate) fn spawn<F>(py: Python<'_>, callback: Py<PyAny>, interval_ms: u64, mut snapshot: F) -> Self
|
|
39
|
+
where
|
|
40
|
+
F: FnMut() -> (GroupProgressReport, HashMap<UniqueId, ItemProgressReport>, bool) + Send + 'static,
|
|
41
|
+
{
|
|
42
|
+
let wake = Arc::new((Mutex::new(false), Condvar::new()));
|
|
43
|
+
let wake_for_thread = Arc::clone(&wake);
|
|
44
|
+
let callback_for_thread = callback.clone_ref(py);
|
|
45
|
+
let interval = Duration::from_millis(interval_ms);
|
|
46
|
+
|
|
47
|
+
let join = std::thread::spawn(move || {
|
|
48
|
+
progress_thread_loop(callback_for_thread, interval, &wake_for_thread, &mut snapshot)
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
Self {
|
|
52
|
+
wake,
|
|
53
|
+
join: Mutex::new(Some(join)),
|
|
54
|
+
callback,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// Request shutdown, wake the poller if it is sleeping, and block until the thread exits.
|
|
59
|
+
pub(crate) fn stop_and_join(&self) -> PyResult<()> {
|
|
60
|
+
{
|
|
61
|
+
let mut guard = self.wake.0.lock().map_err(|_| lock_poisoned_err())?;
|
|
62
|
+
*guard = true;
|
|
63
|
+
}
|
|
64
|
+
self.wake.1.notify_one();
|
|
65
|
+
let handle = self.join.lock().map_err(|_| lock_poisoned_err())?.take();
|
|
66
|
+
if let Some(handle) = handle {
|
|
67
|
+
match handle.join() {
|
|
68
|
+
Ok(result) => result,
|
|
69
|
+
Err(_) => Err(poller_panicked_err()),
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
Ok(())
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Stop the poller, then invoke the callback once on the calling thread (final snapshot).
|
|
77
|
+
pub(crate) fn stop_and_emit<F>(&self, py: Python<'_>, snapshot: F) -> PyResult<()>
|
|
78
|
+
where
|
|
79
|
+
F: FnOnce() -> (GroupProgressReport, HashMap<UniqueId, ItemProgressReport>),
|
|
80
|
+
{
|
|
81
|
+
self.stop_and_join()?;
|
|
82
|
+
let (group_report, item_reports) = snapshot();
|
|
83
|
+
self.callback.call1(py, (group_report, item_reports))?;
|
|
84
|
+
Ok(())
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fn progress_thread_loop<F>(
|
|
89
|
+
callback: Py<PyAny>,
|
|
90
|
+
interval: Duration,
|
|
91
|
+
wake: &Arc<(Mutex<bool>, Condvar)>,
|
|
92
|
+
snapshot: &mut F,
|
|
93
|
+
) -> PyResult<()>
|
|
94
|
+
where
|
|
95
|
+
F: FnMut() -> (GroupProgressReport, HashMap<UniqueId, ItemProgressReport>, bool),
|
|
96
|
+
{
|
|
97
|
+
loop {
|
|
98
|
+
// Sleep up to `interval`, but return promptly when stop_and_join sets shutdown and notifies.
|
|
99
|
+
let shutdown = {
|
|
100
|
+
let guard = wake.0.lock().map_err(|_| lock_poisoned_err())?;
|
|
101
|
+
let (guard, _) = wake.1.wait_timeout(guard, interval).map_err(|_| lock_poisoned_err())?;
|
|
102
|
+
*guard
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
if shutdown {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Mutex is not held across snapshot or the Python callback.
|
|
110
|
+
let (group_report, item_reports, is_terminal) = snapshot();
|
|
111
|
+
|
|
112
|
+
match Python::try_attach(|py| callback.call1(py, (group_report, item_reports))) {
|
|
113
|
+
None => break, // interpreter shutting down
|
|
114
|
+
Some(Ok(_)) => {},
|
|
115
|
+
Some(Err(e)) => {
|
|
116
|
+
let _ = Python::try_attach(|py| e.print(py));
|
|
117
|
+
break;
|
|
118
|
+
},
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if is_terminal {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
Ok(())
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#[cfg(test)]
|
|
129
|
+
mod tests {
|
|
130
|
+
use std::collections::HashMap;
|
|
131
|
+
use std::time::{Duration, Instant};
|
|
132
|
+
|
|
133
|
+
use pyo3::Python;
|
|
134
|
+
use pyo3::ffi::c_str;
|
|
135
|
+
use xet_pkg::xet_session::GroupProgressReport;
|
|
136
|
+
|
|
137
|
+
use super::*;
|
|
138
|
+
|
|
139
|
+
#[test]
|
|
140
|
+
fn stop_and_join_returns_before_poll_interval_elapses() {
|
|
141
|
+
/// Poll interval long enough that a blocking sleep would fail the test.
|
|
142
|
+
const LONG_INTERVAL_MS: u64 = 60_000;
|
|
143
|
+
const STOP_DEADLINE: Duration = Duration::from_secs(2);
|
|
144
|
+
|
|
145
|
+
Python::attach(|py| -> PyResult<()> {
|
|
146
|
+
py.run(c_str!("def _bg_progress_test_cb(_group, _items): pass"), None, None)?;
|
|
147
|
+
let callback: Py<PyAny> = py.eval(c_str!("_bg_progress_test_cb"), None, None)?.unbind();
|
|
148
|
+
|
|
149
|
+
let progress = BackgroundProgress::spawn(py, callback, LONG_INTERVAL_MS, || {
|
|
150
|
+
(GroupProgressReport::default(), HashMap::new(), false)
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Let the poller enter its timed wait on the condvar.
|
|
154
|
+
std::thread::sleep(Duration::from_millis(50));
|
|
155
|
+
|
|
156
|
+
let start = Instant::now();
|
|
157
|
+
progress.stop_and_join()?;
|
|
158
|
+
let elapsed = start.elapsed();
|
|
159
|
+
|
|
160
|
+
assert!(
|
|
161
|
+
elapsed < STOP_DEADLINE,
|
|
162
|
+
"stop_and_join took {elapsed:?}; expected prompt return (poll interval is {LONG_INTERVAL_MS}ms)"
|
|
163
|
+
);
|
|
164
|
+
Ok(())
|
|
165
|
+
})
|
|
166
|
+
.unwrap();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
use std::collections::HashMap;
|
|
2
2
|
use std::sync::{Arc, RwLock};
|
|
3
|
-
use std::time::Duration;
|
|
4
3
|
|
|
5
4
|
use pyo3::prelude::*;
|
|
6
5
|
use xet_pkg::xet_session::{
|
|
@@ -8,11 +7,22 @@ use xet_pkg::xet_session::{
|
|
|
8
7
|
XetFileInfo, XetSession, XetTaskState,
|
|
9
8
|
};
|
|
10
9
|
|
|
10
|
+
use crate::background_progress::BackgroundProgress;
|
|
11
11
|
use crate::headers::{build_header_map, build_headers_with_user_agent};
|
|
12
12
|
use crate::py_file_download_handle::PyXetFileDownload;
|
|
13
13
|
use crate::utils::{progress_display, task_state_display, task_state_to_pystate};
|
|
14
14
|
use crate::{PyXetTaskState, blocking_call_with_signal_check, convert_xet_error};
|
|
15
15
|
|
|
16
|
+
#[inline]
|
|
17
|
+
fn item_reports_from_download_handles(
|
|
18
|
+
handles: &Arc<RwLock<Vec<XetFileDownload>>>,
|
|
19
|
+
) -> HashMap<UniqueId, ItemProgressReport> {
|
|
20
|
+
handles
|
|
21
|
+
.read()
|
|
22
|
+
.map(|g| g.iter().filter_map(|h| h.progress().map(|p| (h.task_id(), p))).collect())
|
|
23
|
+
.unwrap_or_default()
|
|
24
|
+
}
|
|
25
|
+
|
|
16
26
|
// ── build_file_download_group ─────────────────────────────────────────────────
|
|
17
27
|
|
|
18
28
|
/// Create an :class:`XetFileDownloadGroup` from a session and optional configuration.
|
|
@@ -51,38 +61,24 @@ pub(crate) fn build_file_download_group(
|
|
|
51
61
|
.map_err(convert_xet_error)
|
|
52
62
|
})?;
|
|
53
63
|
|
|
54
|
-
let download_handles = if let Some(callback) = progress_callback {
|
|
64
|
+
let (download_handles, progress) = if let Some(callback) = progress_callback {
|
|
55
65
|
let handles: Arc<RwLock<Vec<XetFileDownload>>> = Arc::new(RwLock::new(Vec::new()));
|
|
56
66
|
let inner = group.clone();
|
|
57
67
|
let handles_for_thread = Arc::clone(&handles);
|
|
58
|
-
let
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
let is_terminal = !matches!(inner.status(), Ok(XetTaskState::Running) | Ok(XetTaskState::Finalizing));
|
|
63
|
-
let group_report = inner.progress();
|
|
64
|
-
let item_reports: HashMap<UniqueId, ItemProgressReport> = handles_for_thread
|
|
65
|
-
.read()
|
|
66
|
-
.map(|g| g.iter().filter_map(|h| h.progress().map(|p| (h.task_id(), p))).collect())
|
|
67
|
-
.unwrap_or_default();
|
|
68
|
-
let result = Python::attach(|py| callback.call1(py, (group_report, item_reports)));
|
|
69
|
-
if let Err(e) = result {
|
|
70
|
-
Python::attach(|py| e.print(py));
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
if is_terminal {
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
68
|
+
let progress = BackgroundProgress::spawn(py, callback, progress_interval_ms, move || {
|
|
69
|
+
let is_terminal = !matches!(inner.status(), Ok(XetTaskState::Running) | Ok(XetTaskState::Finalizing));
|
|
70
|
+
let item_reports = item_reports_from_download_handles(&handles_for_thread);
|
|
71
|
+
(inner.progress(), item_reports, is_terminal)
|
|
77
72
|
});
|
|
78
|
-
Some(handles)
|
|
73
|
+
(Some(handles), Some(progress))
|
|
79
74
|
} else {
|
|
80
|
-
None
|
|
75
|
+
(None, None)
|
|
81
76
|
};
|
|
82
77
|
|
|
83
78
|
Ok(PyXetFileDownloadGroup {
|
|
84
79
|
inner: group,
|
|
85
80
|
download_handles,
|
|
81
|
+
progress,
|
|
86
82
|
})
|
|
87
83
|
}
|
|
88
84
|
|
|
@@ -103,6 +99,9 @@ pub struct PyXetFileDownloadGroup {
|
|
|
103
99
|
pub(crate) inner: XetFileDownloadGroup,
|
|
104
100
|
/// Per-file handles shared with the progress thread; None when no callback was registered.
|
|
105
101
|
download_handles: Option<Arc<RwLock<Vec<XetFileDownload>>>>,
|
|
102
|
+
/// Background thread that polls progress and invokes the Python callback; None when no
|
|
103
|
+
/// callback was registered. Stopped and joined from ``wait_to_finish`` and ``abort``.
|
|
104
|
+
progress: Option<BackgroundProgress>,
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
#[pymethods]
|
|
@@ -144,7 +143,7 @@ impl PyXetFileDownloadGroup {
|
|
|
144
143
|
// Normal exit: wait for all downloads (signal-interruptible).
|
|
145
144
|
self.wait_to_finish(py)?;
|
|
146
145
|
} else {
|
|
147
|
-
if let Err(e) = self.
|
|
146
|
+
if let Err(e) = self.abort() {
|
|
148
147
|
tracing::warn!("abort() failed during __exit__ exception path: {e}");
|
|
149
148
|
}
|
|
150
149
|
}
|
|
@@ -188,13 +187,27 @@ impl PyXetFileDownloadGroup {
|
|
|
188
187
|
///
|
|
189
188
|
/// Releases the GIL while waiting, polling for ``KeyboardInterrupt`` every
|
|
190
189
|
/// 100 ms so that Ctrl-C is delivered promptly.
|
|
190
|
+
///
|
|
191
|
+
/// When a progress callback was registered, it is invoked once more on the
|
|
192
|
+
/// calling thread with the final snapshot after all work completes.
|
|
191
193
|
pub fn wait_to_finish(&self, py: Python<'_>) -> PyResult<XetDownloadGroupReport> {
|
|
192
194
|
let group = self.inner.clone();
|
|
193
|
-
blocking_call_with_signal_check(py, move || group.finish_blocking())
|
|
195
|
+
let result = blocking_call_with_signal_check(py, move || group.finish_blocking());
|
|
196
|
+
if let (Some(handles), Some(progress)) = (&self.download_handles, &self.progress) {
|
|
197
|
+
// ignore any error from progress update
|
|
198
|
+
let _ = progress.stop_and_emit(py, || {
|
|
199
|
+
let item_reports = item_reports_from_download_handles(handles);
|
|
200
|
+
(self.inner.progress(), item_reports)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
result
|
|
194
204
|
}
|
|
195
205
|
|
|
196
206
|
/// Cancel all active downloads in this group.
|
|
197
207
|
pub fn abort(&self) -> PyResult<()> {
|
|
208
|
+
if let Some(progress) = &self.progress {
|
|
209
|
+
progress.stop_and_join()?;
|
|
210
|
+
}
|
|
198
211
|
self.inner.abort().map_err(convert_xet_error)
|
|
199
212
|
}
|
|
200
213
|
|
|
@@ -236,6 +249,7 @@ mod tests {
|
|
|
236
249
|
.build_blocking()
|
|
237
250
|
.unwrap(),
|
|
238
251
|
download_handles: None,
|
|
252
|
+
progress: None,
|
|
239
253
|
};
|
|
240
254
|
|
|
241
255
|
Python::attach(|py| {
|
|
@@ -257,6 +271,7 @@ mod tests {
|
|
|
257
271
|
.build_blocking()
|
|
258
272
|
.unwrap(),
|
|
259
273
|
download_handles: None,
|
|
274
|
+
progress: None,
|
|
260
275
|
};
|
|
261
276
|
|
|
262
277
|
Python::attach(|py| {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
use std::collections::HashMap;
|
|
2
2
|
use std::sync::{Arc, RwLock};
|
|
3
|
-
use std::time::Duration;
|
|
4
3
|
|
|
5
4
|
use pyo3::prelude::*;
|
|
6
5
|
use xet_pkg::xet_session::{
|
|
@@ -62,12 +61,23 @@ fn parse_sha256(py: Python<'_>, sha256: Option<Py<PyAny>>) -> PyResult<Sha256Pol
|
|
|
62
61
|
}
|
|
63
62
|
}
|
|
64
63
|
|
|
64
|
+
use crate::background_progress::BackgroundProgress;
|
|
65
65
|
use crate::headers::{build_header_map, build_headers_with_user_agent};
|
|
66
66
|
use crate::py_file_upload_handle::PyXetFileUpload;
|
|
67
67
|
use crate::py_stream_upload_handle::PyXetStreamUpload;
|
|
68
68
|
use crate::utils::{progress_display, task_state_display, task_state_to_pystate};
|
|
69
69
|
use crate::{PyXetTaskState, blocking_call_with_signal_check, convert_xet_error};
|
|
70
70
|
|
|
71
|
+
#[inline]
|
|
72
|
+
fn item_reports_from_upload_handles(
|
|
73
|
+
handles: &Arc<RwLock<Vec<XetFileUpload>>>,
|
|
74
|
+
) -> HashMap<UniqueId, ItemProgressReport> {
|
|
75
|
+
handles
|
|
76
|
+
.read()
|
|
77
|
+
.map(|g| g.iter().filter_map(|h| h.progress().map(|p| (h.task_id(), p))).collect())
|
|
78
|
+
.unwrap_or_default()
|
|
79
|
+
}
|
|
80
|
+
|
|
71
81
|
// ── build_upload_commit ───────────────────────────────────────────────────────
|
|
72
82
|
|
|
73
83
|
/// Create an :class:`XetUploadCommit` from a session and optional configuration.
|
|
@@ -106,38 +116,24 @@ pub(crate) fn build_upload_commit(
|
|
|
106
116
|
.map_err(convert_xet_error)
|
|
107
117
|
})?;
|
|
108
118
|
|
|
109
|
-
let upload_handles = if let Some(callback) = progress_callback {
|
|
119
|
+
let (upload_handles, background_progress) = if let Some(callback) = progress_callback {
|
|
110
120
|
let handles: Arc<RwLock<Vec<XetFileUpload>>> = Arc::new(RwLock::new(Vec::new()));
|
|
111
121
|
let inner = commit.clone();
|
|
112
122
|
let handles_for_thread = handles.clone();
|
|
113
|
-
let
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
let is_terminal = !matches!(inner.status(), Ok(XetTaskState::Running) | Ok(XetTaskState::Finalizing));
|
|
118
|
-
let group_report = inner.progress();
|
|
119
|
-
let item_reports: HashMap<UniqueId, ItemProgressReport> = handles_for_thread
|
|
120
|
-
.read()
|
|
121
|
-
.map(|g| g.iter().filter_map(|h| h.progress().map(|p| (h.task_id(), p))).collect())
|
|
122
|
-
.unwrap_or_default();
|
|
123
|
-
let result = Python::attach(|py| callback.call1(py, (group_report, item_reports)));
|
|
124
|
-
if let Err(e) = result {
|
|
125
|
-
Python::attach(|py| e.print(py));
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
if is_terminal {
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
123
|
+
let background_progress = BackgroundProgress::spawn(py, callback, progress_interval_ms, move || {
|
|
124
|
+
let is_terminal = !matches!(inner.status(), Ok(XetTaskState::Running) | Ok(XetTaskState::Finalizing));
|
|
125
|
+
let item_reports = item_reports_from_upload_handles(&handles_for_thread);
|
|
126
|
+
(inner.progress(), item_reports, is_terminal)
|
|
132
127
|
});
|
|
133
|
-
Some(handles)
|
|
128
|
+
(Some(handles), Some(background_progress))
|
|
134
129
|
} else {
|
|
135
|
-
None
|
|
130
|
+
(None, None)
|
|
136
131
|
};
|
|
137
132
|
|
|
138
133
|
Ok(PyXetUploadCommit {
|
|
139
134
|
inner: commit,
|
|
140
135
|
upload_handles,
|
|
136
|
+
background_progress,
|
|
141
137
|
})
|
|
142
138
|
}
|
|
143
139
|
|
|
@@ -158,6 +154,9 @@ pub struct PyXetUploadCommit {
|
|
|
158
154
|
pub(crate) inner: XetUploadCommit,
|
|
159
155
|
/// Per-file handles shared with the progress thread; None when no callback was registered.
|
|
160
156
|
upload_handles: Option<Arc<RwLock<Vec<XetFileUpload>>>>,
|
|
157
|
+
/// Background thread that polls progress and invokes the Python callback; None when no
|
|
158
|
+
/// callback was registered. Stopped and joined from ``wait_to_finish`` and ``abort``.
|
|
159
|
+
background_progress: Option<BackgroundProgress>,
|
|
161
160
|
}
|
|
162
161
|
|
|
163
162
|
#[pymethods]
|
|
@@ -205,7 +204,7 @@ impl PyXetUploadCommit {
|
|
|
205
204
|
self.wait_to_finish(py)?;
|
|
206
205
|
} else {
|
|
207
206
|
// Exception: cancel uploads.
|
|
208
|
-
if let Err(e) = self.
|
|
207
|
+
if let Err(e) = self.abort() {
|
|
209
208
|
tracing::warn!("abort() failed during __exit__ exception path: {e}");
|
|
210
209
|
}
|
|
211
210
|
}
|
|
@@ -308,13 +307,27 @@ impl PyXetUploadCommit {
|
|
|
308
307
|
///
|
|
309
308
|
/// Releases the GIL while waiting, polling for ``KeyboardInterrupt`` every
|
|
310
309
|
/// 100 ms so that Ctrl-C is delivered promptly.
|
|
310
|
+
///
|
|
311
|
+
/// When a progress callback was registered, it is invoked once more on the
|
|
312
|
+
/// calling thread with the final snapshot after all work completes.
|
|
311
313
|
pub fn wait_to_finish(&self, py: Python<'_>) -> PyResult<XetCommitReport> {
|
|
312
314
|
let inner = self.inner.clone();
|
|
313
|
-
blocking_call_with_signal_check(py, move || inner.commit_blocking())
|
|
315
|
+
let result = blocking_call_with_signal_check(py, move || inner.commit_blocking());
|
|
316
|
+
if let (Some(handles), Some(progress)) = (&self.upload_handles, &self.background_progress) {
|
|
317
|
+
// ignore any error from progress update
|
|
318
|
+
let _ = progress.stop_and_emit(py, || {
|
|
319
|
+
let item_reports = item_reports_from_upload_handles(handles);
|
|
320
|
+
(self.inner.progress(), item_reports)
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
result
|
|
314
324
|
}
|
|
315
325
|
|
|
316
326
|
/// Cancel all active uploads in this commit.
|
|
317
327
|
pub fn abort(&self) -> PyResult<()> {
|
|
328
|
+
if let Some(progress) = &self.background_progress {
|
|
329
|
+
progress.stop_and_join()?;
|
|
330
|
+
}
|
|
318
331
|
self.inner.abort().map_err(convert_xet_error)
|
|
319
332
|
}
|
|
320
333
|
|
|
@@ -408,6 +421,7 @@ mod tests {
|
|
|
408
421
|
.build_blocking()
|
|
409
422
|
.unwrap(),
|
|
410
423
|
upload_handles: None,
|
|
424
|
+
background_progress: None,
|
|
411
425
|
};
|
|
412
426
|
|
|
413
427
|
Python::attach(|py| {
|
|
@@ -437,6 +451,7 @@ mod tests {
|
|
|
437
451
|
.build_blocking()
|
|
438
452
|
.unwrap(),
|
|
439
453
|
upload_handles: None,
|
|
454
|
+
background_progress: None,
|
|
440
455
|
};
|
|
441
456
|
|
|
442
457
|
Python::attach(|py| {
|