defmodule Mix.Tasks.Fennec.Fetch do @shortdoc "Fetch precompiled NIFs and build the checksums" @moduledoc """ A task responsible for downloading the precompiled NIFs for a given module. This task must only be used by package creators who want to ship the precompiled NIFs. The goal is to download the precompiled packages and generate a checksum to check-in alongside the project in the the Hex repository. This is done by passing the `--all` flag. You can also use the `--only-local` flag to download only the precompiled package for use during development. You can use the `--ignore-unavailable` flag to ignore any NIFs that are not available. This is useful when you are developing a new NIF that does not support all platforms. This task also accept the `--print` flag to print the checksums. """ use Mix.Task @switches [ all: :boolean, only_local: :boolean, print: :boolean, ignore_unavailable: :boolean ] @impl true def run([]) do raise "the module name and a flag is expected. Use \"--all\" or \"--only-local\" flags" end @impl true def run(flags) when is_list(flags) do app = get_app_name() {options, _args, _invalid} = OptionParser.parse(flags, strict: @switches) urls = cond do Keyword.get(options, :all) -> FennecPrecompile.available_nif_urls(app) Keyword.get(options, :only_local) -> [FennecPrecompile.current_target_nif_url(app)] true -> raise "you need to specify either \"--all\" or \"--only-local\" flags" end result = FennecPrecompile.download_nif_artifacts_with_checksums!(urls, options) if Keyword.get(options, :print) do result |> Enum.map(fn map -> {Path.basename(Map.fetch!(map, :path)), Map.fetch!(map, :checksum)} end) |> Enum.sort() |> Enum.map_join("\n", fn {file, checksum} -> "#{checksum} #{file}" end) |> IO.puts() end FennecPrecompile.write_checksum!(app, result) end defp get_app_name() do System.get_env("FENNEC_PRECOMPILE_OTP_APP", "#{Mix.Project.config()[:app]}") |> String.to_atom() end end