diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar.erl | 27 | ||||
-rw-r--r-- | src/rebar_config.erl | 4 | ||||
-rw-r--r-- | src/rebar_core.erl | 30 | ||||
-rw-r--r-- | src/rebar_metacmds.erl | 56 | ||||
-rw-r--r-- | src/rebar_templater.erl | 3 |
5 files changed, 106 insertions, 14 deletions
diff --git a/src/rebar.erl b/src/rebar.erl index 36a7b36..618cce8 100644 --- a/src/rebar.erl +++ b/src/rebar.erl @@ -206,8 +206,10 @@ help() -> " ~p~n" " ~p~n" " ~p~n" + " ~p~n" " ~p~n", [ + {recursive_cmds, []}, {lib_dirs, []}, {sub_dirs, ["dir1", "dir2"]}, {plugins, [plugin1, plugin2]}, @@ -254,19 +256,23 @@ save_options(Config, {Options, NonOptArgs}) -> Config3 = rebar_config:set_xconf(Config2, keep_going, proplists:get_bool(keep_going, Options)), + %% Setup flag to enable recursive application of commands + Config4 = rebar_config:set_xconf(Config3, recursive, + proplists:get_bool(recursive, Options)), + %% Set global variables based on getopt options - Config4 = set_global_flag(Config3, Options, force), - Config5 = case proplists:get_value(jobs, Options, ?DEFAULT_JOBS) of + Config5 = set_global_flag(Config4, Options, force), + Config6 = case proplists:get_value(jobs, Options, ?DEFAULT_JOBS) of ?DEFAULT_JOBS -> - Config4; + Config5; Jobs -> - rebar_config:set_global(Config4, jobs, Jobs) + rebar_config:set_global(Config5, jobs, Jobs) end, %% Filter all the flags (i.e. strings of form key=value) from the %% command line arguments. What's left will be the commands to run. - {Config6, RawCmds} = filter_flags(Config5, NonOptArgs, []), - {Config6, unabbreviate_command_names(RawCmds)}. + {Config7, RawCmds} = filter_flags(Config6, NonOptArgs, []), + {Config7, unabbreviate_command_names(RawCmds)}. %% %% set log level based on getopt option @@ -358,6 +364,9 @@ list-templates List available templates doc Generate Erlang program documentation +prepare-deps Run 'rebar -r get-deps compile' +refresh-deps Run 'rebar -r update-deps compile' + check-deps Display to be fetched dependencies get-deps Fetch dependencies update-deps Update fetched dependencies @@ -420,7 +429,9 @@ option_spec_list() -> {config, $C, "config", string, "Rebar config file to use"}, {profile, $p, "profile", undefined, "Profile this run of rebar"}, {keep_going, $k, "keep-going", undefined, - "Keep running after a command fails"} + "Keep running after a command fails"}, + {recursive, $r, "recursive", boolean, + "Apply commands to subdirs and dependencies"} ]. %% @@ -469,7 +480,9 @@ command_names() -> "help", "list-deps", "list-templates", + "prepare-deps", "qc", + "refresh-deps", "update-deps", "overlay", "shell", diff --git a/src/rebar_config.erl b/src/rebar_config.erl index 9b58d4f..10c6483 100644 --- a/src/rebar_config.erl +++ b/src/rebar_config.erl @@ -31,6 +31,7 @@ get_all/2, set/3, set_global/3, get_global/3, + is_recursive/1, save_env/3, get_env/2, reset_envs/1, set_skip_dir/2, is_skip_dir/2, reset_skip_dirs/1, clean_config/2, @@ -109,6 +110,9 @@ get_global(Config, Key, Default) -> Value end. +is_recursive(Config) -> + get_xconf(Config, recursive, false). + consult_file(File) -> case filename:extension(File) of ".script" -> diff --git a/src/rebar_core.erl b/src/rebar_core.erl index 4efc978..81b9a6d 100644 --- a/src/rebar_core.erl +++ b/src/rebar_core.erl @@ -122,26 +122,44 @@ process_dir(Dir, ParentConfig, Command, DirSet) -> false -> ?WARN("Skipping non-existent sub-dir: ~p\n", [Dir]), {ParentConfig, DirSet}; + true -> + maybe_process_dir(Dir, ParentConfig, Command, DirSet) + end. +maybe_process_dir(Dir, ParentConfig, Command, DirSet) -> + case should_cd_into_dir(Dir, ParentConfig, Command) of true -> ok = file:set_cwd(Dir), Config = maybe_load_local_config(Dir, ParentConfig), %% Save the current code path and then update it with - %% lib_dirs. Children inherit parents code path, but we - %% also want to ensure that we restore everything to pristine + %% lib_dirs. Children inherit parents code path, but we also + %% want to ensure that we restore everything to pristine %% condition after processing this child CurrentCodePath = update_code_path(Config), - %% Get the list of processing modules and check each one against - %% CWD to see if it's a fit -- if it is, use that set of modules - %% to process this dir. + %% Get the list of processing modules and check each one + %% against CWD to see if it's a fit -- if it is, use that + %% set of modules to process this dir. {ok, AvailModuleSets} = application:get_env(rebar, modules), ModuleSet = choose_module_set(AvailModuleSets, Dir), skip_or_process_dir(ModuleSet, Config, CurrentCodePath, - Dir, Command, DirSet) + Dir, Command, DirSet); + false -> + {ParentConfig, DirSet} end. +should_cd_into_dir(Dir, Config, Command) -> + rebar_utils:processing_base_dir(Config, Dir) orelse + rebar_config:is_recursive(Config) orelse + is_recursive_command(Config, Command). + +is_recursive_command(Config, Command) -> + {ok, AppCmds} = application:get_env(rebar, recursive_cmds), + ConfCmds = rebar_config:get_local(Config, recursive_cmds, []), + RecursiveCmds = AppCmds ++ ConfCmds, + lists:member(Command, RecursiveCmds). + skip_or_process_dir({[], undefined}=ModuleSet, Config, CurrentCodePath, Dir, Command, DirSet) -> process_dir1(Dir, Command, DirSet, Config, CurrentCodePath, ModuleSet); diff --git a/src/rebar_metacmds.erl b/src/rebar_metacmds.erl new file mode 100644 index 0000000..6e223bd --- /dev/null +++ b/src/rebar_metacmds.erl @@ -0,0 +1,56 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +%% ------------------------------------------------------------------- +%% +%% rebar: Erlang Build Tools +%% +%% Copyright (c) 2013-2014 Tuncer Ayaz +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% ------------------------------------------------------------------- +-module(rebar_metacmds). + +-export(['prepare-deps'/2, + 'refresh-deps'/2]). + +%% for internal use only +-export([info/2]). + +-include("rebar.hrl"). + +%% =================================================================== +%% Public API +%% =================================================================== +'prepare-deps'(Config, _AppFile) -> + rebar:run(enable_recursion(Config), ["get-deps", "compile"]). + +'refresh-deps'(Config, _AppFile) -> + rebar:run(enable_recursion(Config), ["update-deps", "compile"]). + +%% =================================================================== +%% Internal functions +%% =================================================================== + +info(help, 'prepare-deps') -> + ?CONSOLE("Meta command to run 'rebar -r get-deps compile'.~n", []); +info(help, 'refresh-deps') -> + ?CONSOLE("Meta command to run 'rebar -r update-deps compile'.~n", []). + +enable_recursion(Config) -> + rebar_config:set_xconf(Config, recursive, true). diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl index 43bb8da..fef4627 100644 --- a/src/rebar_templater.erl +++ b/src/rebar_templater.erl @@ -245,7 +245,8 @@ find_disk_templates(Config) -> HomeFiles = rebar_utils:find_files(filename:join([os:getenv("HOME"), ".rebar", "templates"]), ?TEMPLATE_RE), - LocalFiles = rebar_utils:find_files(".", ?TEMPLATE_RE), + Recursive = rebar_config:is_recursive(Config), + LocalFiles = rebar_utils:find_files(".", ?TEMPLATE_RE, Recursive), [{file, F} || F <- OtherTemplates ++ HomeFiles ++ LocalFiles]. find_other_templates(Config) -> |