From d08780fc14a17ea5ce887b35889a8d06bd7423bf Mon Sep 17 00:00:00 2001 From: Micah Date: Sat, 29 Nov 2025 21:21:48 -0800 Subject: [PATCH] Ensure that pruned Instances aren't treated as existing in syncback (#1179) Closes #1178. --- CHANGELOG.md | 3 +++ ...ck_util__ref_properties_pruned-stdout.snap | 7 +++++ ...rties_pruned-src__Pointer1.model.json.snap | 7 +++++ ...rties_pruned-src__Pointer2.model.json.snap | 7 +++++ ...rties_pruned-src__Pointer3.model.json.snap | 7 +++++ .../input-project/default.project.json | 9 +++++++ .../input-project/src/.gitkeep | 0 .../ref_properties_pruned/input.rbxl | Bin 0 -> 48562 bytes src/syncback/ref_properties.rs | 25 ++++++++++++++---- tests/tests/syncback.rs | 6 ++++- 10 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap create mode 100644 rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json create mode 100644 rojo-test/syncback-tests/ref_properties_pruned/input-project/src/.gitkeep create mode 100644 rojo-test/syncback-tests/ref_properties_pruned/input.rbxl diff --git a/CHANGELOG.md b/CHANGELOG.md index 410a7cb0..7843cb44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,9 @@ Making a new release? Simply add the new header with the version and date undern --> ## Unreleased +* Fixed a bug caused by having reference properties (such as `ObjectValue.Value`) that point to an Instance not included in syncback. ([#1179]) + +[#1179]: https://github.com/rojo-rbx/rojo/pull/1179 ## [7.7.0-rc.1] (November 27th, 2025) diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap new file mode 100644 index 00000000..3a9c2502 --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap @@ -0,0 +1,7 @@ +--- +source: tests/rojo_test/syncback_util.rs +expression: "String::from_utf8_lossy(&output.stdout)" +--- +Writing src/Pointer1.model.json +Writing src/Pointer2.model.json +Writing src/Pointer3.model.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap new file mode 100644 index 00000000..aeee8256 --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap @@ -0,0 +1,7 @@ +--- +source: tests/tests/syncback.rs +expression: src/Pointer1.model.json +--- +{ + "className": "ObjectValue" +} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap new file mode 100644 index 00000000..87da5680 --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap @@ -0,0 +1,7 @@ +--- +source: tests/tests/syncback.rs +expression: src/Pointer2.model.json +--- +{ + "className": "ObjectValue" +} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap new file mode 100644 index 00000000..9c5e3b94 --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap @@ -0,0 +1,7 @@ +--- +source: tests/tests/syncback.rs +expression: src/Pointer3.model.json +--- +{ + "className": "ObjectValue" +} diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json new file mode 100644 index 00000000..9656479a --- /dev/null +++ b/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json @@ -0,0 +1,9 @@ +{ + "name": "ref_properties_pruned", + "tree": { + "$className": "DataModel", + "ServerScriptService": { + "$path": "src" + } + } +} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input-project/src/.gitkeep b/rojo-test/syncback-tests/ref_properties_pruned/input-project/src/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input.rbxl b/rojo-test/syncback-tests/ref_properties_pruned/input.rbxl new file mode 100644 index 0000000000000000000000000000000000000000..1513ff1197476f9dc2c31f31549e928373078930 GIT binary patch literal 48562 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 RefLinks { continue; } + let target = match dom.get_by_ref(*prop_value) { + Some(inst) => inst, + None => { + // Properties that are Some but point to nothing may as + // well be `nil`. Roblox and us never produce these values + // but syncback prunes trees without adjusting ref + // properties for performance reasons. + log::warn!( + "Property {}.{} will be `nil` on the disk because the actual value is not being included in syncback", + inst_path(dom, inst_ref), + prop_name + ); + continue; + } + }; + links.insert( inst_ref, RefLink { @@ -58,10 +77,6 @@ pub fn collect_referents(dom: &WeakDom) -> RefLinks { }, ); - let target = dom - .get_by_ref(*prop_value) - .expect("Refs in DOM should point to valid Instances"); - // 1. Check if target has an ID if let Some(id) = get_existing_id(target) { // If it does, we need to check whether that ID is a duplicate diff --git a/tests/tests/syncback.rs b/tests/tests/syncback.rs index 851b4e4d..31553496 100644 --- a/tests/tests/syncback.rs +++ b/tests/tests/syncback.rs @@ -71,8 +71,13 @@ syncback_tests! { ref_properties_conflict => ["src/Pointer_2.model.json", "src/Target_2.model.json"], // Ensures that having multiple pointers that are aimed at the same target doesn't trigger ref rewrites. ref_properties_duplicate => [], + // Ensures that ref properties that point to nothing after the prune both + // do not leave any trace of themselves + ref_properties_pruned => ["src/Pointer1.model.json", "src/Pointer2.model.json", "src/Pointer3.model.json"], // Ensures that the old middleware is respected during syncback respect_old_middleware => ["default.project.json", "src/model_json.model.json", "src/rbxm.rbxm", "src/rbxmx.rbxmx"], + // Ensures that the `$schema` field roundtrips with syncback + schema_roundtrip => ["default.project.json", "src/model.model.json", "src/init/init.meta.json", "src/adjacent.meta.json"], // Ensures that StringValues inside project files are written to the // project file, but only if they don't have `$path` set string_value_project => ["default.project.json"], @@ -81,5 +86,4 @@ syncback_tests! { sync_rules => ["src/module.modulescript", "src/text.text"], // Ensures that the `syncUnscriptable` setting works unscriptable_properties => ["default.project.json"], - schema_roundtrip => ["default.project.json", "src/model.model.json", "src/init/init.meta.json", "src/adjacent.meta.json"] }