From 9f0d210021c54f63c9984446862b6ec68834bc63 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 22 Feb 2026 11:07:42 +0900 Subject: refactor(async): migrate from blocking HTTP to async/await with tokio Replace reqwest::blocking with async reqwest across the entire codebase. All command execute functions, registry API calls (packagist, downloader, resolver, lockfile), and the main entry point now use async/await with the tokio runtime. The pubgrub resolver runs on spawn_blocking since its DependencyProvider trait is synchronous, using Handle::block_on for async I/O within that context. Co-Authored-By: Claude Opus 4.6 --- crates/mozart-registry/src/lockfile.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'crates/mozart-registry/src/lockfile.rs') diff --git a/crates/mozart-registry/src/lockfile.rs b/crates/mozart-registry/src/lockfile.rs index 16337c4..9064109 100644 --- a/crates/mozart-registry/src/lockfile.rs +++ b/crates/mozart-registry/src/lockfile.rs @@ -392,11 +392,12 @@ fn extract_platform_requirements(requirements: &BTreeMap) -> ser /// 2. Separates packages into production vs dev-only /// 3. Computes the content-hash /// 4. Assembles the complete `LockFile` struct -pub fn generate_lock_file(request: &LockFileGenerationRequest) -> anyhow::Result { +pub async fn generate_lock_file(request: &LockFileGenerationRequest) -> anyhow::Result { // 1. Fetch full metadata for all resolved packages let mut package_metadata: HashMap = HashMap::new(); for pkg in &request.resolved_packages { - let versions = packagist::fetch_package_versions(&pkg.name, request.repo_cache.as_ref())?; + let versions = + packagist::fetch_package_versions(&pkg.name, request.repo_cache.as_ref()).await?; // Find the exact version matching pkg.version_normalized let matching = versions .into_iter() @@ -913,8 +914,8 @@ mod tests { assert_eq!(platform, serde_json::json!({})); } - #[test] - fn test_generate_lock_file_minimal() { + #[tokio::test] + async fn test_generate_lock_file_minimal() { let composer_json_content = r#"{"name": "test/project", "require": {"php": ">=8.1"}}"#.to_string(); let composer_json: RawPackageData = serde_json::from_str(&composer_json_content).unwrap(); @@ -927,7 +928,7 @@ mod tests { repo_cache: None, }; - let lock = generate_lock_file(&request).unwrap(); + let lock = generate_lock_file(&request).await.unwrap(); assert_eq!(lock.packages.len(), 0); assert_eq!(lock.packages_dev.as_ref().unwrap().len(), 0); @@ -1009,9 +1010,9 @@ mod tests { assert_eq!(packages[1].name, "vendor/zebra"); } - #[test] + #[tokio::test] #[ignore] - fn test_generate_lock_file_monolog() { + async fn test_generate_lock_file_monolog() { use crate::resolver::PlatformConfig; use crate::resolver::{ResolveRequest, resolve}; use mozart_core::package::Stability; @@ -1031,7 +1032,9 @@ mod tests { repo_cache: None, }; - let resolved = resolve(&resolve_request).expect("Resolution should succeed"); + let resolved = resolve(&resolve_request) + .await + .expect("Resolution should succeed"); assert!(!resolved.is_empty()); let composer_json_content = @@ -1046,7 +1049,9 @@ mod tests { repo_cache: None, }; - let lock = generate_lock_file(&gen_request).expect("Lock file generation should succeed"); + let lock = generate_lock_file(&gen_request) + .await + .expect("Lock file generation should succeed"); // Verify monolog is in packages assert!( -- cgit v1.3.1