Skip to content

Commit

Permalink
fix: limit concurrency, display better curl errors, ignore dependenci…
Browse files Browse the repository at this point in the history
…es from `"."` member (#19)

* fix: don't unwrap + show more detailed error

* fix: ignore exploration of deps if workspace member is itself or "."

* chore: restrict to at most 5 concurrent request per workspace

* chore: address clippy lints
  • Loading branch information
BenJeau authored Feb 15, 2025
1 parent dc0111d commit 7ada54d
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 11 deletions.
12 changes: 5 additions & 7 deletions src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,11 @@ pub fn get_latest_version(

{
let mut transfer = handle.transfer();
transfer
.write_function(|data| {
body.extend_from_slice(data);
Ok(data.len())
})
.unwrap();
transfer.perform().unwrap();
transfer.write_function(|data| {
body.extend_from_slice(data);
Ok(data.len())
})?;
transfer.perform()?;
}

let response = if body.is_empty() {
Expand Down
32 changes: 28 additions & 4 deletions src/cargo.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use cargo_lock::Lockfile;
use semver::{Version, VersionReq};
use std::sync::{Arc, Mutex};
use std::{collections::HashMap, env::current_dir};
use toml_edit::{DocumentMut, Item, Value};

Expand All @@ -24,10 +25,11 @@ impl CargoDependency {
) -> Option<Dependency> {
let parsed_current_version_req = VersionReq::parse(&self.version).ok()?;

let response = api::get_latest_version(self).expect("Unable to reach crates.io")?;
let response = api::get_latest_version(self)
.unwrap_or_else(|_| panic!("Unable to reach crates.io for {}", self.name))?;

let parsed_latest_version =
Version::parse(&response.latest_version).expect("Latest version is not a valid semver");
let parsed_latest_version = Version::parse(&response.latest_version)
.unwrap_or_else(|_| panic!("Latest version is not a valid semver for {}", self.name));

if !parsed_current_version_req.matches(&parsed_latest_version) {
Some(Dependency {
Expand Down Expand Up @@ -87,6 +89,7 @@ impl CargoDependencies {
let mut direct_dependencies_threads = Vec::new();
let mut workspace_member_threads = Vec::new();
let mut cargo_toml_files = HashMap::new();
let active_requests = Arc::new(Mutex::new(0));

cargo_toml_files.insert(
workspace_path.clone().unwrap_or_else(|| ".".to_string()),
Expand All @@ -96,8 +99,25 @@ impl CargoDependencies {
let dependency = dependency.clone();
let package_name = self.package_name.to_string();
let workspace_path = workspace_path.clone();
let active_requests = active_requests.clone();

direct_dependencies_threads.push(std::thread::spawn(move || {
dependency.get_latest_version_wrapper(Some(package_name), workspace_path)
loop {
let mut count = active_requests.lock().unwrap();
if *count < 5 {
*count += 1;
break;
}
drop(count);
std::thread::sleep(std::time::Duration::from_millis(10));
}

let result =
dependency.get_latest_version_wrapper(Some(package_name), workspace_path);

*active_requests.lock().unwrap() -= 1;

result
}));
}

Expand Down Expand Up @@ -325,6 +345,10 @@ fn get_workspace_members(
return acc;
};

if member == "." {
return acc;
}

acc.insert(
member.to_string(),
Box::new(CargoDependencies::gather_dependencies_inner(
Expand Down

0 comments on commit 7ada54d

Please sign in to comment.