diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_core.erl | 96 |
1 files changed, 53 insertions, 43 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl index 55c8271..3a4f205 100644 --- a/src/rebar_core.erl +++ b/src/rebar_core.erl @@ -123,12 +123,7 @@ process_dir(Dir, Command, ParentConfig, DirSet) -> ?WARN("Skipping non-existent sub-dir: ~p\n", [Dir]), {ParentConfig, DirSet}; true -> - maybe_process_dir(Dir, Command, ParentConfig, DirSet) - end. - -maybe_process_dir(Dir, Command, ParentConfig, DirSet) -> - case should_cd_into_dir(Dir, Command, ParentConfig) of - true -> + WouldCd = would_cd_into_dir(Dir, Command, ParentConfig), ok = file:set_cwd(Dir), Config = maybe_load_local_config(Dir, ParentConfig), @@ -144,12 +139,18 @@ maybe_process_dir(Dir, Command, ParentConfig, DirSet) -> {ok, AvailModuleSets} = application:get_env(rebar, modules), ModuleSet = choose_module_set(AvailModuleSets, Dir), skip_or_process_dir(Dir, Command, Config, DirSet, CurrentCodePath, - ModuleSet); + ModuleSet, WouldCd) + end. + +would_cd_into_dir(Dir, Command, Config) -> + case would_cd_into_dir1(Dir, Command, Config) of + true -> + would_cd; false -> - {ParentConfig, DirSet} + would_not_cd end. -should_cd_into_dir(Dir, Command, Config) -> +would_cd_into_dir1(Dir, Command, Config) -> rebar_utils:processing_base_dir(Config, Dir) orelse rebar_config:is_recursive(Config) orelse is_recursive_command(Command, Config) orelse @@ -181,24 +182,25 @@ is_generate_in_rel_dir(_, _) -> false. skip_or_process_dir(Dir, Command, Config, DirSet, CurrentCodePath, - {[], undefined}=ModuleSet) -> - process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, ModuleSet); + {[], undefined}=ModuleSet, WouldCd) -> + process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, ModuleSet, + WouldCd); skip_or_process_dir(Dir, Command, Config, DirSet, CurrentCodePath, - {_, File}=ModuleSet) -> + {_, File}=ModuleSet, WouldCd) -> case lists:suffix(".app.src", File) orelse lists:suffix(".app", File) of true -> %% .app or .app.src file, check if is_skipped_app skip_or_process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, - ModuleSet, File); + ModuleSet, WouldCd, File); false -> %% not an app dir, no need to consider apps=/skip_apps= process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, - ModuleSet) + ModuleSet, WouldCd) end. skip_or_process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, ModuleSet, - AppFile) -> + WouldCd, AppFile) -> case rebar_app_utils:is_skipped_app(Config, AppFile) of {Config1, {true, _SkippedApp}} when Command == 'update-deps' -> %% update-deps does its own app skipping. Unfortunately there's no @@ -206,18 +208,19 @@ skip_or_process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, ModuleSet, %% here... Otherwise if you use app=, it'll skip the toplevel %% directory and nothing will be updated. process_dir1(Dir, Command, Config1, DirSet, CurrentCodePath, - ModuleSet); + ModuleSet, WouldCd); {Config1, {true, SkippedApp}} -> ?DEBUG("Skipping app: ~p~n", [SkippedApp]), {increment_operations(Config1), DirSet}; {Config1, false} -> process_dir1(Dir, Command, Config1, DirSet, CurrentCodePath, - ModuleSet) + ModuleSet, WouldCd) end. process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, - {DirModules, File}) -> + {DirModules, File}, WouldCd) -> Config0 = rebar_config:set_xconf(Config, current_command, Command), + %% Get the list of modules for "any dir". This is a catch-all list %% of modules that are processed in addition to modules associated %% with this directory type. These any_dir modules are processed @@ -251,38 +254,18 @@ process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, %% caused it to change ok = file:set_cwd(Dir), - %% Check that this directory is not on the skip list - Config7 = case rebar_config:is_skip_dir(Config3, Dir) of - true -> - %% Do not execute the command on the directory, as some - %% module has requested a skip on it. - ?INFO("Skipping ~s in ~s\n", [Command, Dir]), - Config3; - - false -> - %% Check for and get command specific environments - {Config4, Env} = setup_envs(Config3, Modules), - - %% Execute any before_command plugins on this directory - Config5 = execute_pre(Command, PluginModules, Config4, - File, Env), - - %% Execute the current command on this directory - Config6 = execute(Command, AllModules, Config5, File, - Env), - - %% Execute any after_command plugins on this directory - execute_post(Command, PluginModules, Config6, File, Env) - end, + %% Maybe apply command to Dir + Config4 = maybe_execute(Dir, Command, Config3, Modules, PluginModules, + AllModules, File, WouldCd), %% Mark the current directory as processed DirSet3 = sets:add_element(Dir, DirSet2), %% Invoke 'postprocess' on the modules. This yields a list of other %% directories that should be processed _after_ the current one. - {Config8, Postdirs} = acc_modules(AllModules, postprocess, Config7, File), + {Config5, Postdirs} = acc_modules(AllModules, postprocess, Config4, File), ?DEBUG("Postdirs: ~p\n", [Postdirs]), - Res = process_each(Postdirs, Command, Config8, DirSet3, File), + Res = process_each(Postdirs, Command, Config5, DirSet3, File), %% Make sure the CWD is reset properly; processing the dirs may have %% caused it to change @@ -295,6 +278,33 @@ process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, %% Return the updated {config, dirset} as result Res. +maybe_execute(Dir, Command, Config, Modules, PluginModules, AllModules, File, + would_cd) -> + %% Check that this directory is not on the skip list + case rebar_config:is_skip_dir(Config, Dir) of + true -> + %% Do not execute the command on the directory, as some + %% module has requested a skip on it. + ?INFO("Skipping ~s in ~s\n", [Command, Dir]), + Config; + + false -> + %% Check for and get command specific environments + {Config1, Env} = setup_envs(Config, Modules), + + %% Execute any before_command plugins on this directory + Config2 = execute_pre(Command, PluginModules, Config1, File, Env), + + %% Execute the current command on this directory + Config3 = execute(Command, AllModules, Config2, File, Env), + + %% Execute any after_command plugins on this directory + execute_post(Command, PluginModules, Config3, File, Env) + end; +maybe_execute(_Dir, _Command, Config, _Modules, _PluginModules, _AllModules, + _File, would_not_cd) -> + Config. + remember_cwd_predirs(Cwd, Predirs) -> Store = fun(Dir, Dict) -> case dict:find(Dir, Dict) of |