1- use crate :: extractor:: ExtractDirectories ;
1+ use crate :: extractor:: { tar_xz_extract , ExtractDirectories } ;
22use crate :: Error :: Unexpected ;
33use crate :: Result ;
4- use human_bytes:: human_bytes;
5- use num_format:: { Locale , ToFormattedString } ;
6- use std:: fs:: { create_dir_all, remove_dir_all, remove_file, rename, File } ;
7- use std:: io:: { copy, BufReader , Cursor } ;
4+ use regex:: Regex ;
5+ use std:: fs:: { create_dir_all, remove_dir_all, remove_file, rename} ;
6+ use std:: io:: Cursor ;
87use std:: path:: { Path , PathBuf } ;
98use std:: thread:: sleep;
109use std:: time:: Duration ;
11- use tar:: Archive ;
1210use tracing:: { debug, instrument, warn} ;
13- use xz2:: bufread:: XzDecoder ;
1411use zip:: ZipArchive ;
1512
1613/// Extracts the compressed tar `bytes` to the [out_dir](Path).
@@ -22,7 +19,6 @@ use zip::ZipArchive;
2219#[ instrument( skip( bytes) ) ]
2320pub fn extract ( bytes : & Vec < u8 > , extract_directories : ExtractDirectories ) -> Result < Vec < PathBuf > > {
2421 let out_dir = extract_directories. get_path ( "." ) ?;
25- let mut files = Vec :: new ( ) ;
2622 let parent_dir = if let Some ( parent) = out_dir. parent ( ) {
2723 parent
2824 } else {
@@ -41,7 +37,7 @@ pub fn extract(bytes: &Vec<u8>, extract_directories: ExtractDirectories) -> Resu
4137 out_dir. to_string_lossy( )
4238 ) ;
4339 remove_file ( & lock_file) ?;
44- return Ok ( files ) ;
40+ return Ok ( Vec :: new ( ) ) ;
4541 }
4642
4743 let extract_dir = tempfile:: tempdir_in ( parent_dir) ?. into_path ( ) ;
@@ -66,51 +62,9 @@ pub fn extract(bytes: &Vec<u8>, extract_directories: ExtractDirectories) -> Resu
6662 return Err ( Unexpected ( "Failed to find archive file" . to_string ( ) ) ) ;
6763 }
6864
69- let input = BufReader :: new ( Cursor :: new ( archive_bytes) ) ;
70- let decoder = XzDecoder :: new ( input) ;
71- let mut archive = Archive :: new ( decoder) ;
72- let mut extracted_bytes = 0 ;
73-
74- for archive_entry in archive. entries ( ) ? {
75- let mut entry = archive_entry?;
76- let entry_header = entry. header ( ) ;
77- let entry_type = entry_header. entry_type ( ) ;
78- let entry_size = entry_header. size ( ) ?;
79- #[ cfg( unix) ]
80- let file_mode = entry_header. mode ( ) ?;
81-
82- let entry_header_path = entry_header. path ( ) ?. to_path_buf ( ) ;
83- let mut entry_name = extract_dir. clone ( ) ;
84- entry_name. push ( entry_header_path) ;
85-
86- if let Some ( parent) = entry_name. parent ( ) {
87- if !parent. exists ( ) {
88- create_dir_all ( parent) ?;
89- }
90- }
91-
92- if entry_type. is_dir ( ) || entry_name. is_dir ( ) {
93- create_dir_all ( & entry_name) ?;
94- } else if entry_type. is_file ( ) {
95- let mut output_file = File :: create ( & entry_name) ?;
96- copy ( & mut entry, & mut output_file) ?;
97- extracted_bytes += entry_size;
98-
99- #[ cfg( unix) ]
100- {
101- use std:: os:: unix:: fs:: PermissionsExt ;
102- output_file. set_permissions ( std:: fs:: Permissions :: from_mode ( file_mode) ) ?;
103- }
104- files. push ( entry_name) ;
105- } else if entry_type. is_symlink ( ) {
106- #[ cfg( unix) ]
107- if let Some ( symlink_target) = entry. link_name ( ) ? {
108- let symlink_path = entry_name. clone ( ) ;
109- std:: os:: unix:: fs:: symlink ( symlink_target. as_ref ( ) , symlink_path) ?;
110- files. push ( entry_name) ;
111- }
112- }
113- }
65+ let mut archive_extract_directories = ExtractDirectories :: default ( ) ;
66+ archive_extract_directories. add_mapping ( Regex :: new ( ".*" ) ?, extract_dir. clone ( ) ) ;
67+ let files = tar_xz_extract ( & archive_bytes, archive_extract_directories) ?;
11468
11569 if out_dir. exists ( ) {
11670 debug ! (
@@ -133,13 +87,6 @@ pub fn extract(bytes: &Vec<u8>, extract_directories: ExtractDirectories) -> Resu
13387 remove_file ( lock_file) ?;
13488 }
13589
136- let number_of_files = files. len ( ) ;
137- debug ! (
138- "Extracting {} files totalling {}" ,
139- number_of_files. to_formatted_string( & Locale :: en) ,
140- human_bytes( extracted_bytes as f64 )
141- ) ;
142-
14390 Ok ( files)
14491}
14592
0 commit comments