defmodule Virtfs.Loader do
alias Virtfs.Backend
def run(%Virtfs.FS{} = fs, dest, _opts \\ []) do
# ignore = Keyword.get(opts, :ignore, [])
# ignore_regexes = Enum.map(ignore, fn(str)-> Regex.buil)
files = Path.wildcard(dest <> "/**/**")
fs =
Enum.reduce(files, fs, fn path, fs ->
relpath = relative_path(dest, path)
type = ftype(path)
cond do
type == :dir -> Backend.mkdir_p(fs, relpath) |> elem(0)
type == :file -> Backend.write(fs, relpath, File.read!(path)) |> elem(0)
# we ignore symlinks for now
type == :symlink -> fs
end
end)
# TODO: handle errors ?
{:ok, fs}
end
def relative_path(dest, path) do
String.replace_leading(path, dest, "")
end
def ftype(path) do
res = File.stat(path)
case res do
{:ok, %{type: :regular}} -> :file
{:ok, %{type: :directory}} -> :dir
{:error, :enoent} -> check_symlink(path)
end
end
def check_symlink(path) do
res = File.read_link(path)
case res do
{:ok, _link_path} -> :symlink
{:error, _} -> :error
end
end
end