From 1604e4f3b1c17ae8f1399f644ae441bf91cfd7b7 Mon Sep 17 00:00:00 2001 From: Tino Breddin Date: Tue, 2 Jun 2020 17:19:15 +0200 Subject: [PATCH 1/2] Add test for provider hook cmd args passing --- test/rebar_hooks_SUITE.erl | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/rebar_hooks_SUITE.erl b/test/rebar_hooks_SUITE.erl index 194b42c88..c00a6ab2c 100644 --- a/test/rebar_hooks_SUITE.erl +++ b/test/rebar_hooks_SUITE.erl @@ -25,7 +25,7 @@ all() -> [build_and_clean_app, run_hooks_once, run_hooks_once_profiles, escriptize_artifacts, run_hooks_for_plugins, deps_hook_namespace, bare_compile_hooks_default_ns, deps_clean_hook_namespace, eunit_app_hooks, - sub_app_hooks, root_hooks]. + sub_app_hooks, root_hooks, run_hooks_with_top_level_cmdargs]. %% Test post provider hook cleans compiled project app, leaving it invalid build_and_clean_app(Config) -> @@ -254,3 +254,17 @@ root_hooks(Config) -> Config, RConf, ["compile"], {ok, [{app, Name, invalid}]} ). + +%% test that command-line arguments don't crash provider hooks invocation +run_hooks_with_top_level_cmdargs(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + + RebarConfig = [{pre_hooks, [{compile, ct}]}], + + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + rebar_test_utils:create_config(AppDir, RebarConfig), + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile", "-d"], {ok, [{app, Name, valid}]}). From 1d8db94639a47f7b651be8cbfc814aa8ca4c91ee Mon Sep 17 00:00:00 2001 From: Tino Breddin Date: Wed, 21 Aug 2019 15:03:00 +0200 Subject: [PATCH 2/2] Ensure provider hook calls don't crash because of invalid command line arguments Normally the CLI arguments are intended for the provider which is called directly. When these are forwarded to other providers through hooks things might break. --- src/rebar_hooks.erl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/rebar_hooks.erl b/src/rebar_hooks.erl index 358458edb..c0f3ca79b 100644 --- a/src/rebar_hooks.erl +++ b/src/rebar_hooks.erl @@ -22,9 +22,13 @@ run_all_hooks(Dir, Type, Command, Providers, State) -> run_hooks(Dir, Type, Command, rebar_state:opts(State), State). run_project_and_app_hooks(Dir, Type, Command, Providers, State) -> - ProjectApps = rebar_state:project_apps(State), - [rebar_hooks:run_all_hooks(Dir, Type, Command, Providers, AppInfo, State) || AppInfo <- ProjectApps], - run_all_hooks(Dir, Type, Command, Providers, State). + % The command_args which the original invocation of rebar received are most + % likely not applicable to the hooks which will be called. Therefore, the + % args are discarded to not crash provider hook invocations. + State1 = rebar_state:command_args(State, []), + ProjectApps = rebar_state:project_apps(State1), + [rebar_hooks:run_all_hooks(Dir, Type, Command, Providers, AppInfo, State1) || AppInfo <- ProjectApps], + run_all_hooks(Dir, Type, Command, Providers, State1). run_provider_hooks(Dir, Type, Command, Providers, Opts, State) -> case rebar_opts:get(Opts, provider_hooks, []) of