Convert the entries in the code path to absolute paths

Rebar will exit with {error,bad_directory} when trying to restore the code
path after it has finished working on a subdirectory if there are invalid
relative paths in it. The problem was seen when executing the last line of
rebar_erlc_compiler:doterl_compile/3 (true = code:set_path(CurrPath)).
This commit is contained in:
Juan Jose Comellas 2011-02-22 01:58:46 -03:00 committed by Tuncer Ayaz
parent 90d2ce5e07
commit 58661a92e2
2 changed files with 14 additions and 1 deletions

View file

@ -76,6 +76,10 @@ process_commands([Command | Rest]) ->
lists:foreach(fun (D) -> erlang:erase({skip_dir, D}) end, skip_dirs()),
Operations = erlang:get(operations),
%% Convert the code path so that all the entries are absolute paths.
%% If not, code:set_path() may choke on invalid relative paths when trying
%% to restore the code path from inside a subdirectory.
true = rebar_utils:expand_code_path(),
_ = process_dir(rebar_utils:get_cwd(), rebar_config:new(),
Command, sets:new()),
case erlang:get(operations) of

View file

@ -38,7 +38,8 @@
abort/2,
escript_foldl/3,
find_executable/1,
prop_check/3]).
prop_check/3,
expand_code_path/0]).
-include("rebar.hrl").
@ -156,6 +157,14 @@ find_executable(Name) ->
prop_check(true, _, _) -> true;
prop_check(false, Msg, Args) -> ?ABORT(Msg, Args).
%% Convert all the entries in the code path to absolute paths.
expand_code_path() ->
CodePath = lists:foldl(fun (Path, Acc) ->
[filename:absname(Path) | Acc]
end, [], code:get_path()),
code:set_path(lists:reverse(CodePath)).
%% ====================================================================
%% Internal functions
%% ====================================================================