1
1
use std:: collections:: { BTreeSet , HashMap } ;
2
+ use std:: fmt:: Display ;
2
3
use std:: fs:: { self , File } ;
3
4
use std:: io:: prelude:: * ;
4
5
use std:: io:: SeekFrom ;
5
6
use std:: path:: { self , Path , PathBuf } ;
6
7
use std:: rc:: Rc ;
7
8
use std:: sync:: Arc ;
9
+ use std:: time:: SystemTime ;
8
10
9
11
use flate2:: read:: GzDecoder ;
12
+ use flate2:: write:: GzEncoder ;
10
13
use flate2:: { Compression , GzBuilder } ;
11
14
use log:: debug;
12
15
use serde_json:: { self , json} ;
@@ -438,16 +441,8 @@ fn tar(
438
441
internal ( format ! ( "could not archive source file `{}`" , relative_str) )
439
442
} ) ?;
440
443
441
- let mut header = Header :: new_ustar ( ) ;
442
444
let toml = pkg. to_registry_toml ( ws. config ( ) ) ?;
443
- header. set_path ( & path) ?;
444
- header. set_entry_type ( EntryType :: file ( ) ) ;
445
- header. set_mode ( 0o644 ) ;
446
- header. set_size ( toml. len ( ) as u64 ) ;
447
- header. set_cksum ( ) ;
448
- ar. append ( & header, toml. as_bytes ( ) ) . chain_err ( || {
449
- internal ( format ! ( "could not archive source file `{}`" , relative_str) )
450
- } ) ?;
445
+ add_generated_file ( & mut ar, & path, & toml, relative_str) ?;
451
446
} else {
452
447
header. set_cksum ( ) ;
453
448
ar. append ( & header, & mut file) . chain_err ( || {
@@ -475,14 +470,7 @@ fn tar(
475
470
. set_path ( & path)
476
471
. chain_err ( || format ! ( "failed to add to archive: `{}`" , fnd) ) ?;
477
472
let json = format ! ( "{}\n " , serde_json:: to_string_pretty( json) ?) ;
478
- let mut header = Header :: new_ustar ( ) ;
479
- header. set_path ( & path) ?;
480
- header. set_entry_type ( EntryType :: file ( ) ) ;
481
- header. set_mode ( 0o644 ) ;
482
- header. set_size ( json. len ( ) as u64 ) ;
483
- header. set_cksum ( ) ;
484
- ar. append ( & header, json. as_bytes ( ) )
485
- . chain_err ( || internal ( format ! ( "could not archive source file `{}`" , fnd) ) ) ?;
473
+ add_generated_file ( & mut ar, & path, & json, fnd) ?;
486
474
}
487
475
488
476
if pkg. include_lockfile ( ) {
@@ -497,14 +485,7 @@ fn tar(
497
485
pkg. version( ) ,
498
486
path:: MAIN_SEPARATOR
499
487
) ;
500
- let mut header = Header :: new_ustar ( ) ;
501
- header. set_path ( & path) ?;
502
- header. set_entry_type ( EntryType :: file ( ) ) ;
503
- header. set_mode ( 0o644 ) ;
504
- header. set_size ( new_lock. len ( ) as u64 ) ;
505
- header. set_cksum ( ) ;
506
- ar. append ( & header, new_lock. as_bytes ( ) )
507
- . chain_err ( || internal ( "could not archive source file `Cargo.lock`" ) ) ?;
488
+ add_generated_file ( & mut ar, & path, & new_lock, "Cargo.lock" ) ?;
508
489
}
509
490
510
491
let encoder = ar. into_inner ( ) ?;
@@ -786,3 +767,26 @@ fn check_filename(file: &Path) -> CargoResult<()> {
786
767
}
787
768
Ok ( ( ) )
788
769
}
770
+
771
+ fn add_generated_file < D : Display > (
772
+ ar : & mut Builder < GzEncoder < & File > > ,
773
+ path : & str ,
774
+ data : & str ,
775
+ display : D ,
776
+ ) -> CargoResult < ( ) > {
777
+ let mut header = Header :: new_ustar ( ) ;
778
+ header. set_path ( path) ?;
779
+ header. set_entry_type ( EntryType :: file ( ) ) ;
780
+ header. set_mode ( 0o644 ) ;
781
+ header. set_mtime (
782
+ SystemTime :: now ( )
783
+ . duration_since ( SystemTime :: UNIX_EPOCH )
784
+ . unwrap ( )
785
+ . as_secs ( ) ,
786
+ ) ;
787
+ header. set_size ( data. len ( ) as u64 ) ;
788
+ header. set_cksum ( ) ;
789
+ ar. append ( & header, data. as_bytes ( ) )
790
+ . chain_err ( || internal ( format ! ( "could not archive source file `{}`" , display) ) ) ?;
791
+ Ok ( ( ) )
792
+ }
0 commit comments