@@ -15,6 +15,7 @@ use deno_semver::VersionReq;
15
15
use deno_terminal:: colors;
16
16
17
17
use super :: deps:: Dep ;
18
+ use super :: deps:: DepId ;
18
19
use super :: deps:: DepManager ;
19
20
use super :: deps:: DepManagerArgs ;
20
21
use super :: deps:: PackageLatestVersion ;
@@ -242,8 +243,11 @@ pub async fn outdated(
242
243
deps. resolve_versions ( ) . await ?;
243
244
244
245
match update_flags. kind {
245
- crate :: args:: OutdatedKind :: Update { latest } => {
246
- update ( deps, latest, & filter_set, flags) . await ?;
246
+ crate :: args:: OutdatedKind :: Update {
247
+ latest,
248
+ interactive,
249
+ } => {
250
+ update ( deps, latest, & filter_set, interactive, flags) . await ?;
247
251
}
248
252
crate :: args:: OutdatedKind :: PrintOutdated { compatible } => {
249
253
print_outdated ( & mut deps, compatible) ?;
@@ -301,9 +305,10 @@ async fn update(
301
305
mut deps : DepManager ,
302
306
update_to_latest : bool ,
303
307
filter_set : & filter:: FilterSet ,
308
+ interactive : bool ,
304
309
flags : Arc < Flags > ,
305
310
) -> Result < ( ) , AnyError > {
306
- let mut updated = Vec :: new ( ) ;
311
+ let mut to_update = Vec :: new ( ) ;
307
312
308
313
for ( dep_id, resolved, latest_versions) in deps
309
314
. deps_with_resolved_latest_versions ( )
@@ -322,19 +327,66 @@ async fn update(
322
327
continue ;
323
328
} ;
324
329
325
- updated . push ( (
330
+ to_update . push ( (
326
331
dep_id,
327
332
format ! ( "{}:{}" , dep. kind. scheme( ) , dep. req. name) ,
328
333
deps. resolved_version ( dep. id ) . cloned ( ) ,
329
334
new_version_req. clone ( ) ,
330
335
) ) ;
336
+ }
331
337
332
- deps. update_dep ( dep_id, new_version_req) ;
338
+ if interactive {
339
+ let selected = interactive:: select_interactive (
340
+ to_update
341
+ . iter ( )
342
+ . map (
343
+ |( dep_id, _, current_version, new_req) : & (
344
+ DepId ,
345
+ String ,
346
+ Option < PackageNv > ,
347
+ VersionReq ,
348
+ ) | {
349
+ let dep = deps. get_dep ( * dep_id) ;
350
+ interactive:: PackageInfo {
351
+ location : dep. location . clone ( ) ,
352
+ current_version : current_version
353
+ . as_ref ( )
354
+ . map ( |nv| nv. version . to_string ( ) )
355
+ . unwrap_or_default ( ) ,
356
+ name : dep
357
+ . alias
358
+ . as_ref ( )
359
+ . cloned ( )
360
+ . unwrap_or_else ( || dep. req . name . to_string ( ) ) ,
361
+ kind : dep. kind ,
362
+ new_version : new_req
363
+ . version_text ( )
364
+ . trim_start_matches ( '^' )
365
+ . to_string ( ) ,
366
+ }
367
+ } ,
368
+ )
369
+ . collect ( ) ,
370
+ ) ?;
371
+ if let Some ( selected) = selected {
372
+ let mut i = 0 ;
373
+ to_update. retain ( |_| {
374
+ let keep = selected. contains ( & i) ;
375
+ i += 1 ;
376
+ keep
377
+ } ) ;
378
+ } else {
379
+ log:: info!( "Cancelled, not updating" ) ;
380
+ return Ok ( ( ) ) ;
381
+ }
382
+ }
383
+ for ( dep_id, _, _, new_version_req) in & to_update {
384
+ deps. update_dep ( * dep_id, new_version_req. clone ( ) ) ;
333
385
}
334
386
335
387
deps. commit_changes ( ) ?;
336
388
337
- if !updated . is_empty ( ) {
389
+ if !to_update . is_empty ( ) {
338
390
let factory = super :: npm_install_after_modification (
339
391
flags. clone ( ) ,
340
392
Some ( deps. jsr_fetch_resolver . clone ( ) ) ,
@@ -354,7 +406,7 @@ async fn update(
354
406
let mut deps = deps. reloaded_after_modification ( args) ;
355
407
deps. resolve_current_versions ( ) . await ?;
356
408
for ( dep_id, package_name, maybe_current_version, new_version_req) in
357
- updated
409
+ to_update
358
410
{
359
411
if let Some ( nv) = deps. resolved_version ( dep_id) {
360
412
updated_to_versions. insert ( (
0 commit comments