Skip to content

Instantly share code, notes, and snippets.

@rwoeber
Forked from jeffweiss/mix.exs
Created January 16, 2016 15:56
Show Gist options
  • Save rwoeber/e0ace9cb7214941edfe8 to your computer and use it in GitHub Desktop.
Save rwoeber/e0ace9cb7214941edfe8 to your computer and use it in GitHub Desktop.
Retrieving application version number in mix.exs from git describe
defmodule MyApp.Mixfile do
use Mix.Project
def project do
[app: :my_app,
version: get_version,
elixir: "~> 1.0",
elixirc_paths: elixirc_paths(Mix.env),
compilers: Mix.compilers,
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
# Configuration for the OTP application
#
# Type `mix help compile.app` for more information
def application do
[mod: {MyApp, []},
applications: [:logger]]
end
defp get_version do
version_from_file
|> handle_file_version
|> String.split("-")
|> case do
[tag] -> tag
[tag, _num_commits, commit] -> "#{tag}-#{commit}"
end
end
defp version_from_file(file \\ "VERSION") do
File.read(file)
end
defp handle_file_version({:ok, content}) do
content
end
defp handle_file_version({:error, _}) do
retrieve_version_from_git
end
defp retrieve_version_from_git do
require Logger
Logger.warn "Calling out to `git describe` for the version number. This is slow! You should think about a hook to set the VERSION file"
System.cmd("git", ["describe", "--always", "--tags"])
|> Tuple.to_list
|> List.first
|> String.strip
end
# Specifies which paths to compile per environment
defp elixirc_paths(:test), do: ["lib", "web", "test/support"]
defp elixirc_paths(_), do: ["lib", "web"]
# Specifies your project dependencies
#
# Type `mix help deps` for examples and options
defp deps do
[
]
end
end
#!/bin/bash
# installed to .git/hooks/post-checkout
`git describe --always --tags > VERSION`
#!/bin/bash
# installed to .git/hooks/post-commit
`git describe --always --tags > VERSION`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment