|
|
@ -28,12 +28,9 @@ |
|
|
|
|
|
|
|
-include_lib("rebar/include/rebar.hrl"). |
|
|
|
|
|
|
|
main([CommandStr | _Args]) -> |
|
|
|
main(Commands) -> |
|
|
|
%% Pre-load the rebar app so that we get default configuration |
|
|
|
application:load(rebar), |
|
|
|
|
|
|
|
%% Convert the command into an atom for convenience |
|
|
|
Command = list_to_atom(CommandStr), |
|
|
|
|
|
|
|
%% From the current working directory, search recursively and find |
|
|
|
%% all the application and release directories. We always terminate the |
|
|
@ -46,18 +43,14 @@ main([CommandStr | _Args]) -> |
|
|
|
Targets = [{Type, Cwd, Filename}] |
|
|
|
end, |
|
|
|
|
|
|
|
%% Filter out all the targets, based on the specified command. |
|
|
|
FilteredTargets = [{Type, Dir, Filename} || {Type, Dir, Filename} <- Targets, |
|
|
|
valid_command(Command, Type) == true], |
|
|
|
|
|
|
|
%% Prefix all the app targets to the code path so that inter-app compilation |
|
|
|
%% works properly |
|
|
|
update_code_path(FilteredTargets), |
|
|
|
update_code_path(Targets), |
|
|
|
|
|
|
|
%% Finally, apply the specified command to each target |
|
|
|
apply_command(FilteredTargets, Command); |
|
|
|
apply_commands(Targets, Commands); |
|
|
|
main(_) -> |
|
|
|
io:format("usage: rebar <command>\n"). |
|
|
|
io:format("usage: rebar <command>...\n"). |
|
|
|
|
|
|
|
|
|
|
|
%% |
|
|
@ -65,25 +58,27 @@ main(_) -> |
|
|
|
%% |
|
|
|
find_targets(Root) -> |
|
|
|
{ok, Files} = file:list_dir(Root), |
|
|
|
find_targets(Files, Root, []). |
|
|
|
find_targets(Files, Root, [], 1). |
|
|
|
|
|
|
|
find_targets([], _Root, Acc) -> |
|
|
|
find_targets([], _Root, Acc, _Depth) -> |
|
|
|
Acc; |
|
|
|
find_targets(_Files, _Root, Acc, 10) -> |
|
|
|
Acc; |
|
|
|
find_targets([F | Rest], Root, Acc) -> |
|
|
|
find_targets([F | Rest], Root, Acc, Depth) -> |
|
|
|
AbsName = filename:join([Root, F]), |
|
|
|
case target_type(AbsName) of |
|
|
|
undefined -> |
|
|
|
case filelib:is_dir(AbsName) of |
|
|
|
true -> |
|
|
|
{ok, SubFiles} = file:list_dir(AbsName), |
|
|
|
Acc2 = find_targets(SubFiles, AbsName, Acc); |
|
|
|
Acc2 = find_targets(SubFiles, AbsName, Acc, Depth+1); |
|
|
|
false -> |
|
|
|
Acc2 = Acc |
|
|
|
end; |
|
|
|
{Type, Filename} -> |
|
|
|
Acc2 = [{Type, AbsName, Filename} | Acc] |
|
|
|
end, |
|
|
|
find_targets(Rest, Root, Acc2). |
|
|
|
find_targets(Rest, Root, Acc2, Depth). |
|
|
|
|
|
|
|
%% |
|
|
|
%% Determine the target type of a given file: app, rel or undefined |
|
|
@ -123,12 +118,31 @@ update_code_path([_ | Rest]) -> |
|
|
|
update_code_path(Rest). |
|
|
|
|
|
|
|
|
|
|
|
apply_commands(_Targets, []) -> |
|
|
|
ok; |
|
|
|
apply_commands(Targets, [CommandStr | Rest]) -> |
|
|
|
%% Convert the command into an atom for convenience |
|
|
|
Command = list_to_atom(CommandStr), |
|
|
|
|
|
|
|
%% Filter out all the targets, based on the specified command. |
|
|
|
FilteredTargets = [{Type, Dir, Filename} || {Type, Dir, Filename} <- Targets, |
|
|
|
valid_command(Command, Type) == true], |
|
|
|
case apply_command(FilteredTargets, Command) of |
|
|
|
ok -> |
|
|
|
apply_commands(Targets, Rest); |
|
|
|
Other -> |
|
|
|
Other |
|
|
|
end. |
|
|
|
|
|
|
|
apply_command([], _Command) -> |
|
|
|
ok; |
|
|
|
apply_command([{Type, Dir, File} | Rest], Command) -> |
|
|
|
ok = file:set_cwd(Dir), |
|
|
|
Config = rebar_config:new(Dir), |
|
|
|
|
|
|
|
%% Provide some info on where we are |
|
|
|
?CONSOLE("==> ~s (~s)\n", [filename:basename(Dir), Command]), |
|
|
|
|
|
|
|
%% Pull the list of modules that are associated with Type operations. Each module |
|
|
|
%% will be inspected for a function matching Command and if found, will execute that. |
|
|
|
Modules = rebar_config:get_modules(Config, Type), |
|
|
|