Merge branch 'feature/dangerously-force-json'

This commit is contained in:
2026-02-13 18:13:37 +01:00
3 changed files with 33 additions and 12 deletions

View File

@@ -54,6 +54,11 @@ pub struct SyncbackCommand {
/// If provided, the prompt for writing to the file system is skipped. /// If provided, the prompt for writing to the file system is skipped.
#[clap(long, short = 'y')] #[clap(long, short = 'y')]
pub non_interactive: bool, 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 { impl SyncbackCommand {
@@ -104,6 +109,7 @@ impl SyncbackCommand {
&mut dom_old, &mut dom_old,
dom_new, dom_new,
session_old.root_project(), session_old.root_project(),
self.dangerously_force_json,
)?; )?;
log::debug!( log::debug!(
"Syncback finished in {:.02}s!", "Syncback finished in {:.02}s!",

View File

@@ -52,6 +52,7 @@ pub fn syncback_loop(
old_tree: &mut RojoTree, old_tree: &mut RojoTree,
mut new_tree: WeakDom, mut new_tree: WeakDom,
project: &Project, project: &Project,
force_json: bool,
) -> anyhow::Result<FsSnapshot> { ) -> anyhow::Result<FsSnapshot> {
let ignore_patterns = project let ignore_patterns = project
.syncback_rules .syncback_rules
@@ -153,6 +154,7 @@ pub fn syncback_loop(
old_tree, old_tree,
new_tree: &new_tree, new_tree: &new_tree,
project, project,
force_json,
}; };
let mut snapshots = vec![SyncbackSnapshot { 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!( log::trace!(
"Middleware for {inst_path} is {:?} (path is {})", "Middleware for {inst_path} is {:?} (path is {})",
@@ -213,10 +215,14 @@ pub fn syncback_loop(
let syncback = match middleware.syncback(&snapshot) { let syncback = match middleware.syncback(&snapshot) {
Ok(syncback) => syncback, Ok(syncback) => syncback,
Err(err) if middleware == Middleware::Dir => { Err(err) if middleware == Middleware::Dir => {
let new_middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { let new_middleware = if force_json {
Ok(value) if value == "1" => Middleware::Rbxmx, Middleware::JsonModel
Ok(value) if value == "2" => Middleware::JsonModel, } else {
_ => Middleware::Rbxm, 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 let file_name = snapshot
.path .path
@@ -295,7 +301,7 @@ pub struct SyncbackReturn<'sync> {
pub removed_children: Vec<InstanceWithMeta<'sync>>, pub removed_children: Vec<InstanceWithMeta<'sync>>,
} }
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 // At some point, we're better off using an O(1) method for checking
// equality for classes like this. // equality for classes like this.
static JSON_MODEL_CLASSES: OnceLock<HashSet<&str>> = OnceLock::new(); static JSON_MODEL_CLASSES: OnceLock<HashSet<&str>> = OnceLock::new();
@@ -367,10 +373,18 @@ pub fn get_best_middleware(snapshot: &SyncbackSnapshot) -> Middleware {
} }
if middleware == Middleware::Rbxm { if middleware == Middleware::Rbxm {
middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { middleware = if force_json {
Ok(value) if value == "1" => Middleware::Rbxmx, if !inst.children().is_empty() {
Ok(value) if value == "2" => Middleware::JsonModel, Middleware::Dir
_ => Middleware::Rbxm, } 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,
}
} }
} }

View File

@@ -20,6 +20,7 @@ pub struct SyncbackData<'sync> {
pub(super) old_tree: &'sync RojoTree, pub(super) old_tree: &'sync RojoTree,
pub(super) new_tree: &'sync WeakDom, pub(super) new_tree: &'sync WeakDom,
pub(super) project: &'sync Project, pub(super) project: &'sync Project,
pub(super) force_json: bool,
} }
pub struct SyncbackSnapshot<'sync> { pub struct SyncbackSnapshot<'sync> {
@@ -43,7 +44,7 @@ impl<'sync> SyncbackSnapshot<'sync> {
path: PathBuf::new(), path: PathBuf::new(),
middleware: None, 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())?; let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?;
snapshot.path = self.path.join(name.as_ref()); snapshot.path = self.path.join(name.as_ref());
@@ -69,7 +70,7 @@ impl<'sync> SyncbackSnapshot<'sync> {
path: PathBuf::new(), path: PathBuf::new(),
middleware: None, 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())?; let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?;
snapshot.path = base_path.join(name.as_ref()); snapshot.path = base_path.join(name.as_ref());