view src/luan/host/Backup.luan @ 1376:ba1b4583c2d5

enable restore
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 11 Jul 2019 23:30:55 -0600
parents 72b699bad1a4
children
line wrap: on
line source

local Luan = require "luan:Luan.luan"
local error = Luan.error
local ipairs = Luan.ipairs or error()
local Io = require "luan:Io.luan"
local uri = Io.uri or error()
local Thread = require "luan:Thread.luan"
local run_in_lock = Thread.run_in_lock or error()
local backup_write_lock = Thread.backup_write_lock or error()


local Backup = {}

local function backup_nonlocal(from,to)
	to.mkdir()
	for _, from_child in ipairs(from.children()) do
		local name = from_child.name()
		local to_child = to.child(name)
		if from_child.is_directory() then
			if name ~= "local" then
				backup_nonlocal( from_child, to_child )
			end
		elseif from_child.is_file() then
			to_child.link_to(from_child)
		else
			error(from_child.to_string().." isn't dir or file")
		end
	end
end

local function backup_all(from,to)
	to.mkdir()
	for _, from_child in ipairs(from.children()) do
		local name = from_child.name()
		local to_child = to.child(name)
		if from_child.is_directory() then
			backup_all( from_child, to_child )
		elseif from_child.is_file() then
			to_child.link_to(from_child)
		else
			error(from_child.to_string().." isn't dir or file")
		end
	end
end

local function backup_local(from,to)
	local dir = "site/private/local/"
	from = from.child(dir.."backup")
	to = to.child(dir.."restore")
	if from.exists() then
		from.is_directory() or error(from.to_string().." isn't dir")
		backup_all(from,to)
	end
end

local function backup(backup_dir)
	local sites_dir = uri "file:sites"
	backup_dir.mkdir()
	for _, site_dir in ipairs(sites_dir.children()) do
		local to = backup_dir.child(site_dir.name())
		backup_nonlocal( site_dir, to )
		backup_local( site_dir, to )
	end
end

function Backup.backup(backup_dir)
	run_in_lock( backup_write_lock, backup, backup_dir )
end

return Backup