@@ -20,7 +20,9 @@ use crate::core::compiler::{CompileKind, CompileTarget};
20
20
use crate :: core:: dependency:: { Artifact , ArtifactTarget , DepKind } ;
21
21
use crate :: core:: manifest:: { ManifestMetadata , TargetSourcePath , Warnings } ;
22
22
use crate :: core:: resolver:: ResolveBehavior ;
23
- use crate :: core:: { find_workspace_root, Dependency , Manifest , PackageId , Summary , Target } ;
23
+ use crate :: core:: {
24
+ find_workspace_root, resolve_relative_path, Dependency , Manifest , PackageId , Summary , Target ,
25
+ } ;
24
26
use crate :: core:: {
25
27
Edition , EitherManifest , Feature , Features , InheritableFields , VirtualManifest , Workspace ,
26
28
} ;
@@ -1021,6 +1023,12 @@ impl<T> MaybeWorkspace<T> {
1021
1023
) ) ,
1022
1024
}
1023
1025
}
1026
+ fn as_defined ( & self ) -> Option < & T > {
1027
+ match self {
1028
+ MaybeWorkspace :: Workspace ( _) => None ,
1029
+ MaybeWorkspace :: Defined ( defined) => Some ( defined) ,
1030
+ }
1031
+ }
1024
1032
}
1025
1033
1026
1034
#[ derive( Deserialize , Serialize , Clone , Debug ) ]
@@ -1069,7 +1077,7 @@ pub struct TomlProject {
1069
1077
keywords : Option < MaybeWorkspace < Vec < String > > > ,
1070
1078
categories : Option < MaybeWorkspace < Vec < String > > > ,
1071
1079
license : Option < MaybeWorkspace < String > > ,
1072
- license_file : Option < String > ,
1080
+ license_file : Option < MaybeWorkspace < String > > ,
1073
1081
repository : Option < MaybeWorkspace < String > > ,
1074
1082
resolver : Option < String > ,
1075
1083
@@ -1149,19 +1157,22 @@ impl TomlManifest {
1149
1157
package. workspace = None ;
1150
1158
package. resolver = ws. resolve_behavior ( ) . to_manifest ( ) ;
1151
1159
if let Some ( license_file) = & package. license_file {
1160
+ let license_file = license_file
1161
+ . as_defined ( )
1162
+ . context ( "license file should have been resolved before `prepare_for_publish()`" ) ?;
1152
1163
let license_path = Path :: new ( & license_file) ;
1153
1164
let abs_license_path = paths:: normalize_path ( & package_root. join ( license_path) ) ;
1154
1165
if abs_license_path. strip_prefix ( package_root) . is_err ( ) {
1155
1166
// This path points outside of the package root. `cargo package`
1156
1167
// will copy it into the root, so adjust the path to this location.
1157
- package. license_file = Some (
1168
+ package. license_file = Some ( MaybeWorkspace :: Defined (
1158
1169
license_path
1159
1170
. file_name ( )
1160
1171
. unwrap ( )
1161
1172
. to_str ( )
1162
1173
. unwrap ( )
1163
1174
. to_string ( ) ,
1164
- ) ;
1175
+ ) ) ;
1165
1176
}
1166
1177
}
1167
1178
let all = |_d : & TomlDependency | true ;
@@ -1340,6 +1351,7 @@ impl TomlManifest {
1340
1351
config. publish . clone ( ) ,
1341
1352
config. edition . clone ( ) ,
1342
1353
config. badges . clone ( ) ,
1354
+ package_root. to_path_buf ( ) ,
1343
1355
) ;
1344
1356
1345
1357
WorkspaceConfig :: Root ( WorkspaceRootConfig :: new (
@@ -1506,13 +1518,12 @@ impl TomlManifest {
1506
1518
} ;
1507
1519
let mut deps: BTreeMap < String , TomlDependency > = BTreeMap :: new ( ) ;
1508
1520
for ( n, v) in dependencies. iter ( ) {
1509
- let resolved = v. clone ( ) . resolve ( features, n, || {
1521
+ let resolved = v. clone ( ) . resolve ( features, n, cx , || {
1510
1522
get_ws (
1511
1523
cx. config ,
1512
1524
cx. root . join ( "Cargo.toml" ) ,
1513
1525
workspace_config. clone ( ) ,
1514
- ) ?
1515
- . get_dependency ( n)
1526
+ )
1516
1527
} ) ?;
1517
1528
let dep = resolved. to_dependency ( n, cx, kind) ?;
1518
1529
validate_package_name ( dep. name_in_toml ( ) . as_str ( ) , "dependency name" , "" ) ?;
@@ -1702,7 +1713,16 @@ impl TomlManifest {
1702
1713
} )
1703
1714
} )
1704
1715
. transpose ( ) ?,
1705
- license_file : project. license_file . clone ( ) ,
1716
+ license_file : project
1717
+ . license_file
1718
+ . clone ( )
1719
+ . map ( |mw| {
1720
+ mw. resolve ( & features, "license" , || {
1721
+ get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1722
+ . license_file ( package_root)
1723
+ } )
1724
+ } )
1725
+ . transpose ( ) ?,
1706
1726
repository : project
1707
1727
. repository
1708
1728
. clone ( )
@@ -1766,6 +1786,10 @@ impl TomlManifest {
1766
1786
. license
1767
1787
. clone ( )
1768
1788
. map ( |license| MaybeWorkspace :: Defined ( license) ) ;
1789
+ project. license_file = metadata
1790
+ . license_file
1791
+ . clone ( )
1792
+ . map ( |license_file| MaybeWorkspace :: Defined ( license_file) ) ;
1769
1793
project. repository = metadata
1770
1794
. repository
1771
1795
. clone ( )
@@ -1999,6 +2023,7 @@ impl TomlManifest {
1999
2023
config. publish . clone ( ) ,
2000
2024
config. edition . clone ( ) ,
2001
2025
config. badges . clone ( ) ,
2026
+ root. to_path_buf ( ) ,
2002
2027
) ;
2003
2028
WorkspaceConfig :: Root ( WorkspaceRootConfig :: new (
2004
2029
root,
@@ -2240,13 +2265,16 @@ impl<P: ResolveToPath + Clone> TomlDependency<P> {
2240
2265
TomlDependency :: Workspace ( w) => w. optional . unwrap_or ( false ) ,
2241
2266
}
2242
2267
}
2268
+ }
2243
2269
2270
+ impl TomlDependency {
2244
2271
fn resolve < ' a > (
2245
2272
self ,
2246
2273
cargo_features : & Features ,
2247
2274
label : & str ,
2248
- get_ws_dependency : impl FnOnce ( ) -> CargoResult < TomlDependency < P > > ,
2249
- ) -> CargoResult < TomlDependency < P > > {
2275
+ cx : & mut Context < ' _ , ' _ > ,
2276
+ get_inheritable : impl FnOnce ( ) -> CargoResult < InheritableFields > ,
2277
+ ) -> CargoResult < TomlDependency > {
2250
2278
match self {
2251
2279
TomlDependency :: Detailed ( d) => Ok ( TomlDependency :: Detailed ( d) ) ,
2252
2280
TomlDependency :: Simple ( s) => Ok ( TomlDependency :: Simple ( s) ) ,
@@ -2256,28 +2284,30 @@ impl<P: ResolveToPath + Clone> TomlDependency<P> {
2256
2284
optional,
2257
2285
} ) => {
2258
2286
cargo_features. require ( Feature :: workspace_inheritance ( ) ) ?;
2259
- get_ws_dependency ( ) . context ( format ! (
2287
+ let inheritable = get_inheritable ( ) ?;
2288
+ inheritable. get_dependency ( label) . context ( format ! (
2260
2289
"error reading `dependencies.{}` from workspace root manifest's `workspace.dependencies.{}`" ,
2261
2290
label, label
2262
2291
) ) . map ( |dep| {
2263
2292
match dep {
2264
2293
TomlDependency :: Simple ( s) => {
2265
2294
if optional. is_some ( ) || features. is_some ( ) {
2266
- TomlDependency :: Detailed ( DetailedTomlDependency :: < P > {
2295
+ Ok ( TomlDependency :: Detailed ( DetailedTomlDependency {
2267
2296
version : Some ( s) ,
2268
2297
optional,
2269
2298
features,
2270
2299
..Default :: default ( )
2271
- } )
2300
+ } ) )
2272
2301
} else {
2273
- TomlDependency :: Simple ( s)
2302
+ Ok ( TomlDependency :: Simple ( s) )
2274
2303
}
2275
2304
} ,
2276
2305
TomlDependency :: Detailed ( d) => {
2277
2306
let mut dep = d. clone ( ) ;
2278
2307
dep. add_features ( features) ;
2279
2308
dep. update_optional ( optional) ;
2280
- TomlDependency :: Detailed ( dep)
2309
+ dep. resolve_path ( label, inheritable. ws_root ( ) , cx. root ) ?;
2310
+ Ok ( TomlDependency :: Detailed ( dep) )
2281
2311
} ,
2282
2312
TomlDependency :: Workspace ( _) => {
2283
2313
unreachable ! (
@@ -2288,7 +2318,7 @@ impl<P: ResolveToPath + Clone> TomlDependency<P> {
2288
2318
)
2289
2319
} ,
2290
2320
}
2291
- } )
2321
+ } ) ?
2292
2322
}
2293
2323
TomlDependency :: Workspace ( TomlWorkspaceDependency {
2294
2324
workspace : false , ..
@@ -2543,7 +2573,9 @@ impl<P: ResolveToPath + Clone> DetailedTomlDependency<P> {
2543
2573
}
2544
2574
Ok ( dep)
2545
2575
}
2576
+ }
2546
2577
2578
+ impl DetailedTomlDependency {
2547
2579
fn add_features ( & mut self , features : Option < Vec < String > > ) {
2548
2580
self . features = match ( self . features . clone ( ) , features. clone ( ) ) {
2549
2581
( Some ( dep_feat) , Some ( inherit_feat) ) => Some (
@@ -2561,6 +2593,23 @@ impl<P: ResolveToPath + Clone> DetailedTomlDependency<P> {
2561
2593
fn update_optional ( & mut self , optional : Option < bool > ) {
2562
2594
self . optional = optional;
2563
2595
}
2596
+
2597
+ fn resolve_path (
2598
+ & mut self ,
2599
+ name : & str ,
2600
+ root_path : & Path ,
2601
+ package_root : & Path ,
2602
+ ) -> CargoResult < ( ) > {
2603
+ if let Some ( rel_path) = & self . path {
2604
+ self . path = Some ( resolve_relative_path (
2605
+ name,
2606
+ root_path,
2607
+ package_root,
2608
+ rel_path,
2609
+ ) ?)
2610
+ }
2611
+ Ok ( ( ) )
2612
+ }
2564
2613
}
2565
2614
2566
2615
#[ derive( Default , Serialize , Deserialize , Debug , Clone ) ]
0 commit comments