use FileSystem to get fs events

This commit is contained in:
sloane 2024-02-16 17:27:46 -05:00
parent ee02c6b5ea
commit aa01ee6967
4 changed files with 36 additions and 6 deletions

View file

@ -2,12 +2,13 @@ defmodule Mix.Tasks.Site.Build do
@moduledoc "Build and output the site as HTML" @moduledoc "Build and output the site as HTML"
@shortdoc "build the site" @shortdoc "build the site"
use Mix.Task use Mix.Task
require Logger
alias SloaneSH.Format alias SloaneSH.Format
@impl Mix.Task @impl Mix.Task
def run(_args) do def run(_args) do
{micro, :ok} = :timer.tc(&SloaneSH.build/0) {micro, :ok} = :timer.tc(&SloaneSH.build/0)
IO.puts("built site in #{Format.time(micro)}") Logger.info("Built site in #{Format.time(micro)}")
end end
end end

View file

@ -2,10 +2,11 @@ defmodule Mix.Tasks.Site.Watch do
@moduledoc "Build and output the site as HTML watching for changes" @moduledoc "Build and output the site as HTML watching for changes"
@shortdoc "build the site and watch for changes" @shortdoc "build the site and watch for changes"
use Mix.Task use Mix.Task
require Logger
@impl Mix.Task @impl Mix.Task
def run(_args) do def run(_args) do
IO.puts("Starting site.watch...") Logger.info("Starting site.watch...")
{:ok, pid} = SloaneSH.watch() {:ok, pid} = SloaneSH.watch()
@ -14,7 +15,7 @@ defmodule Mix.Tasks.Site.Watch do
receive do receive do
{:DOWN, ^ref, _, _, _} -> {:DOWN, ^ref, _, _, _} ->
IO.puts("site.watch terminated") Logger.info("site.watch terminated")
:ok :ok
end end
end end

View file

@ -8,8 +8,6 @@ defmodule SloaneSH do
end end
def watch(_opts \\ []) do def watch(_opts \\ []) do
Task.start_link(fn -> SloaneSH.Watch.start_link()
Process.sleep(5_000)
end)
end end
end end

30
lib/sloane_sh/watch.ex Normal file
View file

@ -0,0 +1,30 @@
defmodule SloaneSH.Watch do
use GenServer
require Logger
def start_link(init_arg \\ [], opts \\ []) do
GenServer.start_link(__MODULE__, init_arg, opts)
end
@impl GenServer
def init([]) do
dirs = [Path.join(:code.priv_dir(:sloane_sh), "site")]
Logger.info("Watching #{inspect(dirs)} for changes")
{:ok, pid} = FileSystem.start_link(dirs: dirs)
FileSystem.subscribe(pid)
{:ok, pid}
end
@impl GenServer
def handle_info({:file_event, pid, {path, events}}, pid) do
Logger.info("File event: #{inspect(path)} #{inspect(events)}")
{:noreply, pid}
end
@impl GenServer
def handle_info({:file_event, pid, :stop}, pid) do
Logger.warning("File watcher stopped")
{:stop, :watcher_stopped, pid}
end
end