Skip to content

Commit b8d2184

Browse files
authored
Optimize applying PkgOverrides into PkgMeta (rust-lang#429)
* 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>
1 parent 417143e commit b8d2184

2 files changed

Lines changed: 36 additions & 17 deletions

File tree

crates/binstalk/src/manifests/cargo_toml_binstall.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ pub struct PkgMeta {
4343
}
4444

4545
impl PkgMeta {
46-
pub fn clone_without_overrides(&self) -> Self {
47-
Self {
48-
pkg_url: self.pkg_url.clone(),
49-
pkg_fmt: self.pkg_fmt,
50-
bin_dir: self.bin_dir.clone(),
51-
pub_key: self.pub_key.clone(),
52-
overrides: BTreeMap::new(),
53-
}
54-
}
55-
5646
/// Merge configuration overrides into object
5747
pub fn merge(&mut self, pkg_override: &PkgOverride) {
5848
if let Some(o) = &pkg_override.pkg_url {
@@ -65,6 +55,36 @@ impl PkgMeta {
6555
self.bin_dir = Some(o.clone());
6656
}
6757
}
58+
59+
/// Merge configuration overrides into object
60+
///
61+
/// * `pkg_overrides` - ordered in preference
62+
pub fn merge_overrides<'a, It>(&self, pkg_overrides: It) -> Self
63+
where
64+
It: IntoIterator<Item = &'a PkgOverride> + Clone,
65+
{
66+
Self {
67+
pkg_url: pkg_overrides
68+
.clone()
69+
.into_iter()
70+
.find_map(|pkg_override| pkg_override.pkg_url.clone())
71+
.or_else(|| self.pkg_url.clone()),
72+
73+
pkg_fmt: pkg_overrides
74+
.clone()
75+
.into_iter()
76+
.find_map(|pkg_override| pkg_override.pkg_fmt)
77+
.or(self.pkg_fmt),
78+
79+
bin_dir: pkg_overrides
80+
.into_iter()
81+
.find_map(|pkg_override| pkg_override.bin_dir.clone())
82+
.or_else(|| self.bin_dir.clone()),
83+
84+
pub_key: self.pub_key.clone(),
85+
overrides: Default::default(),
86+
}
87+
}
6888
}
6989

7090
/// Target specific overrides for binary installation

crates/binstalk/src/ops/resolve.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::{
22
borrow::Cow,
33
collections::BTreeSet,
4+
iter, mem,
45
path::{Path, PathBuf},
56
sync::Arc,
67
};
@@ -169,7 +170,7 @@ async fn resolve_inner(
169170
}
170171
}
171172

172-
let (meta, mut binaries) = (
173+
let (mut meta, mut binaries) = (
173174
package
174175
.metadata
175176
.as_ref()
@@ -189,19 +190,17 @@ async fn resolve_inner(
189190

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

193+
let overrides = mem::take(&mut meta.overrides);
194+
192195
handles.extend(
193196
desired_targets
194197
.iter()
195198
.map(|target| {
196199
debug!("Building metadata for target: {target}");
197-
let mut target_meta = meta.clone_without_overrides();
198200

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

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

207206
Arc::new(Data {

0 commit comments

Comments
 (0)