Skip to content

Commit 3d39211

Browse files
committed
Auto merge of #8008 - aleksator:refactor_workspace_validate, r=ehuss
Split workspace/validate() into multiple functions
2 parents dcddf15 + 065f821 commit 3d39211

File tree

1 file changed

+85
-67
lines changed

1 file changed

+85
-67
lines changed

src/cargo/core/workspace.rs

Lines changed: 85 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -588,35 +588,47 @@ impl<'cfg> Workspace<'cfg> {
588588
return Ok(());
589589
}
590590

591-
let mut roots = Vec::new();
592-
{
593-
let mut names = BTreeMap::new();
594-
for member in self.members.iter() {
595-
let package = self.packages.get(member);
596-
match *package.workspace_config() {
597-
WorkspaceConfig::Root(_) => {
598-
roots.push(member.parent().unwrap().to_path_buf());
599-
}
600-
WorkspaceConfig::Member { .. } => {}
601-
}
602-
let name = match *package {
603-
MaybePackage::Package(ref p) => p.name(),
604-
MaybePackage::Virtual(_) => continue,
605-
};
606-
if let Some(prev) = names.insert(name, member) {
607-
anyhow::bail!(
608-
"two packages named `{}` in this workspace:\n\
591+
self.validate_unique_names()?;
592+
self.validate_workspace_roots()?;
593+
self.validate_members()?;
594+
self.error_if_manifest_not_in_members()?;
595+
self.validate_manifest()
596+
}
597+
598+
fn validate_unique_names(&self) -> CargoResult<()> {
599+
let mut names = BTreeMap::new();
600+
for member in self.members.iter() {
601+
let package = self.packages.get(member);
602+
let name = match *package {
603+
MaybePackage::Package(ref p) => p.name(),
604+
MaybePackage::Virtual(_) => continue,
605+
};
606+
if let Some(prev) = names.insert(name, member) {
607+
anyhow::bail!(
608+
"two packages named `{}` in this workspace:\n\
609609
- {}\n\
610610
- {}",
611-
name,
612-
prev.display(),
613-
member.display()
614-
);
615-
}
611+
name,
612+
prev.display(),
613+
member.display()
614+
);
616615
}
617616
}
617+
Ok(())
618+
}
618619

620+
fn validate_workspace_roots(&self) -> CargoResult<()> {
621+
let roots: Vec<PathBuf> = self
622+
.members
623+
.iter()
624+
.filter(|&member| {
625+
let config = self.packages.get(member).workspace_config();
626+
matches!(config, WorkspaceConfig::Root(_))
627+
})
628+
.map(|member| member.parent().unwrap().to_path_buf())
629+
.collect();
619630
match roots.len() {
631+
1 => Ok(()),
620632
0 => anyhow::bail!(
621633
"`package.workspace` configuration points to a crate \
622634
which is not configured with [workspace]: \n\
@@ -625,7 +637,6 @@ impl<'cfg> Workspace<'cfg> {
625637
self.current_manifest.display(),
626638
self.root_manifest.as_ref().unwrap().display()
627639
),
628-
1 => {}
629640
_ => {
630641
anyhow::bail!(
631642
"multiple workspace roots found in the same workspace:\n{}",
@@ -637,7 +648,9 @@ impl<'cfg> Workspace<'cfg> {
637648
);
638649
}
639650
}
651+
}
640652

653+
fn validate_members(&mut self) -> CargoResult<()> {
641654
for member in self.members.clone() {
642655
let root = self.find_root(&member)?;
643656
if root == self.root_manifest {
@@ -665,62 +678,68 @@ impl<'cfg> Workspace<'cfg> {
665678
}
666679
}
667680
}
681+
Ok(())
682+
}
683+
684+
fn error_if_manifest_not_in_members(&mut self) -> CargoResult<()> {
685+
if self.members.contains(&self.current_manifest) {
686+
return Ok(());
687+
}
668688

669-
if !self.members.contains(&self.current_manifest) {
670-
let root = self.root_manifest.as_ref().unwrap();
671-
let root_dir = root.parent().unwrap();
672-
let current_dir = self.current_manifest.parent().unwrap();
673-
let root_pkg = self.packages.get(root);
674-
675-
// FIXME: Make this more generic by using a relative path resolver between member and
676-
// root.
677-
let members_msg = match current_dir.strip_prefix(root_dir) {
678-
Ok(rel) => format!(
679-
"this may be fixable by adding `{}` to the \
689+
let root = self.root_manifest.as_ref().unwrap();
690+
let root_dir = root.parent().unwrap();
691+
let current_dir = self.current_manifest.parent().unwrap();
692+
let root_pkg = self.packages.get(root);
693+
694+
// FIXME: Make this more generic by using a relative path resolver between member and root.
695+
let members_msg = match current_dir.strip_prefix(root_dir) {
696+
Ok(rel) => format!(
697+
"this may be fixable by adding `{}` to the \
680698
`workspace.members` array of the manifest \
681699
located at: {}",
682-
rel.display(),
683-
root.display()
684-
),
685-
Err(_) => format!(
686-
"this may be fixable by adding a member to \
700+
rel.display(),
701+
root.display()
702+
),
703+
Err(_) => format!(
704+
"this may be fixable by adding a member to \
687705
the `workspace.members` array of the \
688706
manifest located at: {}",
689-
root.display()
690-
),
691-
};
692-
let extra = match *root_pkg {
693-
MaybePackage::Virtual(_) => members_msg,
694-
MaybePackage::Package(ref p) => {
695-
let has_members_list = match *p.manifest().workspace_config() {
696-
WorkspaceConfig::Root(ref root_config) => root_config.has_members_list(),
697-
WorkspaceConfig::Member { .. } => unreachable!(),
698-
};
699-
if !has_members_list {
700-
format!(
701-
"this may be fixable by ensuring that this \
707+
root.display()
708+
),
709+
};
710+
let extra = match *root_pkg {
711+
MaybePackage::Virtual(_) => members_msg,
712+
MaybePackage::Package(ref p) => {
713+
let has_members_list = match *p.manifest().workspace_config() {
714+
WorkspaceConfig::Root(ref root_config) => root_config.has_members_list(),
715+
WorkspaceConfig::Member { .. } => unreachable!(),
716+
};
717+
if !has_members_list {
718+
format!(
719+
"this may be fixable by ensuring that this \
702720
crate is depended on by the workspace \
703721
root: {}",
704-
root.display()
705-
)
706-
} else {
707-
members_msg
708-
}
722+
root.display()
723+
)
724+
} else {
725+
members_msg
709726
}
710-
};
711-
anyhow::bail!(
712-
"current package believes it's in a workspace when it's not:\n\
727+
}
728+
};
729+
anyhow::bail!(
730+
"current package believes it's in a workspace when it's not:\n\
713731
current: {}\n\
714732
workspace: {}\n\n{}\n\
715733
Alternatively, to keep it out of the workspace, add the package \
716734
to the `workspace.exclude` array, or add an empty `[workspace]` \
717735
table to the package's manifest.",
718-
self.current_manifest.display(),
719-
root.display(),
720-
extra
721-
);
722-
}
736+
self.current_manifest.display(),
737+
root.display(),
738+
extra
739+
);
740+
}
723741

742+
fn validate_manifest(&mut self) -> CargoResult<()> {
724743
if let Some(ref root_manifest) = self.root_manifest {
725744
for pkg in self
726745
.members()
@@ -751,7 +770,6 @@ impl<'cfg> Workspace<'cfg> {
751770
}
752771
}
753772
}
754-
755773
Ok(())
756774
}
757775

0 commit comments

Comments
 (0)