From 2667dbdd0b9da867da348fe0a6b22933daebad3c Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Sun, 19 Apr 2015 14:29:37 -0500 Subject: don't duplicate hooks for top level app --- src/rebar_app_discover.erl | 26 ++++++++++++++++++++++++-- src/rebar_dir.erl | 3 ++- src/rebar_prv_compile.erl | 11 ++++------- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/rebar_app_discover.erl b/src/rebar_app_discover.erl index 16dcf24..41f41f5 100644 --- a/src/rebar_app_discover.erl +++ b/src/rebar_app_discover.erl @@ -37,12 +37,13 @@ merge_deps(AppInfo, State) -> Default = rebar_state:default(State), CurrentProfiles = rebar_state:current_profiles(State), Name = rebar_app_info:name(AppInfo), - C = rebar_config:consult(rebar_app_info:dir(AppInfo)), + C = project_app_config(AppInfo, State), %% We reset the opts here to default so no profiles are applied multiple times AppState = rebar_state:apply_overrides( rebar_state:apply_profiles( - rebar_state:new(rebar_state:opts(State, Default), C, rebar_app_info:dir(AppInfo)), CurrentProfiles), Name), + rebar_state:new(reset_hooks(rebar_state:opts(State, Default)), C, + rebar_app_info:dir(AppInfo)), CurrentProfiles), Name), AppInfo1 = rebar_app_info:state(AppInfo, AppState), State1 = lists:foldl(fun(Profile, StateAcc) -> @@ -56,6 +57,27 @@ merge_deps(AppInfo, State) -> {AppInfo1, State1}. +project_app_config(AppInfo, State) -> + C = rebar_config:consult(rebar_app_info:dir(AppInfo)), + Dir = rebar_app_info:dir(AppInfo), + maybe_reset_hooks(C, Dir, State). + +%% Here we check if the app is at the root of the project. +%% If it is, then drop the hooks from the config so they aren't run twice +maybe_reset_hooks(C, Dir, State) -> + case filename:dirname(rebar_dir:root_dir(State)) of + Dir -> + C1 = proplists:delete(provider_hooks, C), + proplists:delete(hooks, C1); + _ -> + C + end. + +reset_hooks(State) -> + lists:foldl(fun(Key, StateAcc) -> + rebar_state:set(StateAcc, Key, []) + end, State, [post_hooks, pre_hooks, provider_hooks]). + -spec all_app_dirs(list(file:name())) -> list(file:name()). all_app_dirs(LibDirs) -> lists:flatmap(fun(LibDir) -> diff --git a/src/rebar_dir.erl b/src/rebar_dir.erl index 7a12eeb..c0c6bb2 100644 --- a/src/rebar_dir.erl +++ b/src/rebar_dir.erl @@ -4,6 +4,7 @@ profile_dir/2, deps_dir/1, deps_dir/2, + root_dir/1, checkouts_dir/1, checkouts_dir/2, plugins_dir/1, @@ -48,7 +49,7 @@ deps_dir(DepsDir, App) -> filename:join(DepsDir, App). root_dir(State) -> - rebar_state:get(State, root_dir, ?DEFAULT_ROOT_DIR). + filename:absname(rebar_state:get(State, root_dir, ?DEFAULT_ROOT_DIR)). -spec checkouts_dir(rebar_state:t()) -> file:filename_all(). checkouts_dir(State) -> diff --git a/src/rebar_prv_compile.erl b/src/rebar_prv_compile.erl index 94a1e0b..15a5164 100644 --- a/src/rebar_prv_compile.erl +++ b/src/rebar_prv_compile.erl @@ -43,17 +43,14 @@ do(State) -> EmptyState = rebar_state:new(), build_apps(EmptyState, Providers, Deps), - %% Use the project State for building project apps - %% Set hooks to empty so top-level hooks aren't run for each project app - State2 = rebar_state:set(rebar_state:set(State, post_hooks, []), pre_hooks, []), {ok, ProjectApps1} = rebar_digraph:compile_order(ProjectApps), - ProjectApps2 = build_apps(State2, Providers, ProjectApps1), - State3 = rebar_state:project_apps(State2, ProjectApps2), + ProjectApps2 = build_apps(State, Providers, ProjectApps1), + State2 = rebar_state:project_apps(State, ProjectApps2), - rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State3), + rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State2), - {ok, State3}. + {ok, State2}. -spec format_error(any()) -> iolist(). format_error(Reason) -> -- cgit v1.1