@@ -7,6 +7,7 @@ use std::process::{Command, Stdio};
7
7
use std:: thread;
8
8
use rand:: { thread_rng, Rng } ;
9
9
use rand:: distributions:: Alphanumeric ;
10
+ use crate :: configs:: index:: Binary ;
10
11
11
12
pub fn pull ( package : & Package ) -> bool {
12
13
let image = format ! ( "{}:{}" , package. index. image, package. versions. current) ;
@@ -23,33 +24,57 @@ pub fn run(package: &Package, binary: Option<String>, params: &Vec<String>) -> b
23
24
. expect ( "Failed to read stdin" ) ;
24
25
}
25
26
26
- let mut args = vec ! [ "run" . to_string( ) , "--rm" . to_string ( ) , "--name" . to_string ( ) , generate_random_name ( & package ) ] ;
27
+ let mut args = vec ! [ "run" . to_string( ) ] ;
27
28
if interactive {
28
29
args. push ( "-i" . to_string ( ) ) ;
29
30
} else {
30
31
args. push ( "-it" . to_string ( ) ) ;
31
32
}
32
33
34
+ let binary = get_binary ( package, & binary) ;
35
+
36
+ add_default_flags ( package, & mut args) ;
33
37
add_volumes ( package, & mut args) ;
34
38
add_current_directory ( package, & mut args) ;
35
39
add_environment_variables ( package, & mut args) ;
36
- add_binary_entrypoint ( package, & binary, & mut args) ;
37
-
38
- args. push ( format ! (
39
- "{}:{}" ,
40
- package. index. image. clone( ) ,
41
- package. versions. current
42
- ) ) ;
43
- args. extend ( params. iter ( ) . cloned ( ) ) ;
40
+ add_binary_entrypoint ( binary, & mut args) ;
41
+ add_container_image ( package, & mut args) ;
42
+ add_binary_cmd ( binary, & mut args) ;
43
+
44
+ if should_wrap_args ( binary) {
45
+ debug ! ( "Wrapping params in quotes" ) ;
46
+ let escaped_params: Vec < String > = params. iter ( ) . map ( |param| param. replace ( "\" " , "\\ \" " ) ) . collect ( ) ;
47
+ args. push ( escaped_params. join ( " " ) ) ;
48
+ } else {
49
+ args. extend ( params. iter ( ) . cloned ( ) ) ;
50
+ }
44
51
45
52
run_command_with_args ( "docker" , & args, Some ( buffer) )
46
53
}
47
54
55
+ fn should_wrap_args ( binary : Option < & Binary > ) -> bool {
56
+ binary. map_or ( false , |bin| bin. wrap_args )
57
+ }
58
+
48
59
fn generate_random_name ( package : & Package ) -> String {
49
60
let id: String = thread_rng ( ) . sample_iter ( & Alphanumeric ) . take ( 10 ) . map ( char:: from) . collect ( ) ;
50
61
format ! ( "hbox-{}-{}-{}" , package. name, package. versions. current, id)
51
62
}
52
63
64
+ fn add_default_flags ( package : & Package , args : & mut Vec < String > ) {
65
+ args. push ( "--rm" . to_string ( ) ) ;
66
+ args. push ( "--name" . to_string ( ) ) ;
67
+ args. push ( generate_random_name ( & package) )
68
+ }
69
+
70
+ fn add_container_image ( package : & Package , args : & mut Vec < String > ) {
71
+ args. push ( format ! (
72
+ "{}:{}" ,
73
+ package. index. image. clone( ) ,
74
+ package. versions. current
75
+ ) ) ;
76
+ }
77
+
53
78
fn add_volumes ( package : & Package , args : & mut Vec < String > ) {
54
79
if let Some ( volumes) = & package. index . volumes {
55
80
for volume in volumes {
@@ -81,17 +106,32 @@ fn add_environment_variables(package: &Package, args: &mut Vec<String>) {
81
106
}
82
107
}
83
108
84
- fn add_binary_entrypoint ( package : & Package , binary : & Option < String > , args : & mut Vec < String > ) {
109
+ fn add_binary_entrypoint ( binary : Option < & Binary > , args : & mut Vec < String > ) {
110
+ if let Some ( binary) = binary {
111
+ args. push ( "--entrypoint" . to_string ( ) ) ;
112
+ args. push ( binary. path . to_string ( ) ) ;
113
+ }
114
+ }
115
+
116
+ fn add_binary_cmd ( binary : Option < & Binary > , args : & mut Vec < String > ) {
117
+ if let Some ( binary) = binary {
118
+ if let Some ( cmd) = & binary. cmd {
119
+ args. extend ( cmd. iter ( ) . cloned ( ) ) ;
120
+ }
121
+ }
122
+ }
123
+
124
+ fn get_binary < ' a > ( package : & ' a Package , binary : & Option < String > ) -> Option < & ' a Binary > {
85
125
if let Some ( b) = binary {
86
126
if let Some ( binaries) = & package. index . binaries {
87
127
for binary in binaries {
88
128
if binary. name == * b {
89
- args. push ( "--entrypoint" . to_string ( ) ) ;
90
- args. push ( binary. path . to_string ( ) ) ;
129
+ return Some ( binary)
91
130
}
92
131
}
93
132
}
94
133
}
134
+ None
95
135
}
96
136
97
137
fn get_stdio ( config : & crate :: configs:: user:: Root , stdin_buffer : & Option < Vec < u8 > > ) -> ( Stdio , Stdio , Stdio ) {
0 commit comments