Skip to content

Commit 2b3af39

Browse files
committed
Auto merge of #9547 - lu-zero:members_mut, r=alexcrichton
Add a mean to mutably access the members of a workspace It is used by cargo-c to patch all the lib crates in a workspace.
2 parents aa8b092 + b26ceda commit 2b3af39

File tree

2 files changed

+57
-39
lines changed

2 files changed

+57
-39
lines changed

src/cargo/core/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub use self::resolver::{Resolve, ResolveVersion};
1010
pub use self::shell::{Shell, Verbosity};
1111
pub use self::source::{GitReference, Source, SourceId, SourceMap};
1212
pub use self::summary::{FeatureMap, FeatureValue, Summary};
13-
pub use self::workspace::{MaybePackage, Members, Workspace, WorkspaceConfig, WorkspaceRootConfig};
13+
pub use self::workspace::{MaybePackage, Workspace, WorkspaceConfig, WorkspaceRootConfig};
1414

1515
pub mod compiler;
1616
pub mod dependency;

src/cargo/core/workspace.rs

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use std::collections::hash_map::{Entry, HashMap};
33
use std::collections::{BTreeMap, BTreeSet, HashSet};
44
use std::path::{Path, PathBuf};
55
use std::rc::Rc;
6-
use std::slice;
76

87
use anyhow::{bail, Context as _};
98
use glob::glob;
@@ -136,13 +135,6 @@ pub struct WorkspaceRootConfig {
136135
custom_metadata: Option<toml::Value>,
137136
}
138137

139-
/// An iterator over the member packages of a workspace, returned by
140-
/// `Workspace::members`
141-
pub struct Members<'a, 'cfg> {
142-
ws: &'a Workspace<'cfg>,
143-
iter: slice::Iter<'a, PathBuf>,
144-
}
145-
146138
impl<'cfg> Workspace<'cfg> {
147139
/// Creates a new workspace given the target manifest pointed to by
148140
/// `manifest_path`.
@@ -466,19 +458,65 @@ impl<'cfg> Workspace<'cfg> {
466458
}
467459

468460
/// Returns an iterator over all packages in this workspace
469-
pub fn members<'a>(&'a self) -> Members<'a, 'cfg> {
470-
Members {
471-
ws: self,
472-
iter: self.members.iter(),
473-
}
461+
pub fn members(&self) -> impl Iterator<Item = &Package> {
462+
let packages = &self.packages;
463+
self.members
464+
.iter()
465+
.filter_map(move |path| match packages.get(path) {
466+
&MaybePackage::Package(ref p) => Some(p),
467+
_ => None,
468+
})
469+
}
470+
471+
/// Returns a mutable iterator over all packages in this workspace
472+
pub fn members_mut(&mut self) -> impl Iterator<Item = &mut Package> {
473+
let packages = &mut self.packages.packages;
474+
let members: HashSet<_> = self
475+
.members
476+
.iter()
477+
.map(|path| path.parent().unwrap().to_owned())
478+
.collect();
479+
480+
packages.iter_mut().filter_map(move |(path, package)| {
481+
if members.contains(path) {
482+
if let MaybePackage::Package(ref mut p) = package {
483+
return Some(p);
484+
}
485+
}
486+
487+
None
488+
})
474489
}
475490

476491
/// Returns an iterator over default packages in this workspace
477-
pub fn default_members<'a>(&'a self) -> Members<'a, 'cfg> {
478-
Members {
479-
ws: self,
480-
iter: self.default_members.iter(),
481-
}
492+
pub fn default_members<'a>(&'a self) -> impl Iterator<Item = &Package> {
493+
let packages = &self.packages;
494+
self.default_members
495+
.iter()
496+
.filter_map(move |path| match packages.get(path) {
497+
&MaybePackage::Package(ref p) => Some(p),
498+
_ => None,
499+
})
500+
}
501+
502+
/// Returns an iterator over default packages in this workspace
503+
pub fn default_members_mut(&mut self) -> impl Iterator<Item = &mut Package> {
504+
let packages = &mut self.packages.packages;
505+
let members: HashSet<_> = self
506+
.default_members
507+
.iter()
508+
.map(|path| path.parent().unwrap().to_owned())
509+
.collect();
510+
511+
packages.iter_mut().filter_map(move |(path, package)| {
512+
if members.contains(path) {
513+
if let MaybePackage::Package(ref mut p) = package {
514+
return Some(p);
515+
}
516+
}
517+
518+
None
519+
})
482520
}
483521

484522
/// Returns true if the package is a member of the workspace.
@@ -1529,26 +1567,6 @@ impl<'cfg> Packages<'cfg> {
15291567
}
15301568
}
15311569

1532-
impl<'a, 'cfg> Iterator for Members<'a, 'cfg> {
1533-
type Item = &'a Package;
1534-
1535-
fn next(&mut self) -> Option<&'a Package> {
1536-
loop {
1537-
let next = self.iter.next().map(|path| self.ws.packages.get(path));
1538-
match next {
1539-
Some(&MaybePackage::Package(ref p)) => return Some(p),
1540-
Some(&MaybePackage::Virtual(_)) => {}
1541-
None => return None,
1542-
}
1543-
}
1544-
}
1545-
1546-
fn size_hint(&self) -> (usize, Option<usize>) {
1547-
let (_, upper) = self.iter.size_hint();
1548-
(0, upper)
1549-
}
1550-
}
1551-
15521570
impl MaybePackage {
15531571
fn workspace_config(&self) -> &WorkspaceConfig {
15541572
match *self {

0 commit comments

Comments
 (0)