updated remove project logic to check if the client folders are empty,
and if they are deltes them.
This commit is contained in:
+8
-11
@@ -226,17 +226,14 @@ pub fn run_tui(
|
||||
state.output.push("\n".to_string());
|
||||
state.output.push(format!("[user input] > {}", trimmed));
|
||||
state.output.push("\n".to_string());
|
||||
if let Some(action) = state.prompt.action.clone() {
|
||||
match action {
|
||||
ToolMessage::RemoveProject => {
|
||||
if trimmed.to_lowercase().contains("y") {
|
||||
state.execute_command(
|
||||
"remove_project_confirm",
|
||||
None,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
let prompt = state.prompt.clone();
|
||||
if prompt.action.is_some() {
|
||||
state.prompt.responses.push(trimmed.clone());
|
||||
if state.prompt.responses.len() == state.prompt.num_responses {
|
||||
state.execute_command(
|
||||
prompt.execute_command.as_str(),
|
||||
None,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
let (command, args) =
|
||||
|
||||
+64
-40
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user