Current section

Files

Jump to
blogit lib updater.ex
Raw

lib/updater.ex

defmodule Blogit.Updater do
alias Blogit.Post
alias Blogit.Meta
alias Blogit.Configuration
alias Blogit.GitRepository
def check_updates(state) do
repository = state[:repository]
case GitRepository.fetch(repository) do
{:no_updates} -> :no_updates
{:updates, updates} -> update(updates, state, repository)
end
end
defp update(updates, state, repository) do
posts = updated_posts(state[:posts], updates, repository)
posts = updated_posts_by_meta(posts, updates, repository)
blog =
updated_blog_configuration(state[:blog], Configuration.updated?(updates))
{:updates, %{posts: posts, blog: blog}}
end
defp updated_posts(current_posts, updates, repository) do
new_files = Enum.filter(updates, &GitRepository.file_in?/1)
deleted_posts = (updates -- new_files)
|> Post.names_from_files |> Enum.map(&String.to_atom/1)
current_posts
|> Map.merge(Post.compile_posts(new_files, repository))
|> Map.drop(deleted_posts)
end
defp updated_posts_by_meta(current_posts, updates, repository) do
files = updates |> Enum.filter(fn (f) ->
String.starts_with?(f, Meta.folder) && String.ends_with?(f, ".yml")
end) |> Enum.map(fn (f) ->
f |> String.replace("meta/", "") |> String.replace_suffix("yml", "md")
end)
Map.merge(current_posts, Post.compile_posts(files, repository))
end
defp updated_blog_configuration(_, true), do: Configuration.from_file
defp updated_blog_configuration(current, false), do: current
end