@@ -17,19 +17,13 @@ use crate::shell::{MessageInfo, Stream};
17
17
use crate :: temp;
18
18
use crate :: TargetTriple ;
19
19
20
- #[ derive( Debug , Clone ) ]
21
- enum VolumeId {
22
- Keep ( String ) ,
23
- Discard ,
24
- }
25
-
26
20
// prevent further commands from running if we handled
27
21
// a signal earlier, and the volume is exited.
28
22
// this isn't required, but avoids unnecessary
29
23
// commands while the container is cleaning up.
30
24
macro_rules! bail_container_exited {
31
25
( ) => { {
32
- if !Container :: exists_static( ) {
26
+ if !ChildContainer :: exists_static( ) {
33
27
eyre:: bail!( "container already exited due to signal" ) ;
34
28
}
35
29
} } ;
@@ -40,26 +34,7 @@ fn subcommand_or_exit(engine: &Engine, cmd: &str) -> Result<Command> {
40
34
Ok ( subcommand ( engine, cmd) )
41
35
}
42
36
43
- #[ derive( Debug ) ]
44
- pub struct DataVolume < ' a , ' b , ' c > {
45
- engine : & ' a Engine ,
46
- container : & ' b str ,
47
- toolchain_dirs : & ' c ToolchainDirectories ,
48
- }
49
-
50
- impl < ' a , ' b , ' c > DataVolume < ' a , ' b , ' c > {
51
- pub const fn new (
52
- engine : & ' a Engine ,
53
- container : & ' b str ,
54
- toolchain_dirs : & ' c ToolchainDirectories ,
55
- ) -> Self {
56
- Self {
57
- engine,
58
- container,
59
- toolchain_dirs,
60
- }
61
- }
62
-
37
+ impl < ' a , ' b , ' c > ContainerDataVolume < ' a , ' b , ' c > {
63
38
fn create_dir ( & self , dir : & Path , msg_info : & mut MessageInfo ) -> Result < ExitStatus > {
64
39
// make our parent directory if needed
65
40
subcommand_or_exit ( self . engine , "exec" ) ?
@@ -636,9 +611,9 @@ pub(crate) fn run(
636
611
// note that since we use `docker run --rm`, it's very
637
612
// unlikely the container state existed before.
638
613
let toolchain_id = toolchain_dirs. unique_toolchain_identifier ( ) ?;
639
- let container = toolchain_dirs. unique_container_identifier ( target. target ( ) ) ?;
614
+ let container_id = toolchain_dirs. unique_container_identifier ( target. target ( ) ) ?;
640
615
let volume = {
641
- let existing = existing_volumes ( engine, toolchain_dirs. toolchain ( ) , msg_info) ?;
616
+ let existing = DockerVolume :: existing ( engine, toolchain_dirs. toolchain ( ) , msg_info) ?;
642
617
if existing. iter ( ) . any ( |v| v == & toolchain_id) {
643
618
VolumeId :: Keep ( toolchain_id)
644
619
} else {
@@ -652,14 +627,16 @@ pub(crate) fn run(
652
627
VolumeId :: Discard
653
628
}
654
629
} ;
655
- let state = container_state ( engine, & container, msg_info) ?;
630
+
631
+ let container = DockerContainer :: new ( engine, & container_id) ;
632
+ let state = container. state ( msg_info) ?;
656
633
if !state. is_stopped ( ) {
657
- msg_info. warn ( format_args ! ( "container {container } was running." ) ) ?;
658
- container_stop_default ( engine , & container, msg_info) ?;
634
+ msg_info. warn ( format_args ! ( "container {container_id } was running." ) ) ?;
635
+ container. stop_default ( msg_info) ?;
659
636
}
660
637
if state. exists ( ) {
661
- msg_info. warn ( format_args ! ( "container {container } was exited." ) ) ?;
662
- container_rm ( engine , & container, msg_info) ?;
638
+ msg_info. warn ( format_args ! ( "container {container_id } was exited." ) ) ?;
639
+ container. remove ( msg_info) ?;
663
640
}
664
641
665
642
// 2. create our volume to copy all our data over to
@@ -673,13 +650,9 @@ pub(crate) fn run(
673
650
. image
674
651
. platform
675
652
. specify_platform ( & options. engine , & mut docker) ;
676
- docker. args ( [ "--name" , & container ] ) ;
653
+ docker. args ( [ "--name" , & container_id ] ) ;
677
654
docker. arg ( "--rm" ) ;
678
- let volume_mount = match volume {
679
- VolumeId :: Keep ( ref id) => format ! ( "{id}:{mount_prefix}" ) ,
680
- VolumeId :: Discard => mount_prefix. to_owned ( ) ,
681
- } ;
682
- docker. args ( [ "-v" , & volume_mount] ) ;
655
+ docker. args ( [ "-v" , & volume. bind_mount ( mount_prefix) ] ) ;
683
656
684
657
let mut volumes = vec ! [ ] ;
685
658
docker_mount (
@@ -731,11 +704,11 @@ pub(crate) fn run(
731
704
}
732
705
733
706
// store first, since failing to non-existing container is fine
734
- Container :: create ( engine. clone ( ) , container . clone ( ) ) ?;
707
+ ChildContainer :: create ( engine. clone ( ) , container_id . clone ( ) ) ?;
735
708
docker. run_and_get_status ( msg_info, true ) ?;
736
709
737
710
// 4. copy all mounted volumes over
738
- let data_volume = DataVolume :: new ( engine, & container , toolchain_dirs) ;
711
+ let data_volume = ContainerDataVolume :: new ( engine, & container_id , toolchain_dirs) ;
739
712
let copy_cache = env:: var ( "CROSS_REMOTE_COPY_CACHE" )
740
713
. map ( |s| bool_from_envvar ( & s) )
741
714
. unwrap_or_default ( ) ;
@@ -903,7 +876,7 @@ symlink_recurse \"${{prefix}}\"
903
876
) ) ;
904
877
}
905
878
subcommand_or_exit ( engine, "exec" ) ?
906
- . arg ( & container )
879
+ . arg ( & container_id )
907
880
. args ( [ "sh" , "-c" , & symlink. join ( "\n " ) ] )
908
881
. run_and_get_status ( msg_info, false )
909
882
. wrap_err ( "when creating symlinks to provide consistent host/mount paths" ) ?;
@@ -913,7 +886,7 @@ symlink_recurse \"${{prefix}}\"
913
886
docker_user_id ( & mut docker, engine. kind ) ;
914
887
docker_envvars ( & mut docker, & options, toolchain_dirs, msg_info) ?;
915
888
docker_cwd ( & mut docker, & paths) ?;
916
- docker. arg ( & container ) ;
889
+ docker. arg ( & container_id ) ;
917
890
docker. args ( [ "sh" , "-c" , & build_command ( toolchain_dirs, & cmd) ] ) ;
918
891
bail_container_exited ! ( ) ;
919
892
let status = docker
@@ -929,7 +902,10 @@ symlink_recurse \"${{prefix}}\"
929
902
if !skip_artifacts && data_volume. container_path_exists ( & target_dir, msg_info) ? {
930
903
subcommand_or_exit ( engine, "cp" ) ?
931
904
. arg ( "-a" )
932
- . arg ( & format ! ( "{container}:{}" , target_dir. as_posix_absolute( ) ?) )
905
+ . arg ( & format ! (
906
+ "{container_id}:{}" ,
907
+ target_dir. as_posix_absolute( ) ?
908
+ ) )
933
909
. arg (
934
910
package_dirs
935
911
. target ( )
@@ -940,7 +916,7 @@ symlink_recurse \"${{prefix}}\"
940
916
. map_err :: < eyre:: ErrReport , _ > ( Into :: into) ?;
941
917
}
942
918
943
- Container :: finish_static ( is_tty, msg_info) ;
919
+ ChildContainer :: finish_static ( is_tty, msg_info) ;
944
920
945
921
status
946
922
}
0 commit comments