diff --git a/CHANGELOG.md b/CHANGELOG.md index 07a20cf99..33d39bdf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,13 @@ * Fixed the diff visualizer of connected sessions. ([#674]) * Fixed disconnected session activity. ([#675]) * Skip confirming patches that contain only a datamodel name change. ([#688]) +* Added protection against syncing a model to a place. ([#691]) [#668]: https://github.com/rojo-rbx/rojo/pull/668 [#674]: https://github.com/rojo-rbx/rojo/pull/674 [#675]: https://github.com/rojo-rbx/rojo/pull/675 [#688]: https://github.com/rojo-rbx/rojo/pull/688 +[#691]: https://github.com/rojo-rbx/rojo/pull/691 ## [7.3.0] - April 22, 2023 * Added `$attributes` to project format. ([#574]) diff --git a/plugin/src/ServeSession.lua b/plugin/src/ServeSession.lua index f77c8c742..08dc40411 100644 --- a/plugin/src/ServeSession.lua +++ b/plugin/src/ServeSession.lua @@ -232,6 +232,22 @@ function ServeSession:__initialSync(serverInfo) Log.error("Could not compute a diff to catch up to the Rojo server: {:#?}", catchUpPatch) end + for _, update in catchUpPatch.updated do + if + update.id == self.__instanceMap.fromInstances[game] + and update.changedClassName ~= nil + then + -- Non-place projects will try to update the classname of game from DataModel to + -- something like Folder, ModuleScript, etc. This would fail, so we exit with a clear + -- message instead of crashing. + return Promise.reject( + "Cannot sync a model as a place." + .. "\nEnsure Rojo is serving a project file that has a DataModel at the root of its tree and try again." + .. "\nSee project file docs: https://rojo.space/docs/v7/project-format/" + ) + end + end + Log.trace("Computed hydration patch: {:#?}", debugPatch(catchUpPatch)) local userDecision = "Accept"