Skip to content

Commit 74505d8

Browse files
committed
Fix Windows 7z extraction - extract directly to dest
1 parent 03a369d commit 74505d8

File tree

1 file changed

+5
-36
lines changed

1 file changed

+5
-36
lines changed

crates/pecos-dev/src/llvm/installer.rs

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)