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("\n".to_string());
|
||||||
state.output.push(format!("[user input] > {}", trimmed));
|
state.output.push(format!("[user input] > {}", trimmed));
|
||||||
state.output.push("\n".to_string());
|
state.output.push("\n".to_string());
|
||||||
if let Some(action) = state.prompt.action.clone() {
|
let prompt = state.prompt.clone();
|
||||||
match action {
|
if prompt.action.is_some() {
|
||||||
ToolMessage::RemoveProject => {
|
state.prompt.responses.push(trimmed.clone());
|
||||||
if trimmed.to_lowercase().contains("y") {
|
if state.prompt.responses.len() == state.prompt.num_responses {
|
||||||
state.execute_command(
|
state.execute_command(
|
||||||
"remove_project_confirm",
|
prompt.execute_command.as_str(),
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let (command, args) =
|
let (command, args) =
|
||||||
|
|||||||
+64
-40
@@ -3,7 +3,7 @@ use ratatui::crossterm::event;
|
|||||||
use rhai::{AST, Dynamic, Engine, Scope};
|
use rhai::{AST, Dynamic, Engine, Scope};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::error::Error;
|
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::io::{self, BufRead, BufReader, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::process::{Command, Stdio};
|
use std::process::{Command, Stdio};
|
||||||
@@ -57,6 +57,8 @@ impl AppState {
|
|||||||
prompt: Prompt {
|
prompt: Prompt {
|
||||||
action: None,
|
action: None,
|
||||||
responses: Vec::new(),
|
responses: Vec::new(),
|
||||||
|
execute_command: String::new(),
|
||||||
|
num_responses: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
main_rx,
|
main_rx,
|
||||||
@@ -208,50 +210,69 @@ impl AppState {
|
|||||||
self.promote_project()?;
|
self.promote_project()?;
|
||||||
}
|
}
|
||||||
"remove_project_confirm" => {
|
"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.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();
|
self.prompt.responses.clear();
|
||||||
let _ = self.main_tx.send(ToolMessage::Output(format!(
|
|
||||||
"{}-{} was sucessfully removed!",
|
|
||||||
project.org_name, project.name
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
"remove_project" | "rp" => {
|
"remove_project" | "rp" => {
|
||||||
let project = self.projects[self.selected_project].clone();
|
let project = self.projects[self.selected_project].clone();
|
||||||
if project.name == "default" && project.org_name == "default" {
|
self.prompt.action = Some(ToolMessage::RemoveProject);
|
||||||
let _ = self.main_tx.send(ToolMessage::Output(
|
self.prompt.num_responses = 1;
|
||||||
"The default project must remain. Canceling.".to_string(),
|
self.prompt.execute_command = String::from("remove_project_confirm");
|
||||||
));
|
let _ = self.main_tx.send(ToolMessage::Output(format!(
|
||||||
self.prompt.action = None;
|
"{}, {} and all contents will be deleted. Continue? (y/N)",
|
||||||
} else {
|
project.files.display(),
|
||||||
self.prompt.action = Some(ToolMessage::RemoveProject);
|
project.notes.display()
|
||||||
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
|
let ast = self
|
||||||
@@ -926,7 +947,10 @@ impl DistroBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct Prompt {
|
struct Prompt {
|
||||||
action: Option<ToolMessage>,
|
action: Option<ToolMessage>,
|
||||||
responses: Vec<String>,
|
responses: Vec<String>,
|
||||||
|
execute_command: String,
|
||||||
|
num_responses: usize,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user