From d1692efdf5cad04bc25d959a80ac56ff6faecd8b Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Tue, 30 Dec 2014 16:38:50 -0600 Subject: overrides working except for transitive dep inheritance with lock file --- src/rebar_state.erl | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/rebar_state.erl') diff --git a/src/rebar_state.erl b/src/rebar_state.erl index 657c7d2..d5d19f3 100644 --- a/src/rebar_state.erl +++ b/src/rebar_state.erl @@ -27,6 +27,9 @@ deps_names/1, + overrides/1, overrides/2, + apply_overrides/2, + prepend_hook/3, append_hook/3, hooks/2, providers/1, providers/2, add_provider/2]). @@ -49,6 +52,7 @@ deps_to_build = [] :: [rebar_app_into:t()], all_deps = [] :: [rebar_app_into:t()], + overrides = [], providers = []}). -export_type([t/0]). @@ -150,6 +154,35 @@ command_parsed_args(#state_t{command_parsed_args=CmdArgs}) -> command_parsed_args(State, CmdArgs) -> State#state_t{command_parsed_args=CmdArgs}. +apply_overrides(State=#state_t{overrides=Overrides}, AppName) -> + Name = binary_to_atom(AppName, utf8), + + %% Inefficient. We want the order we get here though. + State1 = lists:foldl(fun({override, O}, StateAcc) -> + lists:foldl(fun({Key, Value}, StateAcc1) -> + rebar_state:set(StateAcc1, Key, Value) + end, StateAcc, O); + (_, StateAcc) -> + StateAcc + end, State, Overrides), + + State2 = lists:foldl(fun({override, N, O}, StateAcc) when N =:= Name -> + lists:foldl(fun({Key, Value}, StateAcc1) -> + rebar_state:set(StateAcc1, Key, Value) + end, StateAcc, O); + (_, StateAcc) -> + StateAcc + end, State1, Overrides), + + lists:foldl(fun({add, N, O}, StateAcc) when N =:= Name -> + lists:foldl(fun({Key, Value}, StateAcc1) -> + OldValue = rebar_state:get(StateAcc1, Key, []), + rebar_state:set(StateAcc1, Key, Value++OldValue) + end, StateAcc, O); + (_, StateAcc) -> + StateAcc + end, State2, Overrides). + apply_profiles(State, Profile) when not is_list(Profile) -> apply_profiles(State, [Profile]); apply_profiles(State, [default]) -> @@ -200,6 +233,12 @@ deps_names(State) -> Deps = rebar_state:get(State, deps, []), deps_names(Deps). +overrides(#state_t{overrides=Overrides}) -> + Overrides. + +overrides(State=#state_t{}, Overrides) -> + State#state_t{overrides=Overrides}. + project_apps(#state_t{project_apps=Apps}) -> Apps. -- cgit v1.1 From 8168c1f4f99d4709d273a9a35d6e2105043fb098 Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Thu, 1 Jan 2015 08:50:46 -0600 Subject: overrides working with lock except in case of adding to config after lock --- src/rebar_state.erl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/rebar_state.erl') diff --git a/src/rebar_state.erl b/src/rebar_state.erl index d5d19f3..713cb40 100644 --- a/src/rebar_state.erl +++ b/src/rebar_state.erl @@ -90,7 +90,8 @@ new(ParentState, Config, Dir) -> Opts = ParentState#state_t.opts, LocalOpts = case rebar_config:consult_file(filename:join(Dir, ?LOCK_FILE)) of [D] -> - dict:from_list([{locks, D}, {{deps, default}, D} | Config]); + D1 = proplists:get_value(deps, Config, []), + dict:from_list([{locks, D}, {{deps, default}, D1} | Config]); _ -> D = proplists:get_value(deps, Config, []), dict:from_list([{{deps, default}, D} | Config]) -- cgit v1.1 From 37a20259062056f684f3fa7e9333ca7de9f97a4d Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Sun, 4 Jan 2015 10:44:00 -0600 Subject: don't allow locked transitive dep to override higher level dep --- src/rebar_state.erl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/rebar_state.erl') diff --git a/src/rebar_state.erl b/src/rebar_state.erl index 713cb40..50bcfdb 100644 --- a/src/rebar_state.erl +++ b/src/rebar_state.erl @@ -90,8 +90,8 @@ new(ParentState, Config, Dir) -> Opts = ParentState#state_t.opts, LocalOpts = case rebar_config:consult_file(filename:join(Dir, ?LOCK_FILE)) of [D] -> - D1 = proplists:get_value(deps, Config, []), - dict:from_list([{locks, D}, {{deps, default}, D1} | Config]); + LockedDeps = [X || X <- D, element(3, X) =:= 0], + dict:from_list([{{locks, default}, LockedDeps}, {{deps, default}, D} | Config]); _ -> D = proplists:get_value(deps, Config, []), dict:from_list([{{deps, default}, D} | Config]) -- cgit v1.1