@@ -189,14 +189,7 @@ fn print_lockfile_update(
189189 && candidate. minor == current. minor
190190 && candidate. patch == current. patch ) )
191191 }
192- let possibilities = if let Some ( query) = [ diff. added . iter ( ) , diff. unchanged . iter ( ) ]
193- . into_iter ( )
194- . flatten ( )
195- . next ( )
196- . filter ( |s| s. source_id ( ) . is_registry ( ) )
197- {
198- let query =
199- crate :: core:: dependency:: Dependency :: parse ( query. name ( ) , None , query. source_id ( ) ) ?;
192+ let possibilities = if let Some ( query) = diff. alternatives_query ( ) {
200193 loop {
201194 match registry. query_vec ( & query, QueryKind :: Exact ) {
202195 std:: task:: Poll :: Ready ( res) => {
@@ -320,6 +313,7 @@ fn fill_with_deps<'a>(
320313 }
321314}
322315
316+ /// All resolved versions of a package name within a [`SourceId`]
323317#[ derive( Default , Clone , Debug ) ]
324318pub struct PackageDiff {
325319 removed : Vec < PackageId > ,
@@ -405,4 +399,25 @@ impl PackageDiff {
405399
406400 changes. into_iter ( ) . map ( |( _, v) | v) . collect ( )
407401 }
402+
403+ /// For querying [`PackageRegistry`] for alternative versions to report to the user
404+ pub fn alternatives_query ( & self ) -> Option < crate :: core:: dependency:: Dependency > {
405+ let package_id = [
406+ self . added . iter ( ) ,
407+ self . unchanged . iter ( ) ,
408+ self . removed . iter ( ) ,
409+ ]
410+ . into_iter ( )
411+ . flatten ( )
412+ . next ( )
413+ // Limit to registry as that is the only source with meaningful alternative versions
414+ . filter ( |s| s. source_id ( ) . is_registry ( ) ) ?;
415+ let query = crate :: core:: dependency:: Dependency :: parse (
416+ package_id. name ( ) ,
417+ None ,
418+ package_id. source_id ( ) ,
419+ )
420+ . expect ( "already a valid dependency" ) ;
421+ Some ( query)
422+ }
408423}
0 commit comments