From df547d4658c123dc8375cce5f465c4e82f243fa1 Mon Sep 17 00:00:00 2001 From: Dotan Nahum Date: Thu, 1 Feb 2024 14:04:55 +0200 Subject: [PATCH] feat: migration only #400 --- src/cli.rs | 16 +++++++++++++++- src/gen/mod.rs | 15 +++++++++++++-- src/gen/model.rs | 41 ++++++++++++++++++++++------------------- src/gen/scaffold.rs | 6 ++++-- 4 files changed, 54 insertions(+), 24 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 3d5f8be8f..bcde7213b 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -120,6 +120,10 @@ enum ComponentArg { #[arg(short, long, action)] link: bool, + /// Generate migration code only. Don't run the migration automatically. + #[arg(short, long, action)] + migration_only: bool, + /// Model fields, eg. title:string hits:int #[clap(value_parser = parse_key_val::)] fields: Vec<(String, String)>, @@ -168,7 +172,17 @@ impl From for Component { fn from(value: ComponentArg) -> Self { match value { #[cfg(feature = "with-db")] - ComponentArg::Model { name, link, fields } => Self::Model { name, link, fields }, + ComponentArg::Model { + name, + link, + migration_only, + fields, + } => Self::Model { + name, + link, + migration_only, + fields, + }, #[cfg(feature = "with-db")] ComponentArg::Migration { name } => Self::Migration { name }, #[cfg(feature = "with-db")] diff --git a/src/gen/mod.rs b/src/gen/mod.rs index ddc475113..237464c59 100644 --- a/src/gen/mod.rs +++ b/src/gen/mod.rs @@ -71,6 +71,9 @@ pub enum Component { /// Model fields, eg. title:string hits:int fields: Vec<(String, String)>, + + /// Generate migration code and stop, don't run the migration + migration_only: bool, }, #[cfg(feature = "with-db")] Migration { @@ -109,8 +112,16 @@ pub fn generate(component: Component, config: &Config) -> Result<()> { match component { #[cfg(feature = "with-db")] - Component::Model { name, link, fields } => { - println!("{}", model::generate::(&rrgen, &name, link, &fields)?); + Component::Model { + name, + link, + fields, + migration_only, + } => { + println!( + "{}", + model::generate::(&rrgen, &name, link, migration_only, &fields)? + ); } #[cfg(feature = "with-db")] Component::Scaffold { name, fields } => { diff --git a/src/gen/model.rs b/src/gen/model.rs index 979b97647..54b28b6f3 100644 --- a/src/gen/model.rs +++ b/src/gen/model.rs @@ -65,6 +65,7 @@ pub fn generate( rrgen: &RRgen, name: &str, is_link: bool, + migration_only: bool, fields: &[(String, String)], ) -> Result { let pkg_name: &str = H::app_name(); @@ -101,25 +102,27 @@ pub fn generate( let res1 = rrgen.generate(MODEL_T, &vars)?; let res2 = rrgen.generate(MODEL_TEST_T, &vars)?; - let cwd = current_dir()?; - let _ = cmd!("cargo", "loco", "db", "migrate",) - .stderr_to_stdout() - .dir(cwd.as_path()) - .run() - .map_err(|err| { - Error::Message(format!( - "failed to run loco db migration. error details: `{err}`", - )) - })?; - let _ = cmd!("cargo", "loco", "db", "entities",) - .stderr_to_stdout() - .dir(cwd.as_path()) - .run() - .map_err(|err| { - Error::Message(format!( - "failed to run loco db entities. error details: `{err}`", - )) - })?; + if !migration_only { + let cwd = current_dir()?; + let _ = cmd!("cargo", "loco", "db", "migrate",) + .stderr_to_stdout() + .dir(cwd.as_path()) + .run() + .map_err(|err| { + Error::Message(format!( + "failed to run loco db migration. error details: `{err}`", + )) + })?; + let _ = cmd!("cargo", "loco", "db", "entities",) + .stderr_to_stdout() + .dir(cwd.as_path()) + .run() + .map_err(|err| { + Error::Message(format!( + "failed to run loco db entities. error details: `{err}`", + )) + })?; + } let messages = collect_messages(vec![res1, res2]); Ok(messages) diff --git a/src/gen/scaffold.rs b/src/gen/scaffold.rs index fd83218c0..3672918fd 100644 --- a/src/gen/scaffold.rs +++ b/src/gen/scaffold.rs @@ -37,8 +37,10 @@ pub fn generate( name: &str, fields: &[(String, String)], ) -> Result { - // scaffold is never a link table - let model_messages = model::generate::(rrgen, name, false, fields)?; + // - scaffold is never a link table + // - never run with migration_only, because the controllers will refer to the + // models. the models only arrive after migration and entities sync. + let model_messages = model::generate::(rrgen, name, false, false, fields)?; let mut columns = Vec::new(); for (fname, ftype) in fields {