defmodule Mix.Tasks.GitOps.ProjectInfo do use Mix.Task @shortdoc "Return information about the project." @moduledoc """ A handy helper which prints out the app name and version number. May be useful in your CI system. mix git_ops.project_info ## Switches: * `--format|-f` selects the output format. Currently suported output formats are `json`, `toml`, `github-actions`, `shell` and `dotenv`. """ alias GitOps.Config @default_opts [format: "toml"] @doc false def run(args) do opts = @default_opts |> parse(args) project = Config.mix_project().project() opts |> Keyword.get(:format) |> String.downcase() |> case do "toml" -> format_toml(project, opts) "json" -> format_json(project, opts) "github-actions" -> format_github_actions(project, opts) "shell" -> format_shell(project, opts) "dotenv" -> format_dotenv(project, opts) format -> raise "Invalid format `#{inspect(format)}`. Valid formats are `json`, `toml`, `github-actions`, `shell` and `dotenv`." end end defp parse(defaults, args) do {opts, _} = args |> OptionParser.parse!(strict: [format: :string], aliases: [f: :format]) defaults |> Keyword.merge(opts) end defp format_toml(project, _opts) do {name, version} = extract_name_and_version_from_project(project) IO.write("[app]\nname = #{name}\nversion = #{version}\n") end defp format_json(project, _opts) do {name, version} = extract_name_and_version_from_project(project) IO.write(~s|{"app":{"name":"#{name}","version":"#{version}"}}\n|) end defp format_github_actions(project, _opts) do {name, version} = extract_name_and_version_from_project(project) IO.write("::set-output name=app_name::#{name}\n::set-output name=app_version::#{version}\n") end defp format_shell(project, _opts) do {name, version} = extract_name_and_version_from_project(project) IO.write(~s|export APP_NAME="#{name}"\nexport APP_VERSION="#{version}"\n|) end defp format_dotenv(project, _opts) do {name, version} = extract_name_and_version_from_project(project) IO.write(~s|APP_NAME="#{name}"\nAPP_VERSION="#{version}"\n|) end defp extract_name_and_version_from_project(project) do %{app: name, version: version} = project |> Keyword.take(~w[app version]a) |> Enum.into(%{}) {name, version} end end