1
- use std:: path:: { Path , PathBuf } ;
1
+ use std:: {
2
+ path:: { Path , PathBuf } ,
3
+ process:: Command ,
4
+ } ;
2
5
3
6
use build_helper:: t;
4
7
@@ -95,6 +98,7 @@ pub(crate) struct Tarball<'a> {
95
98
96
99
include_target_in_component_name : bool ,
97
100
is_preview : bool ,
101
+ delete_temp_dir : bool ,
98
102
}
99
103
100
104
impl < ' a > Tarball < ' a > {
@@ -132,6 +136,7 @@ impl<'a> Tarball<'a> {
132
136
133
137
include_target_in_component_name : false ,
134
138
is_preview : false ,
139
+ delete_temp_dir : true ,
135
140
}
136
141
}
137
142
@@ -193,7 +198,53 @@ impl<'a> Tarball<'a> {
193
198
self . builder . cp_r ( src. as_ref ( ) , & dest) ;
194
199
}
195
200
201
+ pub ( crate ) fn persist_work_dir ( & mut self ) -> PathBuf {
202
+ self . delete_temp_dir = false ;
203
+ self . work_dir . clone ( )
204
+ }
205
+
196
206
pub ( crate ) fn generate ( self ) -> PathBuf {
207
+ let mut component_name = self . component . clone ( ) ;
208
+ if self . is_preview {
209
+ component_name. push_str ( "-preview" ) ;
210
+ }
211
+ if self . include_target_in_component_name {
212
+ component_name. push ( '-' ) ;
213
+ component_name. push_str (
214
+ & self
215
+ . target
216
+ . as_ref ( )
217
+ . expect ( "include_target_in_component_name used in a targetless tarball" ) ,
218
+ ) ;
219
+ }
220
+
221
+ self . run ( |this, cmd| {
222
+ cmd. arg ( "generate" )
223
+ . arg ( "--image-dir" )
224
+ . arg ( & this. image_dir )
225
+ . arg ( "--non-installed-overlay" )
226
+ . arg ( & this. overlay_dir )
227
+ . arg ( format ! ( "--component-name={}" , & component_name) ) ;
228
+ } )
229
+ }
230
+
231
+ pub ( crate ) fn combine ( self , tarballs : & [ PathBuf ] ) {
232
+ let mut input_tarballs = tarballs[ 0 ] . as_os_str ( ) . to_os_string ( ) ;
233
+ for tarball in & tarballs[ 1 ..] {
234
+ input_tarballs. push ( "," ) ;
235
+ input_tarballs. push ( tarball) ;
236
+ }
237
+
238
+ self . run ( |this, cmd| {
239
+ cmd. arg ( "combine" )
240
+ . arg ( "--input-tarballs" )
241
+ . arg ( input_tarballs)
242
+ . arg ( "--non-installed-overlay" )
243
+ . arg ( & this. overlay_dir ) ;
244
+ } ) ;
245
+ }
246
+
247
+ fn run ( self , build_cli : impl FnOnce ( & Tarball < ' a > , & mut Command ) ) -> PathBuf {
197
248
t ! ( std:: fs:: create_dir_all( & self . overlay_dir) ) ;
198
249
self . builder . create ( & self . overlay_dir . join ( "version" ) , & self . overlay . version ( self . builder ) ) ;
199
250
if let Some ( sha) = self . builder . rust_sha ( ) {
@@ -215,37 +266,21 @@ impl<'a> Tarball<'a> {
215
266
216
267
let _time = crate :: util:: timeit ( self . builder ) ;
217
268
218
- let mut component_name = self . component . clone ( ) ;
219
- if self . is_preview {
220
- component_name. push_str ( "-preview" ) ;
221
- }
222
- if self . include_target_in_component_name {
223
- component_name. push ( '-' ) ;
224
- component_name. push_str (
225
- & self
226
- . target
227
- . expect ( "include_target_in_component_name used in a targetless tarball" ) ,
228
- ) ;
229
- }
230
-
231
269
let distdir = crate :: dist:: distdir ( self . builder ) ;
232
- cmd. arg ( "generate" )
270
+ build_cli ( & self , & mut cmd) ;
271
+ cmd. arg ( "--rel-manifest-dir=rustlib" )
272
+ . arg ( "--legacy-manifest-dirs=rustlib,cargo" )
233
273
. arg ( format ! ( "--product-name={}" , self . product_name) )
234
- . arg ( "--rel-manifest-dir=rustlib" )
235
274
. arg ( format ! ( "--success-message={} installed." , self . component) )
236
- . arg ( "--image-dir" )
237
- . arg ( self . image_dir )
275
+ . arg ( format ! ( "--package-name={}" , package_name) )
238
276
. arg ( "--work-dir" )
239
277
. arg ( self . work_dir )
240
278
. arg ( "--output-dir" )
241
- . arg ( & distdir)
242
- . arg ( "--non-installed-overlay" )
243
- . arg ( self . overlay_dir )
244
- . arg ( format ! ( "--package-name={}" , package_name) )
245
- . arg ( "--legacy-manifest-dirs=rustlib,cargo" )
246
- . arg ( format ! ( "--component-name={}" , component_name) ) ;
279
+ . arg ( & distdir) ;
247
280
self . builder . run ( & mut cmd) ;
248
- t ! ( std:: fs:: remove_dir_all( & self . temp_dir) ) ;
281
+ if self . delete_temp_dir {
282
+ t ! ( std:: fs:: remove_dir_all( & self . temp_dir) ) ;
283
+ }
249
284
250
285
distdir. join ( format ! ( "{}.tar.gz" , package_name) )
251
286
}
0 commit comments