diff --git a/src/cortex-cli/src/logs_cmd.rs b/src/cortex-cli/src/logs_cmd.rs index f525efc3..b52a707c 100644 --- a/src/cortex-cli/src/logs_cmd.rs +++ b/src/cortex-cli/src/logs_cmd.rs @@ -9,7 +9,7 @@ use anyhow::Result; use clap::Parser; use serde::Serialize; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; /// Logs CLI command. #[derive(Debug, Parser)] @@ -81,6 +81,12 @@ fn format_size(bytes: u64) -> String { } } +fn is_log_file(path: &Path) -> bool { + path.file_name() + .and_then(|n| n.to_str()) + .is_some_and(|name| name.ends_with(".log") || name.ends_with(".txt")) +} + impl LogsCli { /// Run the logs command. pub async fn run(self) -> Result<()> { @@ -113,11 +119,8 @@ impl LogsCli { if let Ok(entries) = std::fs::read_dir(&logs_dir) { for entry in entries.flatten() { let path = entry.path(); - if path.is_file() { - let name = path.file_name().and_then(|n| n.to_str()).unwrap_or(""); - if name.ends_with(".log") || name.ends_with(".txt") { - log_files.push(path); - } + if path.is_file() && is_log_file(&path) { + log_files.push(path); } } } @@ -266,6 +269,7 @@ impl LogsCli { for entry in entries.flatten() { let path = entry.path(); if path.is_file() + && is_log_file(&path) && let Ok(meta) = entry.metadata() { let modified = meta diff --git a/src/cortex-cli/tests/logs_paths.rs b/src/cortex-cli/tests/logs_paths.rs new file mode 100644 index 00000000..531d9957 --- /dev/null +++ b/src/cortex-cli/tests/logs_paths.rs @@ -0,0 +1,45 @@ +use std::fs; +use std::process::Command; + +use tempfile::tempdir; + +fn combined_output(output: &std::process::Output) -> String { + format!( + "{}{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ) +} + +#[test] +fn logs_paths_lists_only_log_files() { + let home = tempdir().unwrap(); + let cache = tempdir().unwrap(); + let logs_dir = cache.path().join("cortex").join("logs"); + fs::create_dir_all(&logs_dir).unwrap(); + + fs::write(logs_dir.join("cortex.log"), "log\n").unwrap(); + fs::write(logs_dir.join("debug.txt"), "debug\n").unwrap(); + fs::write(logs_dir.join("state.json"), "{}\n").unwrap(); + fs::write(logs_dir.join("session.lock"), "locked\n").unwrap(); + + let output = Command::new(env!("CARGO_BIN_EXE_Cortex")) + .args(["logs", "--paths"]) + .env("HOME", home.path()) + .env("XDG_CACHE_HOME", cache.path()) + .env_remove("CORTEX_HOME") + .output() + .unwrap(); + + assert!( + output.status.success(), + "logs --paths failed:\n{}", + combined_output(&output) + ); + + let stdout = String::from_utf8_lossy(&output.stdout); + assert!(stdout.contains("cortex.log"), "output:\n{stdout}"); + assert!(stdout.contains("debug.txt"), "output:\n{stdout}"); + assert!(!stdout.contains("state.json"), "output:\n{stdout}"); + assert!(!stdout.contains("session.lock"), "output:\n{stdout}"); +}