@@ -10,14 +10,10 @@ use crate::{
1010 manifest:: { self , Manifest } ,
1111} ;
1212
13- pub fn resolve ( manifest : & Manifest , previous_lock : Option < & Lock > , index : & Index ) -> Result < Lock > {
13+ pub fn resolve ( manifest : & Manifest , lock : Option < & Lock > , index : & Index ) -> Result < Lock > {
1414 log:: trace!(
1515 "Resolving dependency tree{}" ,
16- if previous_lock. is_some( ) {
17- " with previous lock"
18- } else {
19- ""
20- }
16+ if lock. is_some( ) { " with lock" } else { "" }
2117 ) ;
2218
2319 // Add the root dependencies.
@@ -26,7 +22,7 @@ pub fn resolve(manifest: &Manifest, previous_lock: Option<&Lock>, index: &Index)
2622 . iter ( )
2723 . filter_map ( |( name, dep) | {
2824 if let manifest:: Dependency :: Simple ( req) = dep {
29- Some ( Candidate :: new ( name, req, index) )
25+ Some ( Candidate :: new ( name, req, index, lock ) )
3026 } else {
3127 None
3228 }
@@ -85,7 +81,7 @@ pub fn resolve(manifest: &Manifest, previous_lock: Option<&Lock>, index: &Index)
8581
8682 candidates. extend (
8783 deps. iter ( )
88- . map ( |( dep, req) | Candidate :: new ( dep, req, index) ) ,
84+ . map ( |( dep, req) | Candidate :: new ( dep, req, index, lock ) ) ,
8985 ) ;
9086
9187 // "Commit" this candidate to the list of candidates.
@@ -111,7 +107,7 @@ pub fn resolve(manifest: &Manifest, previous_lock: Option<&Lock>, index: &Index)
111107 // unset the version and make sure it is ready for
112108 // picking another version.
113109 candidates[ i] . version = None ;
114- candidates[ i] . update_available_versions ( index) ;
110+ candidates[ i] . update_available_versions ( index, lock ) ;
115111 }
116112
117113 i -= 1 ;
@@ -162,7 +158,7 @@ pub fn resolve(manifest: &Manifest, previous_lock: Option<&Lock>, index: &Index)
162158 candidates. extend (
163159 missing_dependencies
164160 . iter ( )
165- . map ( |( dep, req) | Candidate :: new ( dep, req, index) ) ,
161+ . map ( |( dep, req) | Candidate :: new ( dep, req, index, lock ) ) ,
166162 ) ;
167163 }
168164 }
@@ -192,18 +188,18 @@ struct Candidate {
192188}
193189
194190impl Candidate {
195- pub fn new ( name : & str , req : & VersionReq , index : & Index ) -> Self {
191+ pub fn new ( name : & str , req : & VersionReq , index : & Index , lock : Option < & Lock > ) -> Self {
196192 let mut candidate = Self {
197193 name : name. to_owned ( ) ,
198194 req : req. clone ( ) ,
199195 version : None ,
200196 available_versions : Vec :: new ( ) ,
201197 } ;
202- candidate. update_available_versions ( index) ;
198+ candidate. update_available_versions ( index, lock ) ;
203199 candidate
204200 }
205201
206- pub fn update_available_versions ( & mut self , index : & Index ) {
202+ pub fn update_available_versions ( & mut self , index : & Index , lock : Option < & Lock > ) {
207203 self . available_versions . clear ( ) ;
208204 if let Some ( entry) = index. get ( & self . name ) {
209205 self . available_versions . extend (
@@ -215,6 +211,14 @@ impl Candidate {
215211 . sorted_unstable_by ( |v1, v2| v1. cmp ( & v2) ) ,
216212 ) ;
217213 }
214+
215+ if let Some ( version) = lock
216+ . and_then ( |lock| lock. get ( & self . name ) )
217+ . and_then ( |locked_versions| locked_versions. iter ( ) . find ( |& v| self . req . matches ( v) ) )
218+ {
219+ // Push the locked version to the top so it gets tried first.
220+ self . available_versions . push ( version. clone ( ) ) ;
221+ }
218222 }
219223}
220224
0 commit comments