Skip to content

Commit

Permalink
Optimize applying PkgOverrides into PkgMeta (rust-lang#429)
Browse files Browse the repository at this point in the history
* Refactor: Rm `PkgMeta::clone_without_overrides`
* Impl new fn `PkgMeta::merge_overrides` to avoid unnecessary clone

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
  • Loading branch information
NobodyXu committed Sep 26, 2022
1 parent 417143e commit b8d2184
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 17 deletions.
40 changes: 30 additions & 10 deletions crates/binstalk/src/manifests/cargo_toml_binstall.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,6 @@ pub struct PkgMeta {
}

impl PkgMeta {
pub fn clone_without_overrides(&self) -> Self {
Self {
pkg_url: self.pkg_url.clone(),
pkg_fmt: self.pkg_fmt,
bin_dir: self.bin_dir.clone(),
pub_key: self.pub_key.clone(),
overrides: BTreeMap::new(),
}
}

/// Merge configuration overrides into object
pub fn merge(&mut self, pkg_override: &PkgOverride) {
if let Some(o) = &pkg_override.pkg_url {
Expand All @@ -65,6 +55,36 @@ impl PkgMeta {
self.bin_dir = Some(o.clone());
}
}

/// Merge configuration overrides into object
///
/// * `pkg_overrides` - ordered in preference
pub fn merge_overrides<'a, It>(&self, pkg_overrides: It) -> Self
where
It: IntoIterator<Item = &'a PkgOverride> + Clone,
{
Self {
pkg_url: pkg_overrides
.clone()
.into_iter()
.find_map(|pkg_override| pkg_override.pkg_url.clone())
.or_else(|| self.pkg_url.clone()),

pkg_fmt: pkg_overrides
.clone()
.into_iter()
.find_map(|pkg_override| pkg_override.pkg_fmt)
.or(self.pkg_fmt),

bin_dir: pkg_overrides
.into_iter()
.find_map(|pkg_override| pkg_override.bin_dir.clone())
.or_else(|| self.bin_dir.clone()),

pub_key: self.pub_key.clone(),
overrides: Default::default(),
}
}
}

/// Target specific overrides for binary installation
Expand Down
13 changes: 6 additions & 7 deletions crates/binstalk/src/ops/resolve.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::{
borrow::Cow,
collections::BTreeSet,
iter, mem,
path::{Path, PathBuf},
sync::Arc,
};
Expand Down Expand Up @@ -169,7 +170,7 @@ async fn resolve_inner(
}
}

let (meta, mut binaries) = (
let (mut meta, mut binaries) = (
package
.metadata
.as_ref()
Expand All @@ -189,19 +190,17 @@ async fn resolve_inner(

let mut handles: Vec<(Arc<dyn Fetcher>, _)> = Vec::with_capacity(desired_targets.len() * 2);

let overrides = mem::take(&mut meta.overrides);

handles.extend(
desired_targets
.iter()
.map(|target| {
debug!("Building metadata for target: {target}");
let mut target_meta = meta.clone_without_overrides();

// Merge any overrides
if let Some(o) = meta.overrides.get(target) {
target_meta.merge(o);
}
let target_meta = meta
.merge_overrides(iter::once(&opts.cli_overrides).chain(overrides.get(target)));

target_meta.merge(&opts.cli_overrides);
debug!("Found metadata: {target_meta:?}");

Arc::new(Data {
Expand Down

0 comments on commit b8d2184

Please sign in to comment.