updated remove project logic to check if the client folders are empty,

and if they are deltes them.
This commit is contained in:
2026-05-21 13:51:04 -05:00
parent 9ddcd1ef6e
commit 95b86f80aa
2 changed files with 72 additions and 51 deletions
+64 -40
View File
@@ -3,7 +3,7 @@ use ratatui::crossterm::event;
use rhai::{AST, Dynamic, Engine, Scope};
use std::collections::HashMap;
use std::error::Error;
use std::fs::{self, File, create_dir_all, read_dir, read_to_string, remove_dir_all};
use std::fs::{self, File, create_dir_all, read_dir, read_to_string, remove_dir, remove_dir_all};
use std::io::{self, BufRead, BufReader, Write};
use std::path::PathBuf;
use std::process::{Command, Stdio};
@@ -57,6 +57,8 @@ impl AppState {
prompt: Prompt {
action: None,
responses: Vec::new(),
execute_command: String::new(),
num_responses: 0,
},
},
main_rx,
@@ -208,50 +210,69 @@ impl AppState {
self.promote_project()?;
}
"remove_project_confirm" => {
let project = self.projects[self.selected_project].clone();
let mut config_file = project.config_folder.clone();
config_file.pop();
if let Err(e) = remove_dir_all(&project.config_folder) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete config: {e} on {}",
&project.config_folder.display()
)));
}
if let Err(e) = remove_dir_all(&project.notes) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete notes: {e} on {}",
&project.notes.display()
)));
}
if let Err(e) = remove_dir_all(&project.files) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete files: {e} on {}",
&project.files.display()
)));
}
self.projects.remove(self.selected_project);
self.prompt.action = None;
self.prompt.num_responses = 0;
if self.prompt.responses.len() > 0 {
if self.prompt.responses[0] == "y".to_string() {
let project = self.projects[self.selected_project].clone();
let mut config_file = project.config_folder.clone();
config_file.pop();
if let Err(e) = remove_dir_all(&project.config_folder) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete config: {e} on {}",
&project.config_folder.display()
)));
}
if let Err(e) = remove_dir_all(&project.notes) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete notes: {e} on {}",
&project.notes.display()
)));
} else if let Some(parent) = project.notes.parent() {
if let Ok(mut entries) = read_dir(parent) {
if entries.next().is_none() {
if let Err(e) = remove_dir(parent) {
let _ = self.main_tx.send(ToolMessage::Output(format!("failed to delete the empty client notes folder: {e} on {}", parent.display())));
}
}
}
}
if let Err(e) = remove_dir_all(&project.files) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete files: {e} on {}",
&project.files.display()
)));
} else if let Some(parent) = project.files.parent() {
if let Ok(mut entries) = read_dir(parent) {
if entries.next().is_none() {
if let Err(e) = remove_dir(parent) {
let _ = self.main_tx.send(ToolMessage::Output(format!(
"failed to delete empty files parent: {e} on {}",
parent.display()
)));
}
}
}
}
self.projects.remove(self.selected_project);
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}-{} was sucessfully removed!",
project.org_name, project.name
)));
}
}
self.prompt.responses.clear();
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}-{} was sucessfully removed!",
project.org_name, project.name
)));
}
"remove_project" | "rp" => {
let project = self.projects[self.selected_project].clone();
if project.name == "default" && project.org_name == "default" {
let _ = self.main_tx.send(ToolMessage::Output(
"The default project must remain. Canceling.".to_string(),
));
self.prompt.action = None;
} else {
self.prompt.action = Some(ToolMessage::RemoveProject);
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}, {} and all contents will be deleted. Continue? (y/N)",
project.files.display(),
project.notes.display()
)));
}
self.prompt.action = Some(ToolMessage::RemoveProject);
self.prompt.num_responses = 1;
self.prompt.execute_command = String::from("remove_project_confirm");
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}, {} and all contents will be deleted. Continue? (y/N)",
project.files.display(),
project.notes.display()
)));
}
_ => {
let ast = self
@@ -926,7 +947,10 @@ impl DistroBox {
}
}
#[derive(Clone)]
struct Prompt {
action: Option<ToolMessage>,
responses: Vec<String>,
execute_command: String,
num_responses: usize,
}