From fd2d14d42b3e0ae626162a71d74929fac3c9930f Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 17 May 2026 02:30:38 +0700 Subject: [PATCH] web: Show symlink and don't list empty dir in file tree --- src/bin/repo.rs | 10 +++++++--- src/cook/script.rs | 2 ++ src/cook/tree.rs | 35 +++++++++++++++++++++++++---------- src/web/search.rs | 3 +++ 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 536c99081..09f9b06fd 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -797,11 +797,15 @@ fn handle_cook( for stage_dir in &build_result.stage_dirs { if stage_dir.is_dir() { if config.cook.write_filetree { - let mut stage_files_buf = String::new(); + let mut stage_files_buf = Vec::new(); tree::walk_file_tree(&stage_dir, "", &mut stage_files_buf) .map_err(|e| Error::from_io_error(e, "Walking files tree"))?; - fs::write(stage_dir.with_added_extension("files"), stage_files_buf) - .map_err(|e| Error::from_io_error(e, "Writing files tree"))?; + stage_files_buf.push("".into()); // trailing eol + fs::write( + stage_dir.with_added_extension("files"), + stage_files_buf.join("\n"), + ) + .map_err(|e| Error::from_io_error(e, "Writing files tree"))?; } if config.cook.clean_target { remove_all(&stage_dir)?; diff --git a/src/cook/script.rs b/src/cook/script.rs index 530e9b9ca..91f6d40ff 100644 --- a/src/cook/script.rs +++ b/src/cook/script.rs @@ -418,4 +418,6 @@ done; if [ -n "$ALL_DESCENDANTS" ]; then kill $ALL_DESCENDANTS; fi + +killall sccache "#; diff --git a/src/cook/tree.rs b/src/cook/tree.rs index 66412e6db..5190f2a1f 100644 --- a/src/cook/tree.rs +++ b/src/cook/tree.rs @@ -1,7 +1,6 @@ use pkg::{Package, PackageName}; use std::{ collections::{HashMap, HashSet}, - fmt::Write as _, path::PathBuf, }; @@ -147,11 +146,14 @@ pub fn display_pkg_fn( Ok(false) } -pub fn walk_file_tree(dir: &PathBuf, prefix: &str, buffer: &mut String) -> std::io::Result { +pub fn walk_file_tree( + dir: &PathBuf, + prefix: &str, + buffer: &mut Vec, +) -> std::io::Result { if !dir.is_dir() { return Ok(0); } - let fmt_err = std::io::Error::other; let mut entries: Vec<_> = std::fs::read_dir(dir)?.filter_map(|e| e.ok()).collect(); entries.sort_by(|a, b| a.file_name().cmp(&b.file_name())); let mut total_size = 0; @@ -166,22 +168,35 @@ pub fn walk_file_tree(dir: &PathBuf, prefix: &str, buffer: &mut String) -> std:: .and_then(|n| n.to_str()) .unwrap_or("Unknown"); - if path.is_dir() { - writeln!(buffer, "{}{}{}/", prefix, line_prefix, file_name).map_err(fmt_err)?; + if metadata.is_dir() { + buffer.push(format!("{}{}{}/", prefix, line_prefix, file_name)); + let last_len = buffer.len(); let new_prefix = format!("{}{}", prefix, if is_last { " " } else { "│ " }); - walk_file_tree(&path, &new_prefix, buffer)?; + total_size += walk_file_tree(&path, &new_prefix, buffer)?; + if buffer.len() == last_len { + // pkgar doesn't capture empty directory + buffer.pop(); + } + } else if metadata.is_symlink() { + let size = metadata.len(); + total_size += size; + buffer.push(format!( + "{}{}{} -> {:?}", + prefix, + line_prefix, + file_name, + std::fs::read_link(&path)?.display() + )); } else { let size = metadata.len(); total_size += size; - writeln!( - buffer, + buffer.push(format!( "{}{}{} ({})", prefix, line_prefix, file_name, format_size(size) - ) - .map_err(fmt_err)?; + )); } } diff --git a/src/web/search.rs b/src/web/search.rs index 85653709b..975d0c5c3 100644 --- a/src/web/search.rs +++ b/src/web/search.rs @@ -95,6 +95,9 @@ impl FileIndexBuilder { let name = if let Some(paren_idx) = remainder.rfind('(') { // Strip size remainder[..paren_idx].trim() + } else if let Some(paren_idx) = remainder.rfind("->") { + // Strip symlink + remainder[..paren_idx].trim() } else { remainder };