defmodule Mix.Tasks.Exwrapper.Publish do use Mix.Task defp diff(rawrep) do tab = rawrep |> String.trim |> String.split |> Enum.reject(fn x -> case Float.parse(x) do :error -> true _other -> false end end) |> Enum.map(&String.to_integer/1) case tab do [files, inserts, sups] -> round((inserts - sups) / files) + 5 [files, inserts] -> round(inserts / files) + 5 _ -> :rand.uniform(50) end end defp new_correctfif(arg) do {rawrep, 0} = System.cmd("git", ["diff", "--shortstat"]) String.to_integer(arg) + diff(rawrep) end @spec update_version :: :ok | {:error, String.t} defp update_version do case Mix.Shell.IO.prompt("Okay, the version updtable option is 'maj', 'min' or 'bug', what is your case ? ") |> String.trim do "maj" -> update_version("maj") "min" -> update_version("min") "bug" -> update_version("bug") _ -> update_version() end end @spec update_version(arg :: String.t) :: :ok | {:error, String.t} defp update_version(arg) do Mix.Shell.IO.info(arg) case File.read("VERSION") do {:ok, version} -> [majeur, mineur, correctif] = version |> String.trim |> String.split(".") new_version = case arg do "maj" -> [(majeur |> String.to_integer |> Kernel.+(1) |> Integer.to_string), 0, 0] "min" -> value = String.to_integer(mineur) + 1 case value < 255 do true -> [majeur, Integer.to_string(value), 0] false -> [majeur |> String.to_integer |> Kernel.+(1) |> Integer.to_string, 0, 0] end "bug" -> case new_correctfif(correctif) >= 255 do true -> [majeur, (mineur |> String.to_integer |> Kernel.+(1) |> Integer.to_string), 0] false -> [majeur, mineur, new_correctfif(correctif)] end _other -> Mix.raise("argument must be 'min', 'maj', or 'bug'") end File.write("VERSION", Enum.join(new_version, ".")) {:error, _reason} -> Mix.raise("File VERSION not exists !!") end end defp update_message do message = Mix.Shell.IO.prompt("What is your commit message: ") |> String.trim Mix.Shell.IO.info("The message for commit in git is '#{message}'.") case Mix.Shell.IO.yes?("Are you okay with that ? ") do true -> File.write(".message", message) false -> update_message() end end defp new_readme do {:ok, raw} = File.read("README.md") {:ok, version} = File.read("VERSION") project_name = Mix.Project.config[:app] |> Atom.to_string n_raw = String.replace(raw, ~r/(\[\{\:#{project_name}\, \"\~\> .*\"\}\])/, "[{:#{project_name}, \"~> #{version |> String.trim}\"}]") File.write("README.md", n_raw) end defp exec do Mix.Task.get!(Clean).run([]) Mix.Task.get!(Compile).run([]) new_readme() {_osef, 0} = System.cmd("git", ["add", "--all"]) {_osef, 0} = System.cmd("git", ["commit", "-m", "#{{:ok, m} = File.read(".message"); m}"]) {_osef, 0} = System.cmd("git", ["push"]) end def run([arg, message]) do update_version(arg) {:ok, version} = File.read("VERSION") :ok = File.write(".message", message) Mix.Shell.IO.info("The new version of project is #{version}") case Mix.Shell.IO.yes?("Are you okay with that ?") do false -> update_version() run([arg, message]) true -> Mix.Shell.IO.info("The message for commit in git is '#{message}'.") case Mix.Shell.IO.yes?("Are you okay with that ?") do false -> update_message() exec() true -> exec() end end end end