diff --git a/src/cli/syncback.rs b/src/cli/syncback.rs index 282d55c8..ade184b2 100644 --- a/src/cli/syncback.rs +++ b/src/cli/syncback.rs @@ -54,6 +54,11 @@ pub struct SyncbackCommand { /// If provided, the prompt for writing to the file system is skipped. #[clap(long, short = 'y')] pub non_interactive: bool, + + /// If provided, forces syncback to use JSON model files instead of binary + /// .rbxm files for instances that would otherwise serialize as binary. + #[clap(long)] + pub dangerously_force_json: bool, } impl SyncbackCommand { @@ -104,6 +109,7 @@ impl SyncbackCommand { &mut dom_old, dom_new, session_old.root_project(), + self.dangerously_force_json, )?; log::debug!( "Syncback finished in {:.02}s!", diff --git a/src/syncback/mod.rs b/src/syncback/mod.rs index 61d26674..e8a7d79d 100644 --- a/src/syncback/mod.rs +++ b/src/syncback/mod.rs @@ -52,6 +52,7 @@ pub fn syncback_loop( old_tree: &mut RojoTree, mut new_tree: WeakDom, project: &Project, + force_json: bool, ) -> anyhow::Result { let ignore_patterns = project .syncback_rules @@ -153,6 +154,7 @@ pub fn syncback_loop( old_tree, new_tree: &new_tree, project, + force_json, }; let mut snapshots = vec![SyncbackSnapshot { @@ -197,7 +199,7 @@ pub fn syncback_loop( } } - let middleware = get_best_middleware(&snapshot); + let middleware = get_best_middleware(&snapshot, force_json); log::trace!( "Middleware for {inst_path} is {:?} (path is {})", @@ -213,10 +215,14 @@ pub fn syncback_loop( let syncback = match middleware.syncback(&snapshot) { Ok(syncback) => syncback, Err(err) if middleware == Middleware::Dir => { - let new_middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { - Ok(value) if value == "1" => Middleware::Rbxmx, - Ok(value) if value == "2" => Middleware::JsonModel, - _ => Middleware::Rbxm, + let new_middleware = if force_json { + Middleware::JsonModel + } else { + match env::var(DEBUG_MODEL_FORMAT_VAR) { + Ok(value) if value == "1" => Middleware::Rbxmx, + Ok(value) if value == "2" => Middleware::JsonModel, + _ => Middleware::Rbxm, + } }; let file_name = snapshot .path @@ -295,7 +301,7 @@ pub struct SyncbackReturn<'sync> { pub removed_children: Vec>, } -pub fn get_best_middleware(snapshot: &SyncbackSnapshot) -> Middleware { +pub fn get_best_middleware(snapshot: &SyncbackSnapshot, force_json: bool) -> Middleware { // At some point, we're better off using an O(1) method for checking // equality for classes like this. static JSON_MODEL_CLASSES: OnceLock> = OnceLock::new(); @@ -361,10 +367,18 @@ pub fn get_best_middleware(snapshot: &SyncbackSnapshot) -> Middleware { } if middleware == Middleware::Rbxm { - middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { - Ok(value) if value == "1" => Middleware::Rbxmx, - Ok(value) if value == "2" => Middleware::JsonModel, - _ => Middleware::Rbxm, + middleware = if force_json { + if !inst.children().is_empty() { + Middleware::Dir + } else { + Middleware::JsonModel + } + } else { + match env::var(DEBUG_MODEL_FORMAT_VAR) { + Ok(value) if value == "1" => Middleware::Rbxmx, + Ok(value) if value == "2" => Middleware::JsonModel, + _ => Middleware::Rbxm, + } } } diff --git a/src/syncback/snapshot.rs b/src/syncback/snapshot.rs index 384033d6..e730503a 100644 --- a/src/syncback/snapshot.rs +++ b/src/syncback/snapshot.rs @@ -20,6 +20,7 @@ pub struct SyncbackData<'sync> { pub(super) old_tree: &'sync RojoTree, pub(super) new_tree: &'sync WeakDom, pub(super) project: &'sync Project, + pub(super) force_json: bool, } pub struct SyncbackSnapshot<'sync> { @@ -43,7 +44,7 @@ impl<'sync> SyncbackSnapshot<'sync> { path: PathBuf::new(), middleware: None, }; - let middleware = get_best_middleware(&snapshot); + let middleware = get_best_middleware(&snapshot, self.data.force_json); let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?; snapshot.path = self.path.join(name.as_ref()); @@ -69,7 +70,7 @@ impl<'sync> SyncbackSnapshot<'sync> { path: PathBuf::new(), middleware: None, }; - let middleware = get_best_middleware(&snapshot); + let middleware = get_best_middleware(&snapshot, self.data.force_json); let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?; snapshot.path = base_path.join(name.as_ref());