Skip to content

Commit

Permalink
Make search of basedir smarter
Browse files Browse the repository at this point in the history
urbanserj committed Aug 7, 2017
1 parent 65fc05b commit f89130a
Showing 1 changed file with 56 additions and 23 deletions.
79 changes: 56 additions & 23 deletions src/syntaxerl_utils.erl
Original file line number Diff line number Diff line change
@@ -9,6 +9,14 @@

-include("issues_spec.hrl").

-define(REBAR3DEPSDIRS, [
"apps",
"lib",
"_checkouts",
"_build/default/lib",
"_build/test/lib"
]).

%% ===================================================================
%% API
%% ===================================================================
@@ -17,9 +25,9 @@
{InclDirs::[file:name()], EbinDirs::[file:name()], ErlcOpts::[term()]}.
incls_deps_opts(FileName) ->
AbsFileName = filename:absname(FileName),
BaseDir = filename:dirname(filename:dirname(AbsFileName)),

StdOtpDirs = absdirs(BaseDir, ["include", "deps"]),
AppDir = appdir(AbsFileName),
ProjectDir = projectdir(AppDir),
StdOtpDirs = include_dirs(AbsFileName, AppDir, ProjectDir),
StdErlcOpts = [
strong_validation,

@@ -39,23 +47,56 @@ incls_deps_opts(FileName) ->
return_errors,
return_warnings
],
%% keep in sync with Rebar3DepsDirs in rebar_deps_opts/1
Rebar3Dirs = [
"apps",
"lib",
"_checkouts",
"_build/default/lib",
"_build/test/lib"
],
DefaultDirs = StdOtpDirs ++ Rebar3Dirs,

Profile = which_compile_opts_profile(AbsFileName),
{DepsDirs, ErlcOpts} = deps_opts(BaseDir, DefaultDirs, StdErlcOpts, Profile),
{DepsDirs, ErlcOpts} = deps_opts(AppDir, StdOtpDirs, StdErlcOpts, Profile),

{_, EbinDirs} = lists:mapfoldr(fun(Dir, Acc) -> {0, filelib:wildcard(Dir ++ "/*/ebin") ++ Acc} end, [], DepsDirs),
IncDirs = lists:map(fun(Dir) -> {i, Dir} end, DepsDirs),
{IncDirs, EbinDirs, ErlcOpts}.

-spec appdir(AbsFileName::file:name()) -> file:name().
appdir(AbsFileName) ->
appdir(AbsFileName, filename:dirname(AbsFileName)).

-spec appdir(AbsFileName::file:name(), Default::file:name()) -> file:name().
appdir(AbsFileName, Default) ->
AbsFileDir = filename:dirname(AbsFileName),
case filename:basename(AbsFileDir) of
Dir when Dir =:= "src"; Dir =:= "test"; Dir =:= "include" ->
filename:dirname(AbsFileDir);
Dir when Dir =/= "" ->
appdir(AbsFileDir, Default);
_Dir ->
Default
end.

-spec projectdir(Dir::file:name()) -> file:name().
projectdir(Dir) ->
PDir = filename:dirname(Dir),
case filename:basename(PDir) of
"apps" ->
filename:dirname(PDir);
"deps" ->
filename:dirname(PDir);
"lib" ->
BuildDir = filename:dirname(filename:dirname(PDir)),
case filename:basename(BuildDir) of
"_build" -> filename:dirname(BuildDir);
_ -> Dir
end;
_Dir ->
Dir
end.

-spec include_dirs(AbsFileName, AppDir, ProjectDir) -> Dirs::[file:name()]
when AbsFileName::file:name(), AppDir::file:name(), ProjectDir::file:name().
include_dirs(AbsFileName, AppDir, ProjectDir) ->
SrcDir = filename:dirname(AbsFileName),
IncludeDir = filename:join(AppDir, "include"),
BuildDepsDir = filename:join(ProjectDir, "deps"),
DepsDirs = [ filename:join(ProjectDir, Dir) || Dir <- ?REBAR3DEPSDIRS ],
[SrcDir, IncludeDir, BuildDepsDir | DepsDirs].

-spec deps_opts(BaseDir::file:name(), OtpStdDirs::[file:name()], ErlcStdOpts::[term()], normal | test) -> {[file:name()], [term()]}.
deps_opts(BaseDir, OtpStdDirs, ErlcStdOpts, Profile) ->
{DepsDirs, ErlcOpts} =
@@ -153,17 +194,9 @@ rebar_deps_opts(BaseDir) ->

RebarLibDirs = proplists:get_value(lib_dirs, Terms, []),
RebarDepsDir = proplists:get_value(deps_dir, Terms, "deps"),
%% keep in sync with Rebar3Dirs in incls_deps_opts/1
Rebar3DepsDir = [
"apps",
"lib",
"_checkouts",
"_build/default/lib",
"_build/test/lib"
],
LocalDirs = RebarLibDirs
++ [RebarDepsDir]
++ Rebar3DepsDir
++ ?REBAR3DEPSDIRS
++ proplists:get_all_values(i, ErlcOpts),

%% try to find recursively configs in parents directories.

0 comments on commit f89130a

Please sign in to comment.