1
1
use std:: io;
2
2
3
3
use clap:: { Args , Subcommand } ;
4
+ use cross:: docker:: ImagePlatform ;
5
+ use cross:: rustc:: { QualifiedToolchain , Toolchain } ;
4
6
use cross:: shell:: { MessageInfo , Stream } ;
5
7
use cross:: { docker, CommandExt , TargetTriple } ;
6
- use cross:: {
7
- docker:: ImagePlatform ,
8
- rustc:: { QualifiedToolchain , Toolchain } ,
9
- } ;
10
8
11
9
#[ derive( Args , Debug ) ]
12
10
pub struct ListVolumes {
@@ -105,7 +103,7 @@ pub struct CreateVolume {
105
103
pub engine : Option < String > ,
106
104
/// Toolchain to create a volume for
107
105
#[ clap( long, default_value = TargetTriple :: DEFAULT . triple( ) , ) ]
108
- pub toolchain : TargetTriple ,
106
+ pub toolchain : String ,
109
107
}
110
108
111
109
impl CreateVolume {
@@ -141,7 +139,7 @@ pub struct RemoveVolume {
141
139
pub engine : Option < String > ,
142
140
/// Toolchain to remove the volume for
143
141
#[ clap( long, default_value = TargetTriple :: DEFAULT . triple( ) , ) ]
144
- pub toolchain : TargetTriple ,
142
+ pub toolchain : String ,
145
143
}
146
144
147
145
impl RemoveVolume {
@@ -321,11 +319,12 @@ fn get_cross_volumes(
321
319
engine : & docker:: Engine ,
322
320
msg_info : & mut MessageInfo ,
323
321
) -> cross:: Result < Vec < String > > {
322
+ use cross:: docker:: remote:: VOLUME_PREFIX ;
324
323
let stdout = docker:: subcommand ( engine, "volume" )
325
324
. arg ( "list" )
326
- . args ( & [ "--format" , "{{.Name}}" ] )
325
+ . args ( [ "--format" , "{{.Name}}" ] )
327
326
// handles simple regex: ^ for start of line.
328
- . args ( & [ "--filter" , "name=^cross-" ] )
327
+ . args ( [ "--filter" , & format ! ( "name=^{VOLUME_PREFIX}" ) ] )
329
328
. run_and_get_stdout ( msg_info) ?;
330
329
331
330
let mut volumes: Vec < String > = stdout. lines ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
@@ -372,7 +371,7 @@ pub fn prune_volumes(
372
371
msg_info : & mut MessageInfo ,
373
372
) -> cross:: Result < ( ) > {
374
373
let mut command = docker:: subcommand ( engine, "volume" ) ;
375
- command. args ( & [ "prune" , "--force" ] ) ;
374
+ command. args ( [ "prune" , "--force" ] ) ;
376
375
if execute {
377
376
command. run ( msg_info, false ) . map_err ( Into :: into)
378
377
} else {
@@ -392,25 +391,21 @@ pub fn create_persistent_volume(
392
391
channel : Option < & Toolchain > ,
393
392
msg_info : & mut MessageInfo ,
394
393
) -> cross:: Result < ( ) > {
395
- let config = cross:: config:: Config :: new ( None ) ;
396
- let toolchain_host: cross:: Target = toolchain. into ( ) ;
397
- let mut toolchain = QualifiedToolchain :: default ( & config, msg_info) ?;
398
- toolchain. replace_host ( & ImagePlatform :: from_target (
399
- toolchain_host. target ( ) . clone ( ) ,
400
- ) ?) ;
394
+ let mut toolchain = toolchain_or_target ( & toolchain, msg_info) ?;
401
395
if let Some ( channel) = channel {
402
- toolchain = toolchain . with_picked ( & config , channel. clone ( ) , msg_info ) ? ;
396
+ toolchain. channel = channel . channel . clone ( ) ;
403
397
} ;
404
398
let ( dirs, metadata) = docker:: get_package_info ( engine, toolchain. clone ( ) , msg_info) ?;
405
- let container = docker:: remote:: unique_container_identifier ( & toolchain_host, & metadata, & dirs) ?;
399
+ let container =
400
+ docker:: remote:: unique_container_identifier ( & toolchain. host ( ) . target , & metadata, & dirs) ?;
406
401
let volume = dirs. toolchain . unique_toolchain_identifier ( ) ?;
407
402
408
403
if docker:: remote:: volume_exists ( engine, & volume, msg_info) ? {
409
404
eyre:: bail!( "Error: volume {volume} already exists." ) ;
410
405
}
411
406
412
407
docker:: subcommand ( engine, "volume" )
413
- . args ( & [ "create" , & volume] )
408
+ . args ( [ "create" , & volume] )
414
409
. run_and_get_status ( msg_info, false ) ?;
415
410
416
411
// stop the container if it's already running
@@ -427,9 +422,9 @@ pub fn create_persistent_volume(
427
422
// create a dummy running container to copy data over
428
423
let mount_prefix = docker:: remote:: MOUNT_PREFIX ;
429
424
let mut docker = docker:: subcommand ( engine, "run" ) ;
430
- docker. args ( & [ "--name" , & container] ) ;
425
+ docker. args ( [ "--name" , & container] ) ;
431
426
docker. arg ( "--rm" ) ;
432
- docker. args ( & [ "-v" , & format ! ( "{}:{}" , volume, mount_prefix) ] ) ;
427
+ docker. args ( [ "-v" , & format ! ( "{}:{}" , volume, mount_prefix) ] ) ;
433
428
docker. arg ( "-d" ) ;
434
429
let is_tty = io:: Stdin :: is_atty ( ) && io:: Stdout :: is_atty ( ) && io:: Stderr :: is_atty ( ) ;
435
430
if is_tty {
@@ -442,7 +437,7 @@ pub fn create_persistent_volume(
442
437
// a TTY. this has a few issues though: now, the
443
438
// container no longer responds to signals, so the
444
439
// container will need to be sig-killed.
445
- docker. args ( & [ "sh" , "-c" , "sleep infinity" ] ) ;
440
+ docker. args ( [ "sh" , "-c" , "sleep infinity" ] ) ;
446
441
}
447
442
// store first, since failing to non-existing container is fine
448
443
docker:: remote:: create_container_deleter ( engine. clone ( ) , container. clone ( ) ) ;
@@ -483,14 +478,11 @@ pub fn remove_persistent_volume(
483
478
channel : Option < & Toolchain > ,
484
479
msg_info : & mut MessageInfo ,
485
480
) -> cross:: Result < ( ) > {
486
- let config = cross:: config:: Config :: new ( None ) ;
487
- let target_host: cross:: Target = toolchain. into ( ) ;
488
- let mut toolchain = QualifiedToolchain :: default ( & config, msg_info) ?;
489
- toolchain. replace_host ( & ImagePlatform :: from_target ( target_host. target ( ) . clone ( ) ) ?) ;
481
+ let mut toolchain = toolchain_or_target ( & toolchain, msg_info) ?;
490
482
if let Some ( channel) = channel {
491
- toolchain = toolchain . with_picked ( & config , channel. clone ( ) , msg_info ) ? ;
483
+ toolchain. channel = channel . channel . clone ( ) ;
492
484
} ;
493
- let ( dirs, _) = docker:: get_package_info ( engine, toolchain. clone ( ) , msg_info) ?;
485
+ let ( dirs, _) = docker:: get_package_info ( engine, toolchain, msg_info) ?;
494
486
let volume = dirs. toolchain . unique_toolchain_identifier ( ) ?;
495
487
496
488
if !docker:: remote:: volume_exists ( engine, & volume, msg_info) ? {
@@ -506,11 +498,12 @@ fn get_cross_containers(
506
498
engine : & docker:: Engine ,
507
499
msg_info : & mut MessageInfo ,
508
500
) -> cross:: Result < Vec < String > > {
501
+ use cross:: docker:: remote:: VOLUME_PREFIX ;
509
502
let stdout = docker:: subcommand ( engine, "ps" )
510
503
. arg ( "-a" )
511
- . args ( & [ "--format" , "{{.Names}}: {{.State}}" ] )
504
+ . args ( [ "--format" , "{{.Names}}: {{.State}}" ] )
512
505
// handles simple regex: ^ for start of line.
513
- . args ( & [ "--filter" , "name=^cross-" ] )
506
+ . args ( [ "--filter" , & format ! ( "name=^{VOLUME_PREFIX}" ) ] )
514
507
. run_and_get_stdout ( msg_info) ?;
515
508
516
509
let mut containers: Vec < String > = stdout. lines ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
@@ -576,3 +569,20 @@ pub fn remove_all_containers(
576
569
577
570
Ok ( ( ) )
578
571
}
572
+
573
+ fn toolchain_or_target (
574
+ s : & str ,
575
+ msg_info : & mut MessageInfo ,
576
+ ) -> Result < QualifiedToolchain , color_eyre:: Report > {
577
+ let config = cross:: config:: Config :: new ( None ) ;
578
+ let mut toolchain = QualifiedToolchain :: default ( & config, msg_info) ?;
579
+ let target_list = cross:: rustc:: target_list ( msg_info) ?;
580
+ if target_list. contains ( s) {
581
+ toolchain. replace_host ( & ImagePlatform :: from_target ( s. into ( ) ) ?) ;
582
+ } else {
583
+ let picked: Toolchain = s. parse ( ) ?;
584
+ toolchain = toolchain. with_picked ( picked) ?;
585
+ }
586
+
587
+ Ok ( toolchain)
588
+ }
0 commit comments