11use std:: io;
22
33use clap:: { Args , Subcommand } ;
4+ use cross:: docker:: ImagePlatform ;
5+ use cross:: rustc:: { QualifiedToolchain , Toolchain } ;
46use cross:: shell:: { MessageInfo , Stream } ;
57use cross:: { docker, CommandExt , TargetTriple } ;
6- use cross:: {
7- docker:: ImagePlatform ,
8- rustc:: { QualifiedToolchain , Toolchain } ,
9- } ;
108
119#[ derive( Args , Debug ) ]
1210pub struct ListVolumes {
@@ -105,7 +103,7 @@ pub struct CreateVolume {
105103 pub engine : Option < String > ,
106104 /// Toolchain to create a volume for
107105 #[ clap( long, default_value = TargetTriple :: DEFAULT . triple( ) , ) ]
108- pub toolchain : TargetTriple ,
106+ pub toolchain : String ,
109107}
110108
111109impl CreateVolume {
@@ -141,7 +139,7 @@ pub struct RemoveVolume {
141139 pub engine : Option < String > ,
142140 /// Toolchain to remove the volume for
143141 #[ clap( long, default_value = TargetTriple :: DEFAULT . triple( ) , ) ]
144- pub toolchain : TargetTriple ,
142+ pub toolchain : String ,
145143}
146144
147145impl RemoveVolume {
@@ -321,11 +319,12 @@ fn get_cross_volumes(
321319 engine : & docker:: Engine ,
322320 msg_info : & mut MessageInfo ,
323321) -> cross:: Result < Vec < String > > {
322+ use cross:: docker:: remote:: VOLUME_PREFIX ;
324323 let stdout = docker:: subcommand ( engine, "volume" )
325324 . arg ( "list" )
326- . args ( & [ "--format" , "{{.Name}}" ] )
325+ . args ( [ "--format" , "{{.Name}}" ] )
327326 // handles simple regex: ^ for start of line.
328- . args ( & [ "--filter" , "name=^cross-" ] )
327+ . args ( [ "--filter" , & format ! ( "name=^{VOLUME_PREFIX}" ) ] )
329328 . run_and_get_stdout ( msg_info) ?;
330329
331330 let mut volumes: Vec < String > = stdout. lines ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
@@ -372,7 +371,7 @@ pub fn prune_volumes(
372371 msg_info : & mut MessageInfo ,
373372) -> cross:: Result < ( ) > {
374373 let mut command = docker:: subcommand ( engine, "volume" ) ;
375- command. args ( & [ "prune" , "--force" ] ) ;
374+ command. args ( [ "prune" , "--force" ] ) ;
376375 if execute {
377376 command. run ( msg_info, false ) . map_err ( Into :: into)
378377 } else {
@@ -392,25 +391,21 @@ pub fn create_persistent_volume(
392391 channel : Option < & Toolchain > ,
393392 msg_info : & mut MessageInfo ,
394393) -> 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) ?;
401395 if let Some ( channel) = channel {
402- toolchain = toolchain . with_picked ( & config , channel. clone ( ) , msg_info ) ? ;
396+ toolchain. channel = channel . channel . clone ( ) ;
403397 } ;
404398 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) ?;
406401 let volume = dirs. toolchain . unique_toolchain_identifier ( ) ?;
407402
408403 if docker:: remote:: volume_exists ( engine, & volume, msg_info) ? {
409404 eyre:: bail!( "Error: volume {volume} already exists." ) ;
410405 }
411406
412407 docker:: subcommand ( engine, "volume" )
413- . args ( & [ "create" , & volume] )
408+ . args ( [ "create" , & volume] )
414409 . run_and_get_status ( msg_info, false ) ?;
415410
416411 // stop the container if it's already running
@@ -427,9 +422,9 @@ pub fn create_persistent_volume(
427422 // create a dummy running container to copy data over
428423 let mount_prefix = docker:: remote:: MOUNT_PREFIX ;
429424 let mut docker = docker:: subcommand ( engine, "run" ) ;
430- docker. args ( & [ "--name" , & container] ) ;
425+ docker. args ( [ "--name" , & container] ) ;
431426 docker. arg ( "--rm" ) ;
432- docker. args ( & [ "-v" , & format ! ( "{}:{}" , volume, mount_prefix) ] ) ;
427+ docker. args ( [ "-v" , & format ! ( "{}:{}" , volume, mount_prefix) ] ) ;
433428 docker. arg ( "-d" ) ;
434429 let is_tty = io:: Stdin :: is_atty ( ) && io:: Stdout :: is_atty ( ) && io:: Stderr :: is_atty ( ) ;
435430 if is_tty {
@@ -442,7 +437,7 @@ pub fn create_persistent_volume(
442437 // a TTY. this has a few issues though: now, the
443438 // container no longer responds to signals, so the
444439 // container will need to be sig-killed.
445- docker. args ( & [ "sh" , "-c" , "sleep infinity" ] ) ;
440+ docker. args ( [ "sh" , "-c" , "sleep infinity" ] ) ;
446441 }
447442 // store first, since failing to non-existing container is fine
448443 docker:: remote:: create_container_deleter ( engine. clone ( ) , container. clone ( ) ) ;
@@ -483,14 +478,11 @@ pub fn remove_persistent_volume(
483478 channel : Option < & Toolchain > ,
484479 msg_info : & mut MessageInfo ,
485480) -> 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) ?;
490482 if let Some ( channel) = channel {
491- toolchain = toolchain . with_picked ( & config , channel. clone ( ) , msg_info ) ? ;
483+ toolchain. channel = channel . channel . clone ( ) ;
492484 } ;
493- let ( dirs, _) = docker:: get_package_info ( engine, toolchain. clone ( ) , msg_info) ?;
485+ let ( dirs, _) = docker:: get_package_info ( engine, toolchain, msg_info) ?;
494486 let volume = dirs. toolchain . unique_toolchain_identifier ( ) ?;
495487
496488 if !docker:: remote:: volume_exists ( engine, & volume, msg_info) ? {
@@ -506,11 +498,12 @@ fn get_cross_containers(
506498 engine : & docker:: Engine ,
507499 msg_info : & mut MessageInfo ,
508500) -> cross:: Result < Vec < String > > {
501+ use cross:: docker:: remote:: VOLUME_PREFIX ;
509502 let stdout = docker:: subcommand ( engine, "ps" )
510503 . arg ( "-a" )
511- . args ( & [ "--format" , "{{.Names}}: {{.State}}" ] )
504+ . args ( [ "--format" , "{{.Names}}: {{.State}}" ] )
512505 // handles simple regex: ^ for start of line.
513- . args ( & [ "--filter" , "name=^cross-" ] )
506+ . args ( [ "--filter" , & format ! ( "name=^{VOLUME_PREFIX}" ) ] )
514507 . run_and_get_stdout ( msg_info) ?;
515508
516509 let mut containers: Vec < String > = stdout. lines ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
@@ -576,3 +569,20 @@ pub fn remove_all_containers(
576569
577570 Ok ( ( ) )
578571}
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