diff options
-rw-r--r-- | crates_io_client/src/lib_crates_io_client.rs | 19 | ||||
-rw-r--r-- | kitchen_sink/src/lib_kitchen_sink.rs | 51 | ||||
-rw-r--r-- | rich_crate/src/rich_crate.rs | 1 |
3 files changed, 25 insertions, 46 deletions
diff --git a/crates_io_client/src/lib_crates_io_client.rs b/crates_io_client/src/lib_crates_io_client.rs index 9a83d4e..e7e582d 100644 --- a/crates_io_client/src/lib_crates_io_client.rs +++ b/crates_io_client/src/lib_crates_io_client.rs @@ -28,12 +28,6 @@ macro_rules! cioopt { }; } -#[derive(Debug)] -pub struct CratesIoCrate { - pub meta: CrateMetaFile, - pub owners: Vec<CrateOwner>, -} - impl CratesIoClient { pub fn new(cache_base_path: &Path) -> Result<Self, Error> { Ok(Self { @@ -71,19 +65,6 @@ impl CratesIoClient { self.crates.get_cached((&key, version), &url).await } - pub async fn krate(&self, crate_name: &str, cache_buster: &str) -> Result<Option<CratesIoCrate>, Error> { - let (meta, owners) = futures::join!( - self.crate_meta(crate_name, cache_buster), - self.crate_owners(crate_name, cache_buster)); - let meta = cioopt!(meta?); - let owners = cioopt!(owners?); - - Ok(Some(CratesIoCrate { - meta, - owners, - })) - } - pub async fn crate_meta(&self, crate_name: &str, as_of_version: &str) -> Result<Option<CrateMetaFile>, Error> { self.get_json((crate_name, as_of_version), encode(crate_name)).await } diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index ce480f7..eb13a9d 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -20,10 +20,10 @@ pub use crate::ctrlcbreak::*; pub use crate_db::builddb::Compat; pub use crate_db::builddb::CompatibilityInfo; pub use crates_index::Crate as CratesIndexCrate; +use crates_io_client::CrateMetaFile; pub use crates_io_client::CrateDepKind; pub use crates_io_client::CrateDependency; pub use crates_io_client::CrateMetaVersion; -pub use crates_io_client::CratesIoCrate; pub use crates_io_client::OwnerKind; pub use github_info::User; pub use github_info::UserOrg; @@ -402,14 +402,17 @@ impl KitchenSink { if stopped() {Err(KitchenSinkErr::Stopped)?;} match origin { Origin::CratesIo(name) => { - let meta = self.crates_io_meta(name).await?; - let versions = meta.meta.versions().map(|c| CrateVersion { + let (meta, owners) = futures::try_join!( + self.crates_io_meta(name), + self.crate_owners(origin), + )?; + let versions = meta.versions().map(|c| CrateVersion { num: c.num, updated_at: c.updated_at, created_at: c.created_at, yanked: c.yanked, }).collect(); - Ok(RichCrate::new(origin.clone(), meta.owners, meta.meta.krate.name, versions)) + Ok(RichCrate::new(origin.clone(), owners, meta.krate.name, versions)) }, Origin::GitHub { repo, package } => { let host = RepoHost::GitHub(repo.clone()).try_into().map_err(|_| KitchenSinkErr::CrateNotFound(origin.clone())).context("ghrepo host bad")?; @@ -540,26 +543,26 @@ impl KitchenSink { Ok(match origin { Origin::CratesIo(name) => { let meta = self.crates_io_meta(name).await?; - meta.meta.krate.recent_downloads + meta.krate.recent_downloads }, _ => None, }) } - async fn crates_io_meta(&self, name: &str) -> CResult<CratesIoCrate> { + async fn crates_io_meta(&self, name: &str) -> CResult<CrateMetaFile> { let krate = tokio::task::block_in_place(|| { self.index.crates_io_crate_by_lowercase_name(name).context("rich_crate") })?; let latest_in_index = krate.latest_version().version(); // most recently published version - let meta = self.crates_io.krate(name, latest_in_index).await + let meta = self.crates_io.crate_meta(name, latest_in_index).await .with_context(|_| format!("crates.io meta for {} {}", name, latest_in_index))?; let mut meta = meta.ok_or_else(|| KitchenSinkErr::CrateNotFound(Origin::from_crates_io_name(name)))?; - if !meta.meta.versions.iter().any(|v| v.num == latest_in_index) { + if !meta.versions.iter().any(|v| v.num == latest_in_index) { eprintln!("Crate data missing latest version {}@{}", name, latest_in_index); - meta = self.crates_io.krate(name, &format!("{}-try-again", latest_in_index)).await? + meta = self.crates_io.crate_meta(name, &format!("{}-try-again", latest_in_index)).await? .ok_or_else(|| KitchenSinkErr::CrateNotFound(Origin::from_crates_io_name(name)))?; - if !meta.meta.versions.iter().any(|v| v.num == latest_in_index) { - eprintln!("Error: crate data is borked {}@{}. Has only: {:?}", name, latest_in_index, meta.meta.versions.iter().map(|v| &v.num).collect::<Vec<_>>()); + if !meta.versions.iter().any(|v| v.num == latest_in_index) { + eprintln!("Error: crate data is borked {}@{}. Has only: {:?}", name, latest_in_index, meta.versions.iter().map(|v| &v.num).collect::<Vec<_>>()); } } Ok(meta) @@ -660,7 +663,7 @@ impl KitchenSink { })?.await } - pub async fn tarball(&self, name: &str, ver: &str) -> CResult<Vec<u8>> { + async fn tarball(&self, name: &str, ver: &str) -> CResult<Vec<u8>> { let tarball = self.crates_io.crate_data(name, ver).await .context("crate_file")? .ok_or_else(|| KitchenSinkErr::DataNotFound(format!("{}-{}", name, ver)))?; @@ -679,7 +682,7 @@ impl KitchenSink { self.tarball(name, ver), self.crates_io_meta(&name_lower)); - let crates_io_meta = crates_io_meta?.meta.krate; + let crates_io_krate = crates_io_meta?.krate; let crate_tarball = crate_tarball?; let crate_compressed_size = crate_tarball.len(); let mut meta = tokio::task::block_in_place(|| { @@ -691,12 +694,12 @@ impl KitchenSink { // it may contain data from nowhere! https://github.com/rust-lang/crates.io/issues/1624 if package.homepage.is_none() { - if let Some(repo) = crates_io_meta.homepage { + if let Some(repo) = crates_io_krate.homepage { package.homepage = Some(repo); } } if package.documentation.is_none() { - if let Some(repo) = crates_io_meta.documentation { + if let Some(repo) = crates_io_krate.documentation { package.documentation = Some(repo); } } @@ -725,7 +728,7 @@ impl KitchenSink { if package.repository.is_none() { warnings.insert(Warning::NoRepositoryProperty); // it may contain data from nowhere! https://github.com/rust-lang/crates.io/issues/1624 - if let Some(repo) = crates_io_meta.repository { + if let Some(repo) = crates_io_krate.repository { package.repository = Some(repo); } else { if package.homepage.as_ref().map_or(false, |h| Repo::looks_like_repo_url(h)) { @@ -1502,7 +1505,7 @@ impl KitchenSink { /// Merge authors, owners, contributors pub async fn all_contributors<'a>(&self, krate: &'a RichCrateVersion) -> CResult<(Vec<CrateAuthor<'a>>, Vec<CrateAuthor<'a>>, bool, usize)> { - let owners = self.crate_owners(krate).await?; + let owners = self.crate_owners(krate.origin()).await?; let (hit_max_contributor_count, mut contributors_by_login) = match krate.repository().as_ref() { // Only get contributors from github if the crate has been found in the repo, @@ -1717,13 +1720,13 @@ impl KitchenSink { Err(KitchenSinkErr::OwnerWithoutLogin)? } - async fn crate_owners(&self, krate: &RichCrateVersion) -> CResult<Vec<CrateOwner>> { - match krate.origin() { + async fn crate_owners(&self, origin: &Origin) -> CResult<Vec<CrateOwner>> { + match origin { Origin::CratesIo(name) => { - if let Some(o) = self.crates_io_owners_cache.get(krate.name())? { + if let Some(o) = self.crates_io_owners_cache.get(name)? { return Ok(o); } - self.crates_io_crate_owners(name, krate.version()).await + Ok(self.crates_io.crate_owners(name, "fallback").await?.unwrap_or_default()) }, Origin::GitLab {..} => Ok(vec![]), Origin::GitHub {repo, ..} => Ok(vec![ @@ -1745,10 +1748,6 @@ impl KitchenSink { } } - pub async fn crates_io_crate_owners(&self, crate_name: &str, version: &str) -> CResult<Vec<CrateOwner>> { - Ok(self.crates_io.crate_owners(crate_name, version).await.context("crate_owners")?.unwrap_or_default()) - } - pub fn set_crates_io_crate_owners(&self, crate_name: &str, owners: Vec<CrateOwner>) -> Result<(), ()> { self.crates_io_owners_cache.set(crate_name, owners).map_err(drop) } @@ -1803,7 +1802,7 @@ impl KitchenSink { if c.is_yanked() { return None; } - Some((o, score, self.crate_owners(&c).await.unwrap_or_default(), c.keywords().to_owned())) + Some((o, score, self.crate_owners(c.origin()).await.unwrap_or_default(), c.keywords().to_owned())) }) .collect::<Vec<_>>().await; diff --git a/rich_crate/src/rich_crate.rs b/rich_crate/src/rich_crate.rs index 1dd3b32..2b1f5c8 100644 --- a/rich_crate/src/rich_crate.rs +++ b/rich_crate/src/rich_crate.rs @@ -8,7 +8,6 @@ pub use crates_io_client::CrateOwner; #[derive(Debug)] pub struct RichCrate { origin: Origin, - // crates_io: CratesIoCrate, name: String, owners: Vec<CrateOwner>, versions: Vec<CrateVersion>, |