defmodule Mix.Tasks.Kvasir.Dev do use Mix.Task @impl Mix.Task def run(args) def run([command | args]) do case command do "add" -> if add(args) == :ok, do: recompile() "update" -> if update(args), do: recompile() _ -> # warn: commaand help() end end def run(_), do: help() defp recompile do # File.rm_rf(Application.app_dir(:kvasir_dev)) # alias Mix.Tasks.Deps.{Compile, Get} # Get.run([]) # Compile.run([]) :ok end defp add([component | opts]) do :application.ensure_all_started(:hackney) Kvasir.Dev.Downloader.clear(component) with :ok <- Kvasir.Dev.Downloader.component(component, List.first(opts)) do c = Kvasir.Dev.Downloader.commit(component) f = Kvasir.Dev.lock() lock = File.read!(f) data = lock |> String.split("\n", trim: true) |> Enum.map(&String.trim/1) |> Enum.reject(&(&1 == "")) |> Enum.reject(&String.starts_with?(&1, "#{component}:")) |> Kernel.++(["#{component}:#{c}"]) |> Enum.sort() File.write(f, Enum.join(data, "\n") <> "\n") :ok end end defp update(["all" | _]) do Kvasir.Dev.lock() |> File.read!() |> String.split("\n", trim: true) |> Enum.map(&String.trim/1) |> Enum.reject(&(&1 == "")) |> Enum.map(&List.first(String.split(&1, ":"))) |> Enum.map(&add([&1, "release/v1.0"])) |> Enum.any?(&(&1 == :ok)) end defp update([component | _]), do: add([component, "release/v1.0"]) == :ok defp help do :ok end end