Added mac specific path cleanup and logging

This commit is contained in:
Connor Yoh 2025-07-14 17:02:22 +01:00
parent f9ab08ad64
commit 4f8c16f671
2 changed files with 114 additions and 9 deletions

View File

@ -112,9 +112,18 @@ fn normalize_path(path: &PathBuf) -> PathBuf {
// Create, configure and run the Java command to run Stirling-PDF JAR // Create, configure and run the Java command to run Stirling-PDF JAR
fn run_stirling_pdf_jar(app: &tauri::AppHandle, java_path: &PathBuf, jar_path: &PathBuf) -> Result<(), String> { fn run_stirling_pdf_jar(app: &tauri::AppHandle, java_path: &PathBuf, jar_path: &PathBuf) -> Result<(), String> {
// Configure logging to write outside src-tauri to prevent dev server restarts // Get platform-specific log directory
let temp_dir = std::env::temp_dir(); let log_dir = if cfg!(target_os = "macos") {
let log_dir = temp_dir.join("stirling-pdf-logs"); let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
PathBuf::from(home).join("Library").join("Logs").join("Stirling-PDF").join("backend")
} else if cfg!(target_os = "windows") {
let appdata = std::env::var("APPDATA").unwrap_or_else(|_| std::env::temp_dir().to_string_lossy().to_string());
PathBuf::from(appdata).join("Stirling-PDF").join("backend-logs")
} else {
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
PathBuf::from(home).join(".config").join("Stirling-PDF").join("backend-logs")
};
std::fs::create_dir_all(&log_dir).ok(); // Create log directory if it doesn't exist std::fs::create_dir_all(&log_dir).ok(); // Create log directory if it doesn't exist
// Define all Java options in an array // Define all Java options in an array
@ -132,12 +141,39 @@ fn run_stirling_pdf_jar(app: &tauri::AppHandle, java_path: &PathBuf, jar_path: &
// Log the equivalent command for external testing // Log the equivalent command for external testing
let java_command = format!( let java_command = format!(
"TAURI_PARENT_PID={} && \"{}\" {}", "TAURI_PARENT_PID={} \"{}\" {}",
std::process::id(), std::process::id(),
java_path.display(), java_path.display(),
java_options.join(" ") java_options.join(" ")
); );
add_log(format!("🔧 Equivalent command: {}", java_command)); add_log(format!("🔧 Equivalent command: {}", java_command));
add_log(format!("📁 Backend logs will be in: {}", log_dir.display()));
// Additional macOS-specific checks
if cfg!(target_os = "macos") {
// Check if java executable has execute permissions
if let Ok(metadata) = std::fs::metadata(java_path) {
let permissions = metadata.permissions();
add_log(format!("🔍 Java executable permissions: {:?}", permissions));
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
let mode = permissions.mode();
add_log(format!("🔍 Java executable mode: 0o{:o}", mode));
if mode & 0o111 == 0 {
add_log("⚠️ Java executable may not have execute permissions".to_string());
}
}
}
// Check if we can read the JAR file
if let Ok(metadata) = std::fs::metadata(jar_path) {
add_log(format!("📦 JAR file size: {} bytes", metadata.len()));
} else {
add_log("⚠️ Cannot read JAR file metadata".to_string());
}
}
let sidecar_command = app let sidecar_command = app
.shell() .shell()

View File

@ -1,20 +1,89 @@
use std::sync::Mutex; use std::sync::Mutex;
use std::collections::VecDeque; use std::collections::VecDeque;
use std::fs::OpenOptions;
use std::io::Write;
use std::path::PathBuf;
// Store backend logs globally // Store backend logs globally
static BACKEND_LOGS: Mutex<VecDeque<String>> = Mutex::new(VecDeque::new()); static BACKEND_LOGS: Mutex<VecDeque<String>> = Mutex::new(VecDeque::new());
// Get platform-specific log directory
fn get_log_directory() -> PathBuf {
if cfg!(target_os = "macos") {
// macOS: ~/Library/Logs/Stirling-PDF
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
PathBuf::from(home).join("Library").join("Logs").join("Stirling-PDF")
} else if cfg!(target_os = "windows") {
// Windows: %APPDATA%\Stirling-PDF\logs
let appdata = std::env::var("APPDATA").unwrap_or_else(|_| std::env::temp_dir().to_string_lossy().to_string());
PathBuf::from(appdata).join("Stirling-PDF").join("logs")
} else {
// Linux: ~/.config/Stirling-PDF/logs
let home = std::env::var("HOME").unwrap_or_else(|_| "/tmp".to_string());
PathBuf::from(home).join(".config").join("Stirling-PDF").join("logs")
}
}
// Helper function to add log entry // Helper function to add log entry
pub fn add_log(message: String) { pub fn add_log(message: String) {
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
let log_entry = format!("{}: {}", timestamp, message);
// Add to memory logs
{
let mut logs = BACKEND_LOGS.lock().unwrap(); let mut logs = BACKEND_LOGS.lock().unwrap();
logs.push_back(format!("{}: {}", std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs(), message)); logs.push_back(log_entry.clone());
// Keep only last 100 log entries // Keep only last 100 log entries
if logs.len() > 100 { if logs.len() > 100 {
logs.pop_front(); logs.pop_front();
} }
}
// Write to file
write_to_log_file(&log_entry);
// Remove trailing newline if present // Remove trailing newline if present
let clean_message = message.trim_end_matches('\n').to_string(); let clean_message = message.trim_end_matches('\n').to_string();
println!("{}", clean_message); // Also print to console println!("{}", clean_message); // Also print to console
} }
// Write log entry to file
fn write_to_log_file(log_entry: &str) {
let log_dir = get_log_directory();
if let Err(e) = std::fs::create_dir_all(&log_dir) {
eprintln!("Failed to create log directory: {}", e);
return;
}
let log_file = log_dir.join("tauri-backend.log");
match OpenOptions::new()
.create(true)
.append(true)
.open(&log_file)
{
Ok(mut file) => {
if let Err(e) = writeln!(file, "{}", log_entry) {
eprintln!("Failed to write to log file: {}", e);
}
}
Err(e) => {
eprintln!("Failed to open log file {:?}: {}", log_file, e);
}
}
}
// Get current logs for debugging
pub fn get_logs() -> Vec<String> {
let logs = BACKEND_LOGS.lock().unwrap();
logs.iter().cloned().collect()
}
// Get log file path for external access
pub fn get_log_file_path() -> PathBuf {
get_log_directory().join("tauri-backend.log")
}