@@ -1682,10 +1682,11 @@ impl Package {
1682
1682
Source :: Path ( path) => {
1683
1683
let filename: WheelFilename =
1684
1684
self . wheels [ best_wheel_index] . filename . clone ( ) ;
1685
+ let install_path = absolute_path ( workspace_root, path) ?;
1685
1686
let path_dist = PathBuiltDist {
1686
1687
filename,
1687
- url : verbatim_url ( workspace_root . join ( path ) , & self . id ) ?,
1688
- install_path : workspace_root . join ( path) ,
1688
+ url : verbatim_url ( & install_path , & self . id ) ?,
1689
+ install_path : absolute_path ( workspace_root , path) ? ,
1689
1690
} ;
1690
1691
let built_dist = BuiltDist :: Path ( path_dist) ;
1691
1692
Ok ( Dist :: Built ( built_dist) )
@@ -1780,40 +1781,44 @@ impl Package {
1780
1781
let DistExtension :: Source ( ext) = DistExtension :: from_path ( path) ? else {
1781
1782
return Ok ( None ) ;
1782
1783
} ;
1784
+ let install_path = absolute_path ( workspace_root, path) ?;
1783
1785
let path_dist = PathSourceDist {
1784
1786
name : self . id . name . clone ( ) ,
1785
1787
version : Some ( self . id . version . clone ( ) ) ,
1786
- url : verbatim_url ( workspace_root . join ( path ) , & self . id ) ?,
1787
- install_path : workspace_root . join ( path ) ,
1788
+ url : verbatim_url ( & install_path , & self . id ) ?,
1789
+ install_path,
1788
1790
ext,
1789
1791
} ;
1790
1792
uv_distribution_types:: SourceDist :: Path ( path_dist)
1791
1793
}
1792
1794
Source :: Directory ( path) => {
1795
+ let install_path = absolute_path ( workspace_root, path) ?;
1793
1796
let dir_dist = DirectorySourceDist {
1794
1797
name : self . id . name . clone ( ) ,
1795
- url : verbatim_url ( workspace_root . join ( path ) , & self . id ) ?,
1796
- install_path : workspace_root . join ( path ) ,
1798
+ url : verbatim_url ( & install_path , & self . id ) ?,
1799
+ install_path,
1797
1800
editable : false ,
1798
1801
r#virtual : false ,
1799
1802
} ;
1800
1803
uv_distribution_types:: SourceDist :: Directory ( dir_dist)
1801
1804
}
1802
1805
Source :: Editable ( path) => {
1806
+ let install_path = absolute_path ( workspace_root, path) ?;
1803
1807
let dir_dist = DirectorySourceDist {
1804
1808
name : self . id . name . clone ( ) ,
1805
- url : verbatim_url ( workspace_root . join ( path ) , & self . id ) ?,
1806
- install_path : workspace_root . join ( path ) ,
1809
+ url : verbatim_url ( & install_path , & self . id ) ?,
1810
+ install_path,
1807
1811
editable : true ,
1808
1812
r#virtual : false ,
1809
1813
} ;
1810
1814
uv_distribution_types:: SourceDist :: Directory ( dir_dist)
1811
1815
}
1812
1816
Source :: Virtual ( path) => {
1817
+ let install_path = absolute_path ( workspace_root, path) ?;
1813
1818
let dir_dist = DirectorySourceDist {
1814
1819
name : self . id . name . clone ( ) ,
1815
- url : verbatim_url ( workspace_root . join ( path ) , & self . id ) ?,
1816
- install_path : workspace_root . join ( path ) ,
1820
+ url : verbatim_url ( & install_path , & self . id ) ?,
1821
+ install_path,
1817
1822
editable : false ,
1818
1823
r#virtual : true ,
1819
1824
} ;
@@ -2181,15 +2186,21 @@ impl Package {
2181
2186
}
2182
2187
2183
2188
/// Attempts to construct a `VerbatimUrl` from the given `Path`.
2184
- fn verbatim_url ( path : PathBuf , id : & PackageId ) -> Result < VerbatimUrl , LockError > {
2189
+ fn verbatim_url ( path : & Path , id : & PackageId ) -> Result < VerbatimUrl , LockError > {
2185
2190
let url = VerbatimUrl :: from_absolute_path ( path) . map_err ( |err| LockErrorKind :: VerbatimUrl {
2186
2191
id : id. clone ( ) ,
2187
2192
err,
2188
2193
} ) ?;
2189
-
2190
2194
Ok ( url)
2191
2195
}
2192
2196
2197
+ /// Attempts to construct an absolute path from the given `Path`.
2198
+ fn absolute_path ( workspace_root : & Path , path : & Path ) -> Result < PathBuf , LockError > {
2199
+ let path = uv_fs:: normalize_absolute_path ( & workspace_root. join ( path) )
2200
+ . map_err ( LockErrorKind :: AbsolutePath ) ?;
2201
+ Ok ( path)
2202
+ }
2203
+
2193
2204
#[ derive( Clone , Debug , serde:: Deserialize ) ]
2194
2205
#[ serde( rename_all = "kebab-case" ) ]
2195
2206
struct PackageWire {
@@ -4059,6 +4070,13 @@ enum LockErrorKind {
4059
4070
#[ source]
4060
4071
std:: io:: Error ,
4061
4072
) ,
4073
+ /// An error that occurs when converting a lockfile path from relative to absolute.
4074
+ #[ error( "Could not compute absolute path from workspace root and lockfile path" ) ]
4075
+ AbsolutePath (
4076
+ /// The inner error we forward.
4077
+ #[ source]
4078
+ std:: io:: Error ,
4079
+ ) ,
4062
4080
/// An error that occurs when an ambiguous `package.dependency` is
4063
4081
/// missing a `version` field.
4064
4082
#[ error(
0 commit comments