Packages
deli
0.1.9
0.2.0-rc.6
0.2.0-rc.5
0.2.0-rc.4
0.2.0-rc.3
0.2.0-rc.2
0.2.0-rc.1
0.1.28
0.1.27
0.1.26
0.1.25
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
Easy deployment for Elixir apps
Current section
Files
Jump to
Current section
Files
lib/deli/versioning.ex
defmodule Deli.Versioning do
import Deli.Shell
@moduledoc "Provides version git tag enforcing"
def fetch_version_tag(options) when is_list(options) do
options
|> Keyword.get(:version)
|> fetch_version_tag
end
def fetch_version_tag(nil) do
version = Mix.Project.get().project[:version] |> Version.parse!()
tag = git_tags() |> List.last()
action = if tag, do: {:compare, version, tag}, else: {:create, version}
action |> fetch_version_tag
end
def fetch_version_tag("v" <> version), do: version |> fetch_version_tag
def fetch_version_tag(version) when is_binary(version) do
sanitized_version = version |> Version.parse!() |> to_string
"v#{sanitized_version}"
end
def fetch_version_tag({:compare, version, tag}) do
case version |> Version.compare(tag) do
:lt ->
error!("Remove tag #{tag}, or adapt Mixfile version")
:gt ->
{:create, version} |> fetch_version_tag
:eq ->
current_sha = "HEAD" |> git_sha
tag_sha = "v#{tag}" |> git_sha
if current_sha == tag_sha do
"v#{tag}"
else
error!("""
Mix version equals latest tag, but they have different revisions.
Bump version in `mix.exs` before continue.
""")
end
end
end
def fetch_version_tag({:create, version}) do
version |> create_version_tag
end
defp create_version_tag(version) do
tag = "v#{version}"
cmd("git tag #{tag}")
cmd("git push origin #{tag}")
tag
end
defp git_sha(sha_selector) do
"git rev-list -n 1 #{sha_selector}" |> cmd_result
end
defp git_tags do
cmd("git fetch --tags")
"git tag -l --sort version:refname"
|> cmd_result
|> String.split("\n")
|> Enum.filter(&(&1 != ""))
|> Enum.map(fn "v" <> n -> n |> Version.parse!() end)
end
end