Current section

Files

Jump to
git_ops lib mix tasks git_ops.project_info.ex
Raw

lib/mix/tasks/git_ops.project_info.ex

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, version number and valid message types.
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)
types = Config.type_keys()
project =
Config.mix_project().project()
|> Keyword.merge(types: types)
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, types} = extract_info_from_project(project)
IO.write("[app]\nname = #{name}\nversion = #{version}\ntypes = \"#{types}\"\n")
end
defp format_json(project, _opts) do
{name, version, types} = extract_info_from_project(project)
IO.write(~s|{"app":{"name":"#{name}","version":"#{version}","types":"#{types}"}}\n|)
end
defp format_github_actions(project, _opts) do
{name, version, types} = extract_info_from_project(project)
System.fetch_env!("GITHUB_OUTPUT")
|> File.write("app_name=#{name}\napp_version=#{version}\napp_types=\"#{types}\"\n", [:append])
end
defp format_shell(project, _opts) do
{name, version, types} = extract_info_from_project(project)
IO.write(
~s|export APP_NAME="#{name}"\nexport APP_VERSION="#{version}"\nexport APP_TYPES="#{types}"\n|
)
end
defp format_dotenv(project, _opts) do
{name, version, types} = extract_info_from_project(project)
IO.write(~s|APP_NAME="#{name}"\nAPP_VERSION="#{version}"\nAPP_TYPES="#{types}"\n|)
end
defp extract_info_from_project(project) do
%{app: name, version: version, types: types} =
project
|> Keyword.take(~w[app version types]a)
|> Enum.into(%{})
{name, version, types}
end
end