1- use std:: path:: { Path , PathBuf } ;
1+ use std:: {
2+ path:: { Path , PathBuf } ,
3+ process:: Command ,
4+ } ;
25
36use build_helper:: t;
47
@@ -95,6 +98,7 @@ pub(crate) struct Tarball<'a> {
9598
9699 include_target_in_component_name : bool ,
97100 is_preview : bool ,
101+ delete_temp_dir : bool ,
98102}
99103
100104impl < ' a > Tarball < ' a > {
@@ -132,6 +136,7 @@ impl<'a> Tarball<'a> {
132136
133137 include_target_in_component_name : false ,
134138 is_preview : false ,
139+ delete_temp_dir : true ,
135140 }
136141 }
137142
@@ -193,7 +198,53 @@ impl<'a> Tarball<'a> {
193198 self . builder . cp_r ( src. as_ref ( ) , & dest) ;
194199 }
195200
201+ pub ( crate ) fn persist_work_dir ( & mut self ) -> PathBuf {
202+ self . delete_temp_dir = false ;
203+ self . work_dir . clone ( )
204+ }
205+
196206 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 {
197248 t ! ( std:: fs:: create_dir_all( & self . overlay_dir) ) ;
198249 self . builder . create ( & self . overlay_dir . join ( "version" ) , & self . overlay . version ( self . builder ) ) ;
199250 if let Some ( sha) = self . builder . rust_sha ( ) {
@@ -215,37 +266,21 @@ impl<'a> Tarball<'a> {
215266
216267 let _time = crate :: util:: timeit ( self . builder ) ;
217268
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-
231269 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" )
233273 . arg ( format ! ( "--product-name={}" , self . product_name) )
234- . arg ( "--rel-manifest-dir=rustlib" )
235274 . arg ( format ! ( "--success-message={} installed." , self . component) )
236- . arg ( "--image-dir" )
237- . arg ( self . image_dir )
275+ . arg ( format ! ( "--package-name={}" , package_name) )
238276 . arg ( "--work-dir" )
239277 . arg ( self . work_dir )
240278 . 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) ;
247280 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+ }
249284
250285 distdir. join ( format ! ( "{}.tar.gz" , package_name) )
251286 }
0 commit comments