@@ -8,6 +8,7 @@ use std::str;
8
8
use anyhow:: { anyhow, bail, Context as _} ;
9
9
use cargo_platform:: Platform ;
10
10
use cargo_util:: paths;
11
+ use lazycell:: LazyCell ;
11
12
use log:: { debug, trace} ;
12
13
use semver:: { self , VersionReq } ;
13
14
use serde:: de;
@@ -1496,8 +1497,8 @@ impl TomlManifest {
1496
1497
) -> CargoResult < ( Manifest , Vec < PathBuf > ) > {
1497
1498
fn get_ws (
1498
1499
config : & Config ,
1499
- resolved_path : PathBuf ,
1500
- workspace_config : WorkspaceConfig ,
1500
+ resolved_path : & Path ,
1501
+ workspace_config : & WorkspaceConfig ,
1501
1502
) -> CargoResult < InheritableFields > {
1502
1503
match workspace_config {
1503
1504
WorkspaceConfig :: Root ( root) => Ok ( root. inheritable ( ) . clone ( ) ) ,
@@ -1565,19 +1566,22 @@ impl TomlManifest {
1565
1566
1566
1567
let resolved_path = package_root. join ( "Cargo.toml" ) ;
1567
1568
1568
- let version = project. version . clone ( ) . resolve ( & features, "version" , || {
1569
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. version ( )
1570
- } ) ?;
1569
+ let inherit_cell: LazyCell < InheritableFields > = LazyCell :: new ( ) ;
1570
+ let inherit =
1571
+ || inherit_cell. try_borrow_with ( || get_ws ( config, & resolved_path, & workspace_config) ) ;
1572
+
1573
+ let version = project
1574
+ . version
1575
+ . clone ( )
1576
+ . resolve ( & features, "version" , || inherit ( ) ?. version ( ) ) ?;
1571
1577
1572
1578
project. version = MaybeWorkspace :: Defined ( version. clone ( ) ) ;
1573
1579
1574
1580
let pkgid = project. to_package_id ( source_id, version) ?;
1575
1581
1576
1582
let edition = if let Some ( edition) = project. edition . clone ( ) {
1577
1583
let edition: Edition = edition
1578
- . resolve ( & features, "edition" , || {
1579
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. edition ( )
1580
- } ) ?
1584
+ . resolve ( & features, "edition" , || inherit ( ) ?. edition ( ) ) ?
1581
1585
. parse ( )
1582
1586
. with_context ( || "failed to parse the `edition` key" ) ?;
1583
1587
project. edition = Some ( MaybeWorkspace :: Defined ( edition. to_string ( ) ) ) ;
@@ -1602,9 +1606,7 @@ impl TomlManifest {
1602
1606
let rust_version = if let Some ( rust_version) = & project. rust_version {
1603
1607
let rust_version = rust_version
1604
1608
. clone ( )
1605
- . resolve ( & features, "rust_version" , || {
1606
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. rust_version ( )
1607
- } ) ?;
1609
+ . resolve ( & features, "rust_version" , || inherit ( ) ?. rust_version ( ) ) ?;
1608
1610
let req = match semver:: VersionReq :: parse ( & rust_version) {
1609
1611
// Exclude semver operators like `^` and pre-release identifiers
1610
1612
Ok ( req) if rust_version. chars ( ) . all ( |c| c. is_ascii_digit ( ) || c == '.' ) => req,
@@ -1700,20 +1702,22 @@ impl TomlManifest {
1700
1702
new_deps : Option < & BTreeMap < String , TomlDependency > > ,
1701
1703
kind : Option < DepKind > ,
1702
1704
workspace_config : & WorkspaceConfig ,
1705
+ inherit_cell : & LazyCell < InheritableFields > ,
1703
1706
) -> CargoResult < Option < BTreeMap < String , TomlDependency > > > {
1704
1707
let dependencies = match new_deps {
1705
1708
Some ( dependencies) => dependencies,
1706
1709
None => return Ok ( None ) ,
1707
1710
} ;
1711
+
1712
+ let inherit = || {
1713
+ inherit_cell. try_borrow_with ( || {
1714
+ get_ws ( cx. config , & cx. root . join ( "Cargo.toml" ) , & workspace_config)
1715
+ } )
1716
+ } ;
1717
+
1708
1718
let mut deps: BTreeMap < String , TomlDependency > = BTreeMap :: new ( ) ;
1709
1719
for ( n, v) in dependencies. iter ( ) {
1710
- let resolved = v. clone ( ) . resolve ( features, n, cx, || {
1711
- get_ws (
1712
- cx. config ,
1713
- cx. root . join ( "Cargo.toml" ) ,
1714
- workspace_config. clone ( ) ,
1715
- )
1716
- } ) ?;
1720
+ let resolved = v. clone ( ) . resolve ( features, n, cx, || inherit ( ) ) ?;
1717
1721
let dep = resolved. to_dependency ( n, cx, kind) ?;
1718
1722
validate_package_name ( dep. name_in_toml ( ) . as_str ( ) , "dependency name" , "" ) ?;
1719
1723
cx. deps . push ( dep) ;
@@ -1729,6 +1733,7 @@ impl TomlManifest {
1729
1733
me. dependencies . as_ref ( ) ,
1730
1734
None ,
1731
1735
& workspace_config,
1736
+ & inherit_cell,
1732
1737
) ?;
1733
1738
if me. dev_dependencies . is_some ( ) && me. dev_dependencies2 . is_some ( ) {
1734
1739
warn_on_deprecated ( "dev-dependencies" , package_name, "package" , cx. warnings ) ;
@@ -1743,6 +1748,7 @@ impl TomlManifest {
1743
1748
dev_deps,
1744
1749
Some ( DepKind :: Development ) ,
1745
1750
& workspace_config,
1751
+ & inherit_cell,
1746
1752
) ?;
1747
1753
if me. build_dependencies . is_some ( ) && me. build_dependencies2 . is_some ( ) {
1748
1754
warn_on_deprecated ( "build-dependencies" , package_name, "package" , cx. warnings ) ;
@@ -1757,6 +1763,7 @@ impl TomlManifest {
1757
1763
build_deps,
1758
1764
Some ( DepKind :: Build ) ,
1759
1765
& workspace_config,
1766
+ & inherit_cell,
1760
1767
) ?;
1761
1768
1762
1769
let mut target: BTreeMap < String , TomlPlatform > = BTreeMap :: new ( ) ;
@@ -1772,6 +1779,7 @@ impl TomlManifest {
1772
1779
platform. dependencies . as_ref ( ) ,
1773
1780
None ,
1774
1781
& workspace_config,
1782
+ & inherit_cell,
1775
1783
)
1776
1784
. unwrap ( ) ;
1777
1785
if platform. build_dependencies . is_some ( ) && platform. build_dependencies2 . is_some ( ) {
@@ -1787,6 +1795,7 @@ impl TomlManifest {
1787
1795
build_deps,
1788
1796
Some ( DepKind :: Build ) ,
1789
1797
& workspace_config,
1798
+ & inherit_cell,
1790
1799
)
1791
1800
. unwrap ( ) ;
1792
1801
if platform. dev_dependencies . is_some ( ) && platform. dev_dependencies2 . is_some ( ) {
@@ -1802,6 +1811,7 @@ impl TomlManifest {
1802
1811
dev_deps,
1803
1812
Some ( DepKind :: Development ) ,
1804
1813
& workspace_config,
1814
+ & inherit_cell,
1805
1815
)
1806
1816
. unwrap ( ) ;
1807
1817
target. insert (
@@ -1843,21 +1853,13 @@ impl TomlManifest {
1843
1853
let exclude = project
1844
1854
. exclude
1845
1855
. clone ( )
1846
- . map ( |mw| {
1847
- mw. resolve ( & features, "exclude" , || {
1848
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. exclude ( )
1849
- } )
1850
- } )
1856
+ . map ( |mw| mw. resolve ( & features, "exclude" , || inherit ( ) ?. exclude ( ) ) )
1851
1857
. transpose ( ) ?
1852
1858
. unwrap_or_default ( ) ;
1853
1859
let include = project
1854
1860
. include
1855
1861
. clone ( )
1856
- . map ( |mw| {
1857
- mw. resolve ( & features, "include" , || {
1858
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. include ( )
1859
- } )
1860
- } )
1862
+ . map ( |mw| mw. resolve ( & features, "include" , || inherit ( ) ?. include ( ) ) )
1861
1863
. transpose ( ) ?
1862
1864
. unwrap_or_default ( ) ;
1863
1865
let empty_features = BTreeMap :: new ( ) ;
@@ -1874,113 +1876,67 @@ impl TomlManifest {
1874
1876
description : project
1875
1877
. description
1876
1878
. clone ( )
1877
- . map ( |mw| {
1878
- mw. resolve ( & features, "description" , || {
1879
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1880
- . description ( )
1881
- } )
1882
- } )
1879
+ . map ( |mw| mw. resolve ( & features, "description" , || inherit ( ) ?. description ( ) ) )
1883
1880
. transpose ( ) ?,
1884
1881
homepage : project
1885
1882
. homepage
1886
1883
. clone ( )
1887
- . map ( |mw| {
1888
- mw. resolve ( & features, "homepage" , || {
1889
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. homepage ( )
1890
- } )
1891
- } )
1884
+ . map ( |mw| mw. resolve ( & features, "homepage" , || inherit ( ) ?. homepage ( ) ) )
1892
1885
. transpose ( ) ?,
1893
1886
documentation : project
1894
1887
. documentation
1895
1888
. clone ( )
1896
- . map ( |mw| {
1897
- mw. resolve ( & features, "documentation" , || {
1898
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1899
- . documentation ( )
1900
- } )
1901
- } )
1889
+ . map ( |mw| mw. resolve ( & features, "documentation" , || inherit ( ) ?. documentation ( ) ) )
1902
1890
. transpose ( ) ?,
1903
1891
readme : readme_for_project (
1904
1892
package_root,
1905
1893
project
1906
1894
. readme
1907
1895
. clone ( )
1908
- . map ( |mw| {
1909
- mw. resolve ( & features, "readme" , || {
1910
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1911
- . readme ( package_root)
1912
- } )
1913
- } )
1896
+ . map ( |mw| mw. resolve ( & features, "readme" , || inherit ( ) ?. readme ( package_root) ) )
1914
1897
. transpose ( ) ?,
1915
1898
) ,
1916
1899
authors : project
1917
1900
. authors
1918
1901
. clone ( )
1919
- . map ( |mw| {
1920
- mw. resolve ( & features, "authors" , || {
1921
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. authors ( )
1922
- } )
1923
- } )
1902
+ . map ( |mw| mw. resolve ( & features, "authors" , || inherit ( ) ?. authors ( ) ) )
1924
1903
. transpose ( ) ?
1925
1904
. unwrap_or_default ( ) ,
1926
1905
license : project
1927
1906
. license
1928
1907
. clone ( )
1929
- . map ( |mw| {
1930
- mw. resolve ( & features, "license" , || {
1931
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. license ( )
1932
- } )
1933
- } )
1908
+ . map ( |mw| mw. resolve ( & features, "license" , || inherit ( ) ?. license ( ) ) )
1934
1909
. transpose ( ) ?,
1935
1910
license_file : project
1936
1911
. license_file
1937
1912
. clone ( )
1938
1913
. map ( |mw| {
1939
1914
mw. resolve ( & features, "license" , || {
1940
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1941
- . license_file ( package_root)
1915
+ inherit ( ) ?. license_file ( package_root)
1942
1916
} )
1943
1917
} )
1944
1918
. transpose ( ) ?,
1945
1919
repository : project
1946
1920
. repository
1947
1921
. clone ( )
1948
- . map ( |mw| {
1949
- mw. resolve ( & features, "repository" , || {
1950
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1951
- . repository ( )
1952
- } )
1953
- } )
1922
+ . map ( |mw| mw. resolve ( & features, "repository" , || inherit ( ) ?. repository ( ) ) )
1954
1923
. transpose ( ) ?,
1955
1924
keywords : project
1956
1925
. keywords
1957
1926
. clone ( )
1958
- . map ( |mw| {
1959
- mw. resolve ( & features, "keywords" , || {
1960
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. keywords ( )
1961
- } )
1962
- } )
1927
+ . map ( |mw| mw. resolve ( & features, "keywords" , || inherit ( ) ?. keywords ( ) ) )
1963
1928
. transpose ( ) ?
1964
1929
. unwrap_or_default ( ) ,
1965
1930
categories : project
1966
1931
. categories
1967
1932
. clone ( )
1968
- . map ( |mw| {
1969
- mw. resolve ( & features, "categories" , || {
1970
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?
1971
- . categories ( )
1972
- } )
1973
- } )
1933
+ . map ( |mw| mw. resolve ( & features, "categories" , || inherit ( ) ?. categories ( ) ) )
1974
1934
. transpose ( ) ?
1975
1935
. unwrap_or_default ( ) ,
1976
1936
badges : me
1977
1937
. badges
1978
1938
. clone ( )
1979
- . map ( |mw| {
1980
- mw. resolve ( & features, "badges" , || {
1981
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. badges ( )
1982
- } )
1983
- } )
1939
+ . map ( |mw| mw. resolve ( & features, "badges" , || inherit ( ) ?. badges ( ) ) )
1984
1940
. transpose ( ) ?
1985
1941
. unwrap_or_default ( ) ,
1986
1942
links : project. links . clone ( ) ,
@@ -2042,9 +1998,7 @@ impl TomlManifest {
2042
1998
2043
1999
let publish = project. publish . clone ( ) . map ( |publish| {
2044
2000
publish
2045
- . resolve ( & features, "publish" , || {
2046
- get_ws ( config, resolved_path. clone ( ) , workspace_config. clone ( ) ) ?. publish ( )
2047
- } )
2001
+ . resolve ( & features, "publish" , || inherit ( ) ?. publish ( ) )
2048
2002
. unwrap ( )
2049
2003
} ) ;
2050
2004
@@ -2490,7 +2444,7 @@ impl TomlDependency {
2490
2444
cargo_features : & Features ,
2491
2445
label : & str ,
2492
2446
cx : & mut Context < ' _ , ' _ > ,
2493
- get_inheritable : impl FnOnce ( ) -> CargoResult < InheritableFields > ,
2447
+ get_inheritable : impl FnOnce ( ) -> CargoResult < & ' a InheritableFields > ,
2494
2448
) -> CargoResult < TomlDependency > {
2495
2449
match self {
2496
2450
TomlDependency :: Detailed ( d) => Ok ( TomlDependency :: Detailed ( d) ) ,
0 commit comments