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 ;
@@ -8,6 +9,7 @@ use std::sync::Arc;
8
9
use std:: time:: SystemTime ;
9
10
10
11
use flate2:: read:: GzDecoder ;
12
+ use flate2:: write:: GzEncoder ;
11
13
use flate2:: { Compression , GzBuilder } ;
12
14
use log:: debug;
13
15
use serde_json:: { self , json} ;
@@ -439,22 +441,8 @@ fn tar(
439
441
internal ( format ! ( "could not archive source file `{}`" , relative_str) )
440
442
} ) ?;
441
443
442
- let mut header = Header :: new_ustar ( ) ;
443
444
let toml = pkg. to_registry_toml ( ws. config ( ) ) ?;
444
- header. set_path ( & path) ?;
445
- header. set_entry_type ( EntryType :: file ( ) ) ;
446
- header. set_mode ( 0o644 ) ;
447
- header. set_mtime (
448
- SystemTime :: now ( )
449
- . duration_since ( SystemTime :: UNIX_EPOCH )
450
- . unwrap ( )
451
- . as_secs ( ) ,
452
- ) ;
453
- header. set_size ( toml. len ( ) as u64 ) ;
454
- header. set_cksum ( ) ;
455
- ar. append ( & header, toml. as_bytes ( ) ) . chain_err ( || {
456
- internal ( format ! ( "could not archive source file `{}`" , relative_str) )
457
- } ) ?;
445
+ add_generated_file ( & mut ar, & path, & toml, relative_str) ?;
458
446
} else {
459
447
header. set_cksum ( ) ;
460
448
ar. append ( & header, & mut file) . chain_err ( || {
@@ -482,20 +470,7 @@ fn tar(
482
470
. set_path ( & path)
483
471
. chain_err ( || format ! ( "failed to add to archive: `{}`" , fnd) ) ?;
484
472
let json = format ! ( "{}\n " , serde_json:: to_string_pretty( json) ?) ;
485
- let mut header = Header :: new_ustar ( ) ;
486
- header. set_path ( & path) ?;
487
- header. set_entry_type ( EntryType :: file ( ) ) ;
488
- header. set_mode ( 0o644 ) ;
489
- header. set_mtime (
490
- SystemTime :: now ( )
491
- . duration_since ( SystemTime :: UNIX_EPOCH )
492
- . unwrap ( )
493
- . as_secs ( ) ,
494
- ) ;
495
- header. set_size ( json. len ( ) as u64 ) ;
496
- header. set_cksum ( ) ;
497
- ar. append ( & header, json. as_bytes ( ) )
498
- . chain_err ( || internal ( format ! ( "could not archive source file `{}`" , fnd) ) ) ?;
473
+ add_generated_file ( & mut ar, & path, & json, fnd) ?;
499
474
}
500
475
501
476
if pkg. include_lockfile ( ) {
@@ -510,20 +485,7 @@ fn tar(
510
485
pkg. version( ) ,
511
486
path:: MAIN_SEPARATOR
512
487
) ;
513
- let mut header = Header :: new_ustar ( ) ;
514
- header. set_path ( & path) ?;
515
- header. set_entry_type ( EntryType :: file ( ) ) ;
516
- header. set_mode ( 0o644 ) ;
517
- header. set_mtime (
518
- SystemTime :: now ( )
519
- . duration_since ( SystemTime :: UNIX_EPOCH )
520
- . unwrap ( )
521
- . as_secs ( ) ,
522
- ) ;
523
- header. set_size ( new_lock. len ( ) as u64 ) ;
524
- header. set_cksum ( ) ;
525
- ar. append ( & header, new_lock. as_bytes ( ) )
526
- . chain_err ( || internal ( "could not archive source file `Cargo.lock`" ) ) ?;
488
+ add_generated_file ( & mut ar, & path, & new_lock, "Cargo.lock" ) ?;
527
489
}
528
490
529
491
let encoder = ar. into_inner ( ) ?;
@@ -805,3 +767,26 @@ fn check_filename(file: &Path) -> CargoResult<()> {
805
767
}
806
768
Ok ( ( ) )
807
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