From bf2d2e82dfa16b4015dbe9782bf98ee629a94a71 Mon Sep 17 00:00:00 2001 From: iksuddle Date: Sat, 9 Aug 2025 23:41:26 +0400 Subject: [PATCH 1/5] feat: remove id from local config after deleting project --- cargo-shuttle/src/config.rs | 5 +++++ cargo-shuttle/src/lib.rs | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index b026c42d4..d176d6fd6 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -169,6 +169,11 @@ impl RequestContext { InternalProjectConfig { id: Some(id) }; } + pub fn remove_project_id(&mut self) { + *self.project_internal.as_mut().unwrap().as_mut().unwrap() = + InternalProjectConfig { id: None }; + } + pub fn save_local_internal(&mut self) -> Result<()> { self.project_internal.as_ref().unwrap().save()?; diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index a5759cb93..62fd6e7d7 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -2028,7 +2028,7 @@ impl Shuttle { Ok(()) } - async fn project_delete(&self, no_confirm: bool) -> Result<()> { + async fn project_delete(&mut self, no_confirm: bool) -> Result<()> { let client = self.client.as_ref().unwrap(); let pid = self.ctx.project_id(); @@ -2064,6 +2064,9 @@ impl Shuttle { let res = client.delete_project(pid).await?.into_inner(); + self.ctx.remove_project_id(); + self.ctx.save_local_internal()?; + println!("{res}"); Ok(()) From 666af3d2ce3550c600c5ca9518a6ebbe6e9a0d20 Mon Sep 17 00:00:00 2001 From: iksuddle Date: Sun, 10 Aug 2025 02:10:22 +0400 Subject: [PATCH 2/5] feat: update project id after creation --- cargo-shuttle/src/config.rs | 2 +- cargo-shuttle/src/lib.rs | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index d176d6fd6..825752c85 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -181,7 +181,7 @@ impl RequestContext { // TODO: assumes git is used create_or_update_ignore_file( &self - .project + .project_internal .as_ref() .unwrap() .manager diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 62fd6e7d7..9576c7e17 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -300,7 +300,7 @@ impl Shuttle { } => self.delete_certificate(domain, yes).await, }, Command::Project(cmd) => match cmd { - ProjectCommand::Create => self.project_create(args.project_args.name).await, + ProjectCommand::Create => self.project_create(&args.project_args).await, ProjectCommand::Update(cmd) => match cmd { ProjectUpdateCommand::Name { new_name } => self.project_rename(new_name).await, }, @@ -1929,24 +1929,31 @@ impl Shuttle { Ok(()) } - async fn project_create(&self, name: Option) -> Result<()> { - let Some(ref name) = name else { + async fn project_create(&mut self, project_args: &ProjectArgs) -> Result<()> { + let Some(ref name) = project_args.name else { bail!("Provide a project name with '--name '"); }; + self.ctx.load_local_internal_config(project_args)?; + let client = self.client.as_ref().unwrap(); let r = client.create_project(name).await?; + let raw_json = r.raw_json.clone(); + let project = r.into_inner(); + match self.output_mode { OutputMode::Normal => { - let project = r.into_inner(); println!("Created project '{}' with id {}", project.name, project.id); } OutputMode::Json => { - println!("{}", r.raw_json); + println!("{}", raw_json); } } + self.ctx.set_project_id(project.id); + self.ctx.save_local_internal()?; + Ok(()) } From 2723b171117d869fc27a670f51c03a514f9da680 Mon Sep 17 00:00:00 2001 From: iksuddle Date: Wed, 10 Sep 2025 12:33:33 -0400 Subject: [PATCH 3/5] fix: update id in local config if in rust project --- cargo-shuttle/src/config.rs | 2 +- cargo-shuttle/src/lib.rs | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index 825752c85..d176d6fd6 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -181,7 +181,7 @@ impl RequestContext { // TODO: assumes git is used create_or_update_ignore_file( &self - .project_internal + .project .as_ref() .unwrap() .manager diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index 9576c7e17..e4ba3e0f0 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -1937,22 +1937,22 @@ impl Shuttle { self.ctx.load_local_internal_config(project_args)?; let client = self.client.as_ref().unwrap(); - let r = client.create_project(name).await?; - - let raw_json = r.raw_json.clone(); - let project = r.into_inner(); + let (proj, raw_json) = client.create_project(name).await?.into_parts(); match self.output_mode { OutputMode::Normal => { - println!("Created project '{}' with id {}", project.name, project.id); + println!("Created project '{}' with id {}", proj.name, proj.id); } OutputMode::Json => { println!("{}", raw_json); } } - self.ctx.set_project_id(project.id); - self.ctx.save_local_internal()?; + // Update the local internal config file if we are in a Rust project + if project_args.workspace_path().is_ok() { + self.ctx.set_project_id(proj.id); + self.ctx.save_local_internal()?; + } Ok(()) } @@ -2071,6 +2071,9 @@ impl Shuttle { let res = client.delete_project(pid).await?.into_inner(); + // todo + // if --id is provided, then we don't want to clear the id in the config file + // also should only happen if the file exists self.ctx.remove_project_id(); self.ctx.save_local_internal()?; From 1ca0a068bb0dcc26a9b791c5e719b17324f72089 Mon Sep 17 00:00:00 2001 From: iksuddle Date: Sat, 13 Sep 2025 15:22:06 -0400 Subject: [PATCH 4/5] fix: delete internal config id if equal to context id --- cargo-shuttle/src/config.rs | 14 ++++++++++++++ cargo-shuttle/src/lib.rs | 24 +++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index d176d6fd6..0618a5d3e 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -174,6 +174,20 @@ impl RequestContext { InternalProjectConfig { id: None }; } + pub fn linked_project_id(&self, project_args: &ProjectArgs) -> Option { + let workspace_path = project_args + .workspace_path() + .unwrap_or(project_args.working_directory.clone()); + + let local_manager = + LocalConfigManager::new(workspace_path, ".shuttle/config.toml".to_string()); + let mut config = Config::new(local_manager); + config.open().unwrap(); + let content: &InternalProjectConfig = config.as_ref().unwrap(); + + content.id.clone() + } + pub fn save_local_internal(&mut self) -> Result<()> { self.project_internal.as_ref().unwrap().save()?; diff --git a/cargo-shuttle/src/lib.rs b/cargo-shuttle/src/lib.rs index e4ba3e0f0..0c1753b6d 100644 --- a/cargo-shuttle/src/lib.rs +++ b/cargo-shuttle/src/lib.rs @@ -306,7 +306,9 @@ impl Shuttle { }, ProjectCommand::Status => self.project_status().await, ProjectCommand::List { table, .. } => self.projects_list(table).await, - ProjectCommand::Delete(ConfirmationArgs { yes }) => self.project_delete(yes).await, + ProjectCommand::Delete(ConfirmationArgs { yes }) => { + self.project_delete(yes, &args.project_args).await + } ProjectCommand::Link => Ok(()), // logic is done in `load_project_id` in previous step }, Command::Upgrade { preview } => update_cargo_shuttle(preview).await, @@ -1948,6 +1950,9 @@ impl Shuttle { } } + // self.ctx.project needs to be loaded for updating gitignore + self.ctx.load_local_config(project_args)?; + // Update the local internal config file if we are in a Rust project if project_args.workspace_path().is_ok() { self.ctx.set_project_id(proj.id); @@ -2035,7 +2040,7 @@ impl Shuttle { Ok(()) } - async fn project_delete(&mut self, no_confirm: bool) -> Result<()> { + async fn project_delete(&mut self, no_confirm: bool, project_args: &ProjectArgs) -> Result<()> { let client = self.client.as_ref().unwrap(); let pid = self.ctx.project_id(); @@ -2071,11 +2076,16 @@ impl Shuttle { let res = client.delete_project(pid).await?.into_inner(); - // todo - // if --id is provided, then we don't want to clear the id in the config file - // also should only happen if the file exists - self.ctx.remove_project_id(); - self.ctx.save_local_internal()?; + if self + .ctx + .linked_project_id(project_args) + .as_ref() + .map(|id| id.as_str() == self.ctx.project_id()) + .unwrap_or(false) + { + self.ctx.remove_project_id(); + self.ctx.save_local_internal()?; + } println!("{res}"); From b42e609453b39dff6807469b696cf9ae0d68a6c0 Mon Sep 17 00:00:00 2001 From: iksuddle Date: Sat, 13 Sep 2025 15:29:23 -0400 Subject: [PATCH 5/5] fix: don't panic if config file not found --- cargo-shuttle/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cargo-shuttle/src/config.rs b/cargo-shuttle/src/config.rs index 0618a5d3e..93d496664 100644 --- a/cargo-shuttle/src/config.rs +++ b/cargo-shuttle/src/config.rs @@ -182,7 +182,7 @@ impl RequestContext { let local_manager = LocalConfigManager::new(workspace_path, ".shuttle/config.toml".to_string()); let mut config = Config::new(local_manager); - config.open().unwrap(); + config.open().ok()?; let content: &InternalProjectConfig = config.as_ref().unwrap(); content.id.clone()