@@ -342,31 +342,19 @@ fn extract_7z(archive: &PathBuf, dest: &PathBuf) -> Result<()> {
342342 let mut reader =
343343 SevenZReader :: new ( file, len, password) . map_err ( |e| Error :: Archive ( e. to_string ( ) ) ) ?;
344344
345- let extract_to = dest
346- . parent ( )
347- . ok_or_else ( || Error :: Archive ( "Invalid destination path" . into ( ) ) ) ?;
348- fs:: create_dir_all ( extract_to) ?;
349-
350- // Track the top-level directory name from the archive
351- let mut top_level_dir: Option < String > = None ;
345+ // Windows LLVM archives have flat structure (bin/, lib/, etc. at root)
346+ // Extract directly to destination
347+ fs:: create_dir_all ( dest) ?;
352348
353349 reader
354350 . for_each_entries ( |entry, reader| {
355351 let entry_name = entry. name ( ) ;
356352
357- // Capture the top-level directory name
358- if top_level_dir. is_none ( )
359- && let Some ( first_component) = entry_name. split ( '/' ) . next ( )
360- && !first_component. is_empty ( )
361- {
362- top_level_dir = Some ( first_component. to_string ( ) ) ;
363- }
364-
365353 if entry. is_directory ( ) {
366- let dir_path = extract_to . join ( entry_name) ;
354+ let dir_path = dest . join ( entry_name) ;
367355 fs:: create_dir_all ( & dir_path) . ok ( ) ;
368356 } else {
369- let file_path = extract_to . join ( entry_name) ;
357+ let file_path = dest . join ( entry_name) ;
370358 if let Some ( parent) = file_path. parent ( ) {
371359 fs:: create_dir_all ( parent) . ok ( ) ;
372360 }
@@ -377,25 +365,6 @@ fn extract_7z(archive: &PathBuf, dest: &PathBuf) -> Result<()> {
377365 } )
378366 . map_err ( |e| Error :: Archive ( e. to_string ( ) ) ) ?;
379367
380- // Rename extracted top-level directory to dest
381- if let Some ( top_dir) = top_level_dir {
382- let extracted_dir = extract_to. join ( & top_dir) ;
383- if extracted_dir. exists ( ) && !dest. exists ( ) {
384- fs:: rename ( & extracted_dir, dest) ?;
385- } else if extracted_dir. exists ( ) && dest. exists ( ) {
386- // If dest already exists, move contents
387- for entry in fs:: read_dir ( & extracted_dir) ? {
388- let entry = entry?;
389- let dest_path = dest. join ( entry. file_name ( ) ) ;
390- fs:: rename ( entry. path ( ) , dest_path) ?;
391- }
392- fs:: remove_dir_all ( & extracted_dir) ?;
393- }
394- } else {
395- // No top-level directory, files extracted directly
396- fs:: create_dir_all ( dest) ?;
397- }
398-
399368 Ok ( ( ) )
400369}
401370
0 commit comments