@@ -588,35 +588,47 @@ impl<'cfg> Workspace<'cfg> {
588
588
return Ok ( ( ) ) ;
589
589
}
590
590
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 \
609
609
- {}\n \
610
610
- {}",
611
- name,
612
- prev. display( ) ,
613
- member. display( )
614
- ) ;
615
- }
611
+ name,
612
+ prev. display( ) ,
613
+ member. display( )
614
+ ) ;
616
615
}
617
616
}
617
+ Ok ( ( ) )
618
+ }
618
619
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 ( ) ;
619
630
match roots. len ( ) {
631
+ 1 => Ok ( ( ) ) ,
620
632
0 => anyhow:: bail!(
621
633
"`package.workspace` configuration points to a crate \
622
634
which is not configured with [workspace]: \n \
@@ -625,7 +637,6 @@ impl<'cfg> Workspace<'cfg> {
625
637
self . current_manifest. display( ) ,
626
638
self . root_manifest. as_ref( ) . unwrap( ) . display( )
627
639
) ,
628
- 1 => { }
629
640
_ => {
630
641
anyhow:: bail!(
631
642
"multiple workspace roots found in the same workspace:\n {}" ,
@@ -637,7 +648,9 @@ impl<'cfg> Workspace<'cfg> {
637
648
) ;
638
649
}
639
650
}
651
+ }
640
652
653
+ fn validate_members ( & mut self ) -> CargoResult < ( ) > {
641
654
for member in self . members . clone ( ) {
642
655
let root = self . find_root ( & member) ?;
643
656
if root == self . root_manifest {
@@ -665,62 +678,68 @@ impl<'cfg> Workspace<'cfg> {
665
678
}
666
679
}
667
680
}
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
+ }
668
688
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 \
680
698
`workspace.members` array of the manifest \
681
699
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 \
687
705
the `workspace.members` array of the \
688
706
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 \
702
720
crate is depended on by the workspace \
703
721
root: {}",
704
- root. display( )
705
- )
706
- } else {
707
- members_msg
708
- }
722
+ root. display( )
723
+ )
724
+ } else {
725
+ members_msg
709
726
}
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 \
713
731
current: {}\n \
714
732
workspace: {}\n \n {}\n \
715
733
Alternatively, to keep it out of the workspace, add the package \
716
734
to the `workspace.exclude` array, or add an empty `[workspace]` \
717
735
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
+ }
723
741
742
+ fn validate_manifest ( & mut self ) -> CargoResult < ( ) > {
724
743
if let Some ( ref root_manifest) = self . root_manifest {
725
744
for pkg in self
726
745
. members ( )
@@ -751,7 +770,6 @@ impl<'cfg> Workspace<'cfg> {
751
770
}
752
771
}
753
772
}
754
-
755
773
Ok ( ( ) )
756
774
}
757
775
0 commit comments