Packages

fnord

0.8.13

AI code archaeology

Current section

Files

Jump to
fnord lib store.ex
Raw

lib/store.ex

defmodule Store do
require Logger
@projects_dir "projects"
@spec store_home() :: binary
def store_home() do
move_projects_into_discrete_folder()
home = Settings.home()
File.mkdir_p!(home)
home
end
# -----------------------------------------------------------------------------
# Projects
# -----------------------------------------------------------------------------
@doc """
Returns an ok tuple with a `Store.Project.t`, identified either by name or by
simply passing through a `Store.Project.t` instance. If passed nil, it
attempts to use the currently selected project (specified with `--project` or
via cwd).
"""
@spec get_project(nil | binary | Store.Project.t()) ::
{:ok, Store.Project.t()}
| {:error, :project_not_found}
| {:error, :project_not_set}
def get_project(nil), do: get_project()
def get_project(%Store.Project{} = project), do: {:ok, project}
def get_project(project) when is_binary(project) do
home = store_home()
store_path = Path.join([home, @projects_dir, project])
{:ok, Store.Project.new(project, store_path)}
end
@doc """
Retrieves the currently selected project (specified with `--project` or via
cwd) as a `Store.Project.t`. If unset, returns `{:error, :project_not_set}`.
"""
@spec get_project() ::
{:ok, Store.Project.t()}
| {:error, :project_not_found}
| {:error, :project_not_set}
def get_project() do
with {:ok, name} <- Settings.get_selected_project() do
get_project(name)
end
end
# -----------------------------------------------------------------------------
# Clean ups for legacy data
# -----------------------------------------------------------------------------
defp move_projects_into_discrete_folder() do
home = Settings.home()
new_projects_dir = Path.join(home, "projects")
if !File.exists?(new_projects_dir) do
Logger.info("Migrating projects to #{new_projects_dir}")
File.mkdir_p!(new_projects_dir)
Settings.new()
|> Settings.list_projects()
|> Enum.each(fn project_name ->
old_path = Path.join(store_home(), project_name)
new_path = Path.join(new_projects_dir, project_name)
cond do
File.exists?(old_path) and File.exists?(new_path) ->
Logger.info("#{project_name} migrated to #{new_path}; cleaning up artifacts")
File.rm_rf!(new_path)
File.exists?(old_path) ->
File.rename(old_path, new_path)
Logger.info("#{project_name} migrated to #{new_path}")
end
end)
end
end
end