defmodule Mix.Tasks.Version.Inc do use Mix.Task use VersionTasks.FnExpr alias Mix.Tasks.Version @shortdoc "Increment to the next version of your project, provide major, minor or patch as input" def run(mode) do current = Version.Current.calc(mode) next = Version.Next.calc(mode) IO.puts "Updating mix.exs from #{current} to #{next}" update_file("mix.exs", current, next, &update_mix_version/3) update_file("README.md", current, next, &update_readme_version/3) next end defp update_file(filename, current, next, update_fn) do if File.exists?(filename) do IO.puts " -- Updating #{filename}" filename |> File.read |> invoke(fn ({:ok, content}) -> content end) |> String.split("\n") |> Enum.map(fn line -> update_fn.(line, current, next) end) |> Enum.join("\n") |> invoke(fn content -> File.write!(filename, content) end) else IO.puts " -- Skipping missing file #{filename}" end end defp update_mix_version(line, current, next) do line |> String.replace("@version \"#{current}\"", "@version \"#{next}\"") end defp update_readme_version(line, current, next) do line |> String.replace("~> #{current}", "~> #{next}") end end