Packages

Git hooks made easy. Husky can prevent bad git commit, git push and more 🐶 ❤️ woof! - Elixir equivalent of the husky npm package

Current section

Files

Jump to
husky lib install.ex
Raw

lib/install.ex

defmodule Mix.Tasks.Husky.Install do
use Mix.Task
@app Mix.Project.config()[:app]
@version Mix.Project.config()[:version]
# escript location escript will execute the correct git hook
@script_path "deps/#{Mix.Project.config()[:app]}/#{Mix.Project.config()[:escript][:path]}"
def run(args) do
IO.puts("... running husky install")
Mix.Task.run("loadconfig", ["./deps/husky/config/config.exs"])
Mix.shell().info(Enum.join(args, " "))
Application.get_env(:husky, :hook_list)
|> install_project_hook_scripts(Application.get_env(:husky, :git_hooks_location))
#
# Mix.Task.run("escript.build") # first need to cd in to package, run mix deps.get
end
def install_project_hook_scripts(hook_list, install_directory) do
if not File.dir?(".git") do
raise RuntimeError, message: ".git directory does not exist. Try running $ git init"
end
if not File.dir?(install_directory) do
File.mkdir!(install_directory)
end
hook_list
|> Enum.map(fn f ->
path = Path.join(install_directory, f)
with {:ok, file} <- File.open(path, [:write]) do
IO.binwrite(file, hook_script_content(@app, @version, @script_path))
File.chmod(path, 0o755)
File.close(file)
end
end)
end
def hook_script_content(app_name, app_version, escript_path) do
"#!/usr/bin/env sh
# #{app_name}
# #{app_version} #{
:os.type()
|> Tuple.to_list()
|> Enum.map(&Atom.to_string/1)
|> Enum.map(fn s -> s <> " " end)
}
SCRIPT_PATH=#{escript_path}
HOOK_NAME=`basename \"$0\"`
GIT_PARAMS=\"$*\"
if [ \"${HUSKY_DEBUG}\" = \"true\" ]; then
echo \"husky:debug $HOOK_NAME hook started...\"
fi
if [ -f $SCRIPT_PATH ]; then
$SCRIPT_PATH $HOOK_NAME \"$GIT_PARAMS\"
else
echo \"Can't find Husky, skipping $HOOK_NAME hook\"
echo \"You can reinstall husky or this hook\"
fi
"
end
end