myspace / CommonLua /Core /ProjectSync.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
7.96 kB
if not FirstLoad or not Platform.ios or not Platform.developer then return end
local Updating = true
local FolderSyncRequests = 0
local OriginalLuaAllocLimit = 0
local SyncStart = 0
local DownloadedFiles = {}
local DeletedFiles = {}
---
--- Uploads a file to the remote server in parts.
---
--- @param filepath string The path of the file to upload.
--- @param part integer The current part number of the file being uploaded.
--- @param all_parts integer The total number of parts the file is divided into.
--- @param part_size integer The size of the current part in bytes.
--- @param total_size integer The total size of the file in bytes.
--- @param max_part_size integer The maximum size of each part in bytes.
---
luadebugger.UploadFile = function(self, filepath, part, all_parts, part_size, total_size, max_part_size)
self.binary_mode = true
self.binary_handler = function(data)
self.binary_mode = false
CreateRealTimeThread(function()
local data_size = string.len(data)
if (part_size ~= string.len(data)) then
print(string.format("[Error] Invalid packet size - %d KB, (expected %d KB)", data_size / 1024,
part_size / 1024))
return
end
if part + 1 == all_parts then
DownloadedFiles[#DownloadedFiles + 1] = filepath
end
if all_parts > 1 then
print(string.format("[downloaded part %d/%d (%d/%d KB)] %s ", (part + 1), all_parts,
(part * max_part_size + part_size) / 1024, total_size / 1024, filepath))
else
print(string.format("[downloaded %d KB] %s ", ((string.len(data)) / 1024), filepath))
end
local folder = SplitPath(filepath)
if folder ~= "" and not io.exists(folder) then
print("Create folder: ", folder)
io.createpath(folder)
end
local mode = part > 0 and "a" or "w"
local f, err = io.open(filepath, mode)
if f then
f:write(data);
f:close()
else
print("[Error] ", err);
end
end)
end
end
---
--- Deletes a file from the local file system.
---
--- @param filepath string The path of the file to delete.
---
luadebugger.DeleteFile = function(self, filepath)
local ok, err = os.remove(filepath)
if not ok and err == "File Not Found" then
print("[Warning] File not found when trying to delete! " .. filepath);
ok = true
err = false
end
if ok then
print(string.format("[deleted] %s ", filepath))
DeletedFiles[#DeletedFiles + 1] = filepath
end
end
---
--- Requests a folder sync operation with the remote debugger.
---
--- @param folder string The local folder path to sync.
--- @param remote_folder string The remote folder path to sync to.
--- @param recursive boolean Whether to sync the folder recursively.
---
luadebugger.RequestFolderSync = function(self, folder, remote_folder, recursive)
local info = {}
local files = io.listfiles(folder, "*", recursive)
for fi = 1, #files do
local file = files[fi]
info[file:sub(folder:len() + 1)] = io.getmetadata(file, "modification_time")
end
-- print(info)
FolderSyncRequests = FolderSyncRequests + 1
self:Send({Event="RequestFolderSync", LocalFolder=folder, LocalFiles=info, Recursive=recursive,
RemoteFolder=remote_folder})
end
---
--- Callback function that is called when a folder sync operation has completed.
---
--- This function is called by the `luadebugger` module when a folder sync operation has finished.
--- It decrements the `FolderSyncRequests` counter and checks if all sync requests have completed.
--- If so, it restores the original `config.ReportLuaAlloc` value and sets `Updating` to `false`.
--- It also prints the total time taken for the project sync operation.
---
--- @function luadebugger.FolderSynced
--- @param self table The `luadebugger` module instance.
luadebugger.FolderSynced = function(self)
CreateRealTimeThread(function()
FolderSyncRequests = FolderSyncRequests - 1
if (FolderSyncRequests <= 0) then
config.ReportLuaAlloc = OriginalLuaAllocLimit
Updating = false
print(string.format("Project synced in %d s", (GetPreciseTicks() - SyncStart) / 1000))
end
end)
end
---
--- Requests a project sync operation with the remote debugger.
---
--- This function is responsible for syncing the local "AppData/Build" folder with the remote build folder on the debugger server.
--- It first saves the original `config.ReportLuaAlloc` value, then sets it to 0 to disable Lua allocation reporting during the sync.
--- It then calls `g_LuaDebugger:RequestFolderSync()` to initiate the sync operation, passing the local and remote folder paths.
--- The function returns `true` if the sync operation was started successfully, or `false` if there is no debugger available.
---
--- @return boolean true if the sync operation was started, false otherwise
function ProjectSync()
if g_LuaDebugger then
SyncStart = GetPreciseTicks()
OriginalLuaAllocLimit = config.ReportLuaAlloc
config.ReportLuaAlloc = 0
local remote_build_folder = string.format("%s\\Build\\%s", config.Haerald.ProjectAssetsPath, GetPlatformName())
g_LuaDebugger:RequestFolderSync("AppData/Build", remote_build_folder, "recursive")
return true;
else
print("Project sync skipped - no debugger")
return false
end
end
---
--- Initializes the remote debugger and starts the project sync process.
---
--- This function is responsible for setting up the remote debugger and initiating the project sync operation.
--- It first checks if the `config.Haerald` table exists, and if not, it creates it and populates it with settings from the bundle.
--- It then sets the `config.Haerald.platform` to the current platform name.
--- Next, it calls `SetupRemoteDebugger()` to configure the remote debugger with the appropriate IP address, remote root, and project folder.
--- Finally, it calls `StartDebugger()` to start the debugger, and then calls `ProjectSync()` to initiate the project sync operation.
--- If the project sync operation fails to start, it sets `Updating` to `false`.
---
--- @function CreateRealTimeThread
--- @return boolean true if the project sync operation was started, false otherwise
CreateRealTimeThread(function()
if Platform.ios and not config.Haerald then
config.Haerald = {}
config.Haerald.ip = GetBundleSetting("HaeraldIP")
config.Haerald.RemoteRoot = GetBundleSetting("RemoteRoot")
config.Haerald.ProjectFolder = GetBundleSetting("ProjectFolder")
end
config.Haerald.platform = GetPlatformName()
SetupRemoteDebugger(config.Haerald.ip or "localhost", config.Haerald.RemoteRoot or "",
config.Haerald.ProjectFolder or "")
StartDebugger()
local started = ProjectSync()
if not started then
Updating = false
end
end)
while(Updating) do
local t = GetPreciseTicks()
AdvanceThreads(t)
os.sleep(10)
end
---
--- Remounts all downloaded packs.
---
--- This code iterates through the `DownloadedFiles` table and checks if each file has the extension "Lua.hpk". If a file with this extension is found, it notifies the user that Lua boot changes will not be available in this run and a restart is required.
---
--- @param DownloadedFiles table A table of downloaded file paths
---
for i = 1, #DownloadedFiles do
local filepath = DownloadedFiles[i]
if filepath:find("Lua.hpk") then
-- notify user that lua boot changes will not be available
-- this run. Restart is required for them.
end
end
-- unmount and mount again all packs
if #DownloadedFiles > 0 then
print("Remounting all packs...")
dofile("mount.lua")
end