@@ -178,42 +178,43 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
178178 && candidate. minor == current. minor
179179 && candidate. patch == current. patch ) )
180180 }
181-
182- let highest_present = [ added. iter ( ) . rev ( ) . next ( ) , unchanged. iter ( ) . rev ( ) . next ( ) ]
181+ let possibilities = if let Some ( query) = [ added. iter ( ) , unchanged. iter ( ) ]
183182 . into_iter ( )
184183 . flatten ( )
185- . max_by_key ( |s| s . version ( ) ) ;
186- let latest = if let Some ( present ) = highest_present . filter ( |p| p . source_id ( ) . is_registry ( ) )
184+ . next ( )
185+ . filter ( |s| s . source_id ( ) . is_registry ( ) )
187186 {
188- let query = crate :: core:: dependency:: Dependency :: parse (
189- present. name ( ) ,
190- None ,
191- present. source_id ( ) ,
192- ) ?;
193- let possibilities = loop {
187+ let query =
188+ crate :: core:: dependency:: Dependency :: parse ( query. name ( ) , None , query. source_id ( ) ) ?;
189+ loop {
194190 match registry. query_vec ( & query, QueryKind :: Exact ) {
195191 std:: task:: Poll :: Ready ( res) => {
196192 break res?;
197193 }
198194 std:: task:: Poll :: Pending => registry. block_until_ready ( ) ?,
199195 }
200- } ;
201- let present_version = present. version ( ) ;
202- possibilities
203- . iter ( )
204- . map ( |s| s. as_summary ( ) )
205- . filter ( |s| is_latest ( s. version ( ) , present_version) )
206- . map ( |s| s. version ( ) . clone ( ) )
207- . max ( )
208- . map ( format_latest)
196+ }
209197 } else {
210- None
211- }
212- . unwrap_or_default ( ) ;
198+ vec ! [ ]
199+ } ;
213200
214201 if removed. len ( ) == 1 && added. len ( ) == 1 {
215202 let added = added. into_iter ( ) . next ( ) . unwrap ( ) ;
216203 let removed = removed. into_iter ( ) . next ( ) . unwrap ( ) ;
204+
205+ let latest = if !possibilities. is_empty ( ) {
206+ possibilities
207+ . iter ( )
208+ . map ( |s| s. as_summary ( ) )
209+ . filter ( |s| is_latest ( s. version ( ) , added. version ( ) ) )
210+ . map ( |s| s. version ( ) . clone ( ) )
211+ . max ( )
212+ . map ( format_latest)
213+ } else {
214+ None
215+ }
216+ . unwrap_or_default ( ) ;
217+
217218 let msg = if removed. source_id ( ) . is_git ( ) {
218219 format ! (
219220 "{removed} -> #{}" ,
@@ -237,20 +238,45 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
237238 print_change ( "Removing" , format ! ( "{package}" ) , & style:: ERROR ) ?;
238239 }
239240 for package in added. iter ( ) {
241+ let latest = if !possibilities. is_empty ( ) {
242+ possibilities
243+ . iter ( )
244+ . map ( |s| s. as_summary ( ) )
245+ . filter ( |s| is_latest ( s. version ( ) , package. version ( ) ) )
246+ . map ( |s| s. version ( ) . clone ( ) )
247+ . max ( )
248+ . map ( format_latest)
249+ } else {
250+ None
251+ }
252+ . unwrap_or_default ( ) ;
253+
240254 print_change ( "Adding" , format ! ( "{package}{latest}" ) , & style:: NOTE ) ?;
241255 }
242256 }
243- if !latest. is_empty ( ) {
244- if opts. config . shell ( ) . verbosity ( ) == Verbosity :: Verbose {
245- for package in & unchanged {
257+ for package in & unchanged {
258+ let latest = if !possibilities. is_empty ( ) {
259+ possibilities
260+ . iter ( )
261+ . map ( |s| s. as_summary ( ) )
262+ . filter ( |s| is_latest ( s. version ( ) , package. version ( ) ) )
263+ . map ( |s| s. version ( ) . clone ( ) )
264+ . max ( )
265+ . map ( format_latest)
266+ } else {
267+ None
268+ } ;
269+
270+ if let Some ( latest) = latest {
271+ unchanged_behind += 1 ;
272+ if opts. config . shell ( ) . verbosity ( ) == Verbosity :: Verbose {
246273 opts. config . shell ( ) . status_with_color (
247274 "Unchanged" ,
248275 format ! ( "{package}{latest}" ) ,
249276 & anstyle:: Style :: new ( ) . bold ( ) ,
250277 ) ?;
251278 }
252279 }
253- unchanged_behind += unchanged. len ( ) ;
254280 }
255281 }
256282 if opts. config . shell ( ) . verbosity ( ) == Verbosity :: Verbose {
0 commit comments