diff options
| author | Jared Morrow <jared@basho.com> | 2014-03-11 21:26:15 +0000 | 
|---|---|---|
| committer | Jared Morrow <jared@basho.com> | 2014-03-11 21:26:15 +0000 | 
| commit | 47c089aa806653d826b8bc5f4b8dc29724af1da7 (patch) | |
| tree | e8de872fa1f72bad757e1f02a7fee23e136d481a /src | |
| parent | fa1a2b53fd66ae833586729a2122a31ac1f29b0b (diff) | |
| parent | 415d872730daf58a91b6fbd6d3eac1f015cb9c24 (diff) | |
Merge branch 'tuncer-auto-recursion'
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) -> | 
