@@ -178,42 +178,43 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
178
178
&& candidate. minor == current. minor
179
179
&& candidate. patch == current. patch ) )
180
180
}
181
-
182
- let highest_present = [ added. iter ( ) . rev ( ) . next ( ) , unchanged. iter ( ) . rev ( ) . next ( ) ]
181
+ let possibilities = if let Some ( query) = [ added. iter ( ) , unchanged. iter ( ) ]
183
182
. into_iter ( )
184
183
. 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 ( ) )
187
186
{
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 {
194
190
match registry. query_vec ( & query, QueryKind :: Exact ) {
195
191
std:: task:: Poll :: Ready ( res) => {
196
192
break res?;
197
193
}
198
194
std:: task:: Poll :: Pending => registry. block_until_ready ( ) ?,
199
195
}
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
+ }
209
197
} else {
210
- None
211
- }
212
- . unwrap_or_default ( ) ;
198
+ vec ! [ ]
199
+ } ;
213
200
214
201
if removed. len ( ) == 1 && added. len ( ) == 1 {
215
202
let added = added. into_iter ( ) . next ( ) . unwrap ( ) ;
216
203
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
+
217
218
let msg = if removed. source_id ( ) . is_git ( ) {
218
219
format ! (
219
220
"{removed} -> #{}" ,
@@ -237,20 +238,45 @@ pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoRes
237
238
print_change ( "Removing" , format ! ( "{package}" ) , & style:: ERROR ) ?;
238
239
}
239
240
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
+
240
254
print_change ( "Adding" , format ! ( "{package}{latest}" ) , & style:: NOTE ) ?;
241
255
}
242
256
}
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 {
246
273
opts. config . shell ( ) . status_with_color (
247
274
"Unchanged" ,
248
275
format ! ( "{package}{latest}" ) ,
249
276
& anstyle:: Style :: new ( ) . bold ( ) ,
250
277
) ?;
251
278
}
252
279
}
253
- unchanged_behind += unchanged. len ( ) ;
254
280
}
255
281
}
256
282
if opts. config . shell ( ) . verbosity ( ) == Verbosity :: Verbose {
0 commit comments