mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-20 12:45:05 +00:00
Improve sync fallback robustness (#1135)
This commit is contained in:
@@ -3,8 +3,10 @@
|
|||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
* Fixed a bug where the last sync timestamp was not updating correctly in the plugin ([#1132])
|
* Fixed a bug where the last sync timestamp was not updating correctly in the plugin ([#1132])
|
||||||
|
* Improved the reliability of sync replacements by adding better error handling and recovery ([#1135])
|
||||||
|
|
||||||
[#1132]: https://github.com/rojo-rbx/rojo/pull/1132
|
[#1132]: https://github.com/rojo-rbx/rojo/pull/1132
|
||||||
|
[#1135]: https://github.com/rojo-rbx/rojo/pull/1135
|
||||||
|
|
||||||
## 7.6.0 - October 10th, 2025
|
## 7.6.0 - October 10th, 2025
|
||||||
* Added flag to `rojo init` to skip initializing a git repository ([#1122])
|
* Added flag to `rojo init` to skip initializing a git repository ([#1122])
|
||||||
|
|||||||
@@ -48,6 +48,12 @@ local function debugPatch(object)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function attemptReparent(instance, parent)
|
||||||
|
return pcall(function()
|
||||||
|
instance.Parent = parent
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
local ServeSession = {}
|
local ServeSession = {}
|
||||||
ServeSession.__index = ServeSession
|
ServeSession.__index = ServeSession
|
||||||
|
|
||||||
@@ -291,18 +297,52 @@ function ServeSession:__replaceInstances(idList)
|
|||||||
|
|
||||||
for id, replacement in replacements do
|
for id, replacement in replacements do
|
||||||
local oldInstance = self.__instanceMap.fromIds[id]
|
local oldInstance = self.__instanceMap.fromIds[id]
|
||||||
|
if not oldInstance then
|
||||||
|
-- TODO: Why would this happen?
|
||||||
|
Log.warn("Instance {} not found in InstanceMap during sync replacement", id)
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
|
||||||
self.__instanceMap:insert(id, replacement)
|
self.__instanceMap:insert(id, replacement)
|
||||||
Log.trace("Swapping Instance {} out via api/models/ endpoint", id)
|
Log.trace("Swapping Instance {} out via api/models/ endpoint", id)
|
||||||
local oldParent = oldInstance.Parent
|
local oldParent = oldInstance.Parent
|
||||||
for _, child in oldInstance:GetChildren() do
|
for _, child in oldInstance:GetChildren() do
|
||||||
child.Parent = replacement
|
-- Some children cannot be reparented, such as a TouchTransmitter
|
||||||
|
local reparentSuccess, reparentError = attemptReparent(child, replacement)
|
||||||
|
if not reparentSuccess then
|
||||||
|
Log.warn(
|
||||||
|
"Could not reparent child {} of instance {} during sync replacement: {}",
|
||||||
|
child.Name,
|
||||||
|
oldInstance.Name,
|
||||||
|
reparentError
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
replacement.Parent = oldParent
|
|
||||||
-- ChangeHistoryService doesn't like it if an Instance has been
|
-- ChangeHistoryService doesn't like it if an Instance has been
|
||||||
-- Destroyed. So, we have to accept the potential memory hit and
|
-- Destroyed. So, we have to accept the potential memory hit and
|
||||||
-- just set the parent to `nil`.
|
-- just set the parent to `nil`.
|
||||||
oldInstance.Parent = nil
|
local deleteSuccess, deleteError = attemptReparent(oldInstance, nil)
|
||||||
|
local replaceSuccess, replaceError = attemptReparent(replacement, oldParent)
|
||||||
|
|
||||||
|
if not (deleteSuccess and replaceSuccess) then
|
||||||
|
Log.warn(
|
||||||
|
"Could not swap instances {} and {} during sync replacement: {}",
|
||||||
|
oldInstance.Name,
|
||||||
|
replacement.Name,
|
||||||
|
(deleteError or "") .. "\n" .. (replaceError or "")
|
||||||
|
)
|
||||||
|
|
||||||
|
-- We need to revert the failed swap to avoid losing the old instance and children.
|
||||||
|
for _, child in replacement:GetChildren() do
|
||||||
|
attemptReparent(child, oldInstance)
|
||||||
|
end
|
||||||
|
attemptReparent(oldInstance, oldParent)
|
||||||
|
|
||||||
|
-- Our replacement should never have existed in the first place, so we can just destroy it.
|
||||||
|
replacement:Destroy()
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
|
||||||
if selectionMap[oldInstance] then
|
if selectionMap[oldInstance] then
|
||||||
-- This is a bit funky, but it saves the order of Selection
|
-- This is a bit funky, but it saves the order of Selection
|
||||||
|
|||||||
Reference in New Issue
Block a user