diff --git a/gitbutler-app/src/projects/commands.rs b/gitbutler-app/src/projects/commands.rs index 69849f5cd..c3f1e0c7d 100644 --- a/gitbutler-app/src/projects/commands.rs +++ b/gitbutler-app/src/projects/commands.rs @@ -13,6 +13,12 @@ use super::controller::{self, Controller}; impl From for Error { fn from(value: controller::UpdateError) -> Self { match value { + controller::UpdateError::Validation( + controller::UpdateValidationError::KeyNotFound(path) + ) => Error::UserError { + code: Code::Projects, + message: format!("key '{}' not found", path.display()), + }, controller::UpdateError::NotFound => Error::UserError { code: Code::Projects, message: "Project not found".into(), diff --git a/gitbutler-app/src/projects/controller.rs b/gitbutler-app/src/projects/controller.rs index 37b63a906..f20392549 100644 --- a/gitbutler-app/src/projects/controller.rs +++ b/gitbutler-app/src/projects/controller.rs @@ -92,6 +92,16 @@ impl Controller { } pub async fn update(&self, project: &UpdateRequest) -> Result { + if let Some(super::AuthKey::Local { private_key_path, .. }) = &project.preferred_key { + use resolve_path::PathResolveExt; + let private_key_path = private_key_path.resolve(); + if !private_key_path.exists() { + return Err(UpdateError::Validation( + UpdateValidationError::KeyNotFound(private_key_path.to_path_buf()), + )); + } + } + let updated = self .projects_storage .update(project) @@ -203,9 +213,17 @@ pub enum UpdateError { #[error("project not found")] NotFound, #[error(transparent)] + Validation(UpdateValidationError), + #[error(transparent)] Other(#[from] anyhow::Error), } +#[derive(Debug, thiserror::Error)] +pub enum UpdateValidationError { + #[error("{0} not found")] + KeyNotFound(path::PathBuf), +} + #[derive(Debug, thiserror::Error)] pub enum AddError { #[error("not a directory")]