1- use anyhow:: Context as _;
21use cargo_platform:: Platform ;
32use log:: trace;
4- use semver:: ReqParseError ;
53use semver:: VersionReq ;
64use serde:: ser;
75use serde:: Serialize ;
@@ -11,17 +9,17 @@ use std::rc::Rc;
119use crate :: core:: { PackageId , SourceId , Summary } ;
1210use crate :: util:: errors:: CargoResult ;
1311use crate :: util:: interning:: InternedString ;
14- use crate :: util:: Config ;
12+ use crate :: util:: OptVersionReq ;
1513
1614/// Information about a dependency requested by a Cargo manifest.
1715/// Cheap to copy.
18- #[ derive( PartialEq , Eq , Hash , Ord , PartialOrd , Clone , Debug ) ]
16+ #[ derive( PartialEq , Eq , Hash , Clone , Debug ) ]
1917pub struct Dependency {
2018 inner : Rc < Inner > ,
2119}
2220
2321/// The data underlying a `Dependency`.
24- #[ derive( PartialEq , Eq , Hash , Ord , PartialOrd , Clone , Debug ) ]
22+ #[ derive( PartialEq , Eq , Hash , Clone , Debug ) ]
2523struct Inner {
2624 name : InternedString ,
2725 source_id : SourceId ,
@@ -32,7 +30,7 @@ struct Inner {
3230 /// `registry` is specified. Or in the case of a crates.io dependency,
3331 /// `source_id` will be crates.io and this will be None.
3432 registry_id : Option < SourceId > ,
35- req : VersionReq ,
33+ req : OptVersionReq ,
3634 specified_req : bool ,
3735 kind : DepKind ,
3836 only_match_name : bool ,
@@ -99,52 +97,6 @@ pub enum DepKind {
9997 Build ,
10098}
10199
102- fn parse_req_with_deprecated (
103- name : InternedString ,
104- req : & str ,
105- extra : Option < ( PackageId , & Config ) > ,
106- ) -> CargoResult < VersionReq > {
107- match VersionReq :: parse ( req) {
108- Err ( ReqParseError :: DeprecatedVersionRequirement ( requirement) ) => {
109- let ( inside, config) = match extra {
110- Some ( pair) => pair,
111- None => return Err ( ReqParseError :: DeprecatedVersionRequirement ( requirement) . into ( ) ) ,
112- } ;
113- let msg = format ! (
114- "\
115- parsed version requirement `{}` is no longer valid
116-
117- Previous versions of Cargo accepted this malformed requirement,
118- but it is being deprecated. This was found when parsing the manifest
119- of {} {}, and the correct version requirement is `{}`.
120-
121- This will soon become a hard error, so it's either recommended to
122- update to a fixed version or contact the upstream maintainer about
123- this warning.
124- " ,
125- req,
126- inside. name( ) ,
127- inside. version( ) ,
128- requirement
129- ) ;
130- config. shell ( ) . warn ( & msg) ?;
131-
132- Ok ( requirement)
133- }
134- Err ( e) => {
135- let err: CargoResult < VersionReq > = Err ( e. into ( ) ) ;
136- let v: VersionReq = err. with_context ( || {
137- format ! (
138- "failed to parse the version requirement `{}` for dependency `{}`" ,
139- req, name
140- )
141- } ) ?;
142- Ok ( v)
143- }
144- Ok ( v) => Ok ( v) ,
145- }
146- }
147-
148100impl ser:: Serialize for DepKind {
149101 fn serialize < S > ( & self , s : S ) -> Result < S :: Ok , S :: Error >
150102 where
@@ -165,36 +117,19 @@ impl Dependency {
165117 name : impl Into < InternedString > ,
166118 version : Option < & str > ,
167119 source_id : SourceId ,
168- inside : PackageId ,
169- config : & Config ,
170- ) -> CargoResult < Dependency > {
171- let name = name. into ( ) ;
172- let arg = Some ( ( inside, config) ) ;
173- let ( specified_req, version_req) = match version {
174- Some ( v) => ( true , parse_req_with_deprecated ( name, v, arg) ?) ,
175- None => ( false , VersionReq :: any ( ) ) ,
176- } ;
177-
178- let mut ret = Dependency :: new_override ( name, source_id) ;
179- {
180- let ptr = Rc :: make_mut ( & mut ret. inner ) ;
181- ptr. only_match_name = false ;
182- ptr. req = version_req;
183- ptr. specified_req = specified_req;
184- }
185- Ok ( ret)
186- }
187-
188- /// Attempt to create a `Dependency` from an entry in the manifest.
189- pub fn parse_no_deprecated (
190- name : impl Into < InternedString > ,
191- version : Option < & str > ,
192- source_id : SourceId ,
193120 ) -> CargoResult < Dependency > {
194121 let name = name. into ( ) ;
195122 let ( specified_req, version_req) = match version {
196- Some ( v) => ( true , parse_req_with_deprecated ( name, v, None ) ?) ,
197- None => ( false , VersionReq :: any ( ) ) ,
123+ Some ( v) => match VersionReq :: parse ( v) {
124+ Ok ( req) => ( true , OptVersionReq :: Req ( req) ) ,
125+ Err ( err) => {
126+ return Err ( anyhow:: Error :: new ( err) . context ( format ! (
127+ "failed to parse the version requirement `{}` for dependency `{}`" ,
128+ v, name,
129+ ) ) )
130+ }
131+ } ,
132+ None => ( false , OptVersionReq :: Any ) ,
198133 } ;
199134
200135 let mut ret = Dependency :: new_override ( name, source_id) ;
@@ -214,7 +149,7 @@ impl Dependency {
214149 name,
215150 source_id,
216151 registry_id : None ,
217- req : VersionReq :: any ( ) ,
152+ req : OptVersionReq :: Any ,
218153 kind : DepKind :: Normal ,
219154 only_match_name : true ,
220155 optional : false ,
@@ -228,7 +163,7 @@ impl Dependency {
228163 }
229164 }
230165
231- pub fn version_req ( & self ) -> & VersionReq {
166+ pub fn version_req ( & self ) -> & OptVersionReq {
232167 & self . inner . req
233168 }
234169
@@ -365,7 +300,7 @@ impl Dependency {
365300
366301 /// Sets the version requirement for this dependency.
367302 pub fn set_version_req ( & mut self , req : VersionReq ) -> & mut Dependency {
368- Rc :: make_mut ( & mut self . inner ) . req = req;
303+ Rc :: make_mut ( & mut self . inner ) . req = OptVersionReq :: Req ( req) ;
369304 self
370305 }
371306
@@ -394,7 +329,7 @@ impl Dependency {
394329 id
395330 ) ;
396331 let me = Rc :: make_mut ( & mut self . inner ) ;
397- me. req = VersionReq :: exact ( id. version ( ) ) ;
332+ me. req = OptVersionReq :: exact ( id. version ( ) ) ;
398333
399334 // Only update the `precise` of this source to preserve other
400335 // information about dependency's source which may not otherwise be
0 commit comments