web: Show symlink and don't list empty dir in file tree

This commit is contained in:
Wildan M 2026-05-17 02:30:38 +07:00
parent 0886d88cd6
commit fd2d14d42b
No known key found for this signature in database
GPG Key ID: 01AC53185C679C79
4 changed files with 37 additions and 13 deletions

View File

@ -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)?;

View File

@ -418,4 +418,6 @@ done;
if [ -n "$ALL_DESCENDANTS" ]; then
kill $ALL_DESCENDANTS;
fi
killall sccache
"#;

View File

@ -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<u64> {
pub fn walk_file_tree(
dir: &PathBuf,
prefix: &str,
buffer: &mut Vec<String>,
) -> std::io::Result<u64> {
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)?;
));
}
}

View File

@ -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
};