defmodule Mix.Tasks.Guard do
@moduledoc ~S"""
ExGuard automates various tasks by running custom rules whenever file or directories are modified.
## Usage
usage: mix guard [--config=.exguard.exs]
help: mix help guard
## Installation
add `ex_guard` to `mix.exs`
def deps do
[{:ex_guard, "~> 1.6.1", only: :dev}]
end
## Sample config file
Create .exguard.exs in your root mix directory:
use ExGuard.Config
guard("unit-test")
|> command("mix test --color")
#config that match specific files:
|> watch({~r{lib/(?<dir>.+)/(?<file>.+).ex$}, fn(m) -> "test/#{m["dir"]}/#{m["file"]}_test.exs" end})
#if a file doesn't match with above pattern, this below pattern will be tested and applied
|> watch(~r{\\.(erl|ex|exs|eex|xrl|yrl)\\z}i)
|> ignore(~r/priv/)
Run `mix guard` and happy coding.
[Check out here for more fine-grained configs](https://hexdocs.pm/ex_guard/ExGuard.Guard.html).
## Notifications
Notify the result of execution through:
* [Terminal Title](http://tldp.org/HOWTO/Xterm-Title-3.html) (Xterm)
* [TMux](http://tmux.github.io/) (Universal)
* [Terminal Notifier](https://github.com/julienXX/terminal-notifier) (mac only)
* [Notify Send](http://ss64.com/bash/notify-send.html) (linux distros)
"""
alias ExGuard.Config
def run(args) do
case OptionParser.parse(args, switches: []) do
{[config: config_file], _, _} ->
execute(config_file)
{[], [], []} ->
execute(get_config_file())
_ ->
IO.puts("invalid option, try 'mix help guard'")
System.halt(1)
end
end
def execute(config_file) do
Config.start_link()
ExGuard.start_link()
Config.load(config_file)
Config.get_guards()
|> Enum.filter(fn g -> g.options[:run_on_start] end)
|> ExGuard.execute_guards()
IO.puts("ExGuard is watching your back ...")
:timer.sleep(:infinity)
end
defp get_config_file do
case File.exists?("ExGuardfile") do
true -> "ExGuardfile"
_ -> ".exguard.exs"
end
end
end