Packages
elvis_core
5.0.4
5.0.4
5.0.3
5.0.2
5.0.1
5.0.0
retired
4.2.3
4.2.2
4.2.1
4.2.0
4.1.1
4.1.0
4.0.0
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.0.1
3.0.0
2.0.1
2.0.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.2
1.1.1
1.1.0
1.0.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
Core library for the Erlang style reviewer
Current section
Files
Jump to
Current section
Files
src/elvis_gitignore.erl
-module(elvis_gitignore).
-behaviour(elvis_rule).
-export([default/1]).
-export([required_patterns/2, forbidden_patterns/2]).
% The whole file is considered to have either callback functions or rules.
-ignore_xref(elvis_gitignore).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Default values
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec default(RuleName :: atom()) -> elvis_rule:def().
default(required_patterns) ->
elvis_rule:defmap(#{
regexes =>
[
"^.rebar3/$",
"^_build/$",
"^_checkouts/$",
"^doc/$",
"^/erl_crash.dump$",
"^/rebar3.crashdump$",
"^test/logs/$"
]
});
default(forbidden_patterns) ->
elvis_rule:defmap(#{
regexes => ["^rebar.lock$"]
});
default(_RuleName) ->
elvis_rule:defmap(#{}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Rules
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec required_patterns(elvis_rule:t(), elvis_config:t()) -> [elvis_result:item()].
required_patterns(Rule, _ElvisConfig) ->
Path = elvis_file:path(elvis_rule:file(Rule)),
Regexes = elvis_rule:option(regexes, Rule),
case file:read_file(Path) of
{ok, PatternsBin} ->
Patterns = elvis_utils:split_all_lines(PatternsBin),
check_patterns_in_lines(Patterns, Regexes, [], required);
{error, _} ->
[]
end.
-spec forbidden_patterns(elvis_rule:t(), elvis_config:t()) -> [elvis_result:item()].
forbidden_patterns(Rule, _ElvisConfig) ->
Path = elvis_file:path(elvis_rule:file(Rule)),
Regexes = elvis_rule:option(regexes, Rule),
case file:read_file(Path) of
{ok, PatternsBin} ->
Patterns = elvis_utils:split_all_lines(PatternsBin),
check_patterns_in_lines(Patterns, Regexes, [], forbidden);
{error, _} ->
[]
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Private
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% .gitignore
check_patterns_in_lines(_Lines, [], Results, _Mode) ->
Results;
check_patterns_in_lines(Lines, [Pattern | Rest], Results0, Mode) ->
ModeRespected =
case Mode of
required ->
lists:any(fun(Line) -> re:run(Line, Pattern) =/= nomatch end, Lines);
forbidden ->
lists:all(fun(Line) -> re:run(Line, Pattern) =:= nomatch end, Lines)
end,
Results =
case ModeRespected of
true ->
Results0;
false when Mode =:= required ->
[
elvis_result:new_item(
"Your .gitignore file should contain pattern '~s'",
[Pattern]
)
| Results0
];
false when Mode =:= forbidden ->
[
elvis_result:new_item(
"Your .gitignore file should not contain pattern '~s'",
[Pattern]
)
| Results0
]
end,
check_patterns_in_lines(Lines, Rest, Results, Mode).