@@ -412,11 +412,15 @@ impl Dependency {
412
412
table. insert ( "version" , src. version . as_str ( ) . into ( ) ) ;
413
413
}
414
414
Some ( Source :: Path ( src) ) => {
415
- let relpath = path_field ( crate_root, & src. path ) ;
416
415
if let Some ( r) = src. version . as_deref ( ) {
417
416
table. insert ( "version" , r. into ( ) ) ;
418
417
}
419
- table. insert ( "path" , relpath. into ( ) ) ;
418
+ if let Some ( ( base_name, base_value) ) = src. base_name_and_value . as_ref ( ) {
419
+ table. insert ( "base" , base_name. into ( ) ) ;
420
+ table. insert ( "path" , path_field ( base_value, & src. path ) . into ( ) ) ;
421
+ } else {
422
+ table. insert ( "path" , path_field ( crate_root, & src. path ) . into ( ) ) ;
423
+ }
420
424
}
421
425
Some ( Source :: Git ( src) ) => {
422
426
table. insert ( "git" , src. git . as_str ( ) . into ( ) ) ;
@@ -493,13 +497,18 @@ impl Dependency {
493
497
Some ( Source :: Registry ( src) ) => {
494
498
overwrite_value ( table, "version" , src. version . as_str ( ) ) ;
495
499
496
- for key in [ "path" , "git" , "branch" , "tag" , "rev" , "workspace" ] {
500
+ for key in [ "path" , "git" , "branch" , "tag" , "rev" , "workspace" , "base" ] {
497
501
table. remove ( key) ;
498
502
}
499
503
}
500
504
Some ( Source :: Path ( src) ) => {
501
- let relpath = path_field ( crate_root, & src. path ) ;
502
- overwrite_value ( table, "path" , relpath) ;
505
+ if let Some ( ( base_name, base_value) ) = src. base_name_and_value . as_ref ( ) {
506
+ overwrite_value ( table, "base" , base_name) ;
507
+ overwrite_value ( table, "path" , path_field ( base_value, & src. path ) ) ;
508
+ } else {
509
+ table. remove ( "base" ) ;
510
+ overwrite_value ( table, "path" , path_field ( crate_root, & src. path ) ) ;
511
+ }
503
512
if let Some ( r) = src. version . as_deref ( ) {
504
513
overwrite_value ( table, "version" , r) ;
505
514
} else {
@@ -533,7 +542,7 @@ impl Dependency {
533
542
table. remove ( "version" ) ;
534
543
}
535
544
536
- for key in [ "path" , "workspace" ] {
545
+ for key in [ "path" , "workspace" , "base" ] {
537
546
table. remove ( key) ;
538
547
}
539
548
}
@@ -552,6 +561,7 @@ impl Dependency {
552
561
"rev" ,
553
562
"package" ,
554
563
"default-features" ,
564
+ "base" ,
555
565
] {
556
566
table. remove ( key) ;
557
567
}
@@ -653,10 +663,13 @@ impl std::fmt::Display for Dependency {
653
663
}
654
664
}
655
665
656
- impl < ' s > From < & ' s Summary > for Dependency {
657
- fn from ( other : & ' s Summary ) -> Self {
666
+ impl Dependency {
667
+ pub ( crate ) fn from_summary (
668
+ other : & Summary ,
669
+ base_name_and_value : & Option < ( String , PathBuf ) > ,
670
+ ) -> Self {
658
671
let source: Source = if let Some ( path) = other. source_id ( ) . local_path ( ) {
659
- PathSource :: new ( path)
672
+ PathSource :: new_with_base ( path, base_name_and_value . clone ( ) )
660
673
. set_version ( other. version ( ) . to_string ( ) )
661
674
. into ( )
662
675
} else if let Some ( git_ref) = other. source_id ( ) . git_reference ( ) {
@@ -676,6 +689,12 @@ impl<'s> From<&'s Summary> for Dependency {
676
689
}
677
690
}
678
691
692
+ impl < ' s > From < & ' s Summary > for Dependency {
693
+ fn from ( other : & ' s Summary ) -> Self {
694
+ Dependency :: from_summary ( other, & None )
695
+ }
696
+ }
697
+
679
698
impl From < Summary > for Dependency {
680
699
fn from ( other : Summary ) -> Self {
681
700
( & other) . into ( )
@@ -812,6 +831,8 @@ impl std::fmt::Display for RegistrySource {
812
831
pub struct PathSource {
813
832
/// Local, absolute path.
814
833
pub path : PathBuf ,
834
+ /// If using a named base, the base and relative path.
835
+ pub base_name_and_value : Option < ( String , PathBuf ) > ,
815
836
/// Version requirement for when published.
816
837
pub version : Option < String > ,
817
838
}
@@ -821,6 +842,19 @@ impl PathSource {
821
842
pub fn new ( path : impl Into < PathBuf > ) -> Self {
822
843
Self {
823
844
path : path. into ( ) ,
845
+ base_name_and_value : None ,
846
+ version : None ,
847
+ }
848
+ }
849
+
850
+ /// Specify dependency from a path and an optional base.
851
+ pub fn new_with_base (
852
+ path : impl Into < PathBuf > ,
853
+ base_name_and_value : Option < ( String , PathBuf ) > ,
854
+ ) -> Self {
855
+ Self {
856
+ path : path. into ( ) ,
857
+ base_name_and_value,
824
858
version : None ,
825
859
}
826
860
}
@@ -843,7 +877,11 @@ impl PathSource {
843
877
844
878
impl std:: fmt:: Display for PathSource {
845
879
fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
846
- self . path . display ( ) . fmt ( f)
880
+ if let Some ( ( base_name, _) ) = & self . base_name_and_value {
881
+ write ! ( f, "{{{base_name}}}/{}" , self . path. display( ) )
882
+ } else {
883
+ self . path . display ( ) . fmt ( f)
884
+ }
847
885
}
848
886
}
849
887
0 commit comments