From b304ac3994d54b46366fe5d1511a3dd23ba69049 Mon Sep 17 00:00:00 2001 From: Max Howell Date: Sat, 25 Jan 2025 10:08:19 -0500 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20absorb=20these=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/lib/src/cellar.rs | 36 ++++++++++++++++++++---------------- crates/lib/src/resolve.rs | 4 ++-- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/crates/lib/src/cellar.rs b/crates/lib/src/cellar.rs index 658df3d64..91ffb8c74 100644 --- a/crates/lib/src/cellar.rs +++ b/crates/lib/src/cellar.rs @@ -8,8 +8,19 @@ use tokio::fs; pub async fn ls(project: &str, config: &Config) -> Result, Box> { let d = config.pkgx_dir.join(project); - if !fs::metadata(&d).await?.is_dir() { - return Ok(vec![]); + match fs::metadata(&d).await { + Ok(metadata) => { + if !metadata.is_dir() { + return Err(format!("err: expected directory: {:?}", d).into()); + } + } + Err(e) => { + if e.kind() == std::io::ErrorKind::NotFound { + return Ok(vec![]); + } else { + return Err(e.into()); + } + } } let mut rv = vec![]; @@ -39,23 +50,16 @@ pub async fn ls(project: &str, config: &Config) -> Result, Box Ok(rv) } -pub async fn resolve(pkgreq: &PackageReq, config: &Config) -> Result> { - let installations = ls(&pkgreq.project, config).await?; - - if let Some(i) = installations +pub async fn resolve( + pkgreq: &PackageReq, + config: &Config, +) -> Result, Box> { + Ok(ls(&pkgreq.project, config) + .await? .iter() .filter(|i| pkgreq.constraint.satisfies(&i.pkg.version)) .max_by_key(|i| i.pkg.version.clone()) - { - Ok(i.clone()) - } else { - // If no matching version is found, return an error - Err(format!("couldn’t resolve {:?}", pkgreq).into()) - } -} - -pub async fn has(pkg: &PackageReq, config: &Config) -> Option { - resolve(pkg, config).await.ok() + .cloned()) } pub fn dst(pkg: &Package, config: &Config) -> PathBuf { diff --git a/crates/lib/src/resolve.rs b/crates/lib/src/resolve.rs index fc49e6843..8351649b4 100644 --- a/crates/lib/src/resolve.rs +++ b/crates/lib/src/resolve.rs @@ -26,12 +26,12 @@ pub async fn resolve(reqs: Vec, config: &Config) -> Result>(( Some((installation.clone(), installation.pkg.clone())), None, )) - } else if let Ok(Some(version)) = inventory::select(&req, config).await { + } else if let Some(version) = inventory::select(&req, config).await? { let pkg = Package { project: req.project.clone(), version,