anchor.diff:  -module(rebar_config).
   
   -export([new/0, new/1,
  -         get/3, get_list/3,
  -         delete/2,
  +         get/3, get_local/3, get_list/3,
  +         get_all/2,
  +         set/3,
            set_global/2, get_global/2,
            is_verbose/0]).
   
  
positive.code: %% ===================================================================
  %% Internal functions
  %% ===================================================================
  
negative.code:     ConfigFile = filename:join([Dir, "rebar.config"]),
      case file:consult(ConfigFile) of
          {ok, Terms} ->
              %% Found a config file with some terms. We need to be able to
              %% distinguish between local definitions (i.e. from the file
              %% in the cwd) and inherited definitions. To accomplish this,
              %% we use a marker in the proplist (since order matters) between
              %% the new and old defs.
              Opts = Terms ++ [local] ++ [Opt || Opt <- ParentConfig#config.opts, Opt /= local];
          {error, enoent} ->
              Opts = [local] ++ [Opt || Opt <- ParentConfig#config.opts, Opt /= local];
          Other ->
              Opts = undefined, % Keep erlc happy
              ?ABORT("Failed to load ~s: ~p\n", [ConfigFile, Other])
      end,
      #config { dir = Dir, opts = Opts }.
  
  get(Config, Key, Default) ->
      proplists:get_value(Key, Config#config.opts, Default).
  
  get_list(Config, Key, Default) ->
      get(Config, Key, Default).
  
  get_local(Config, Key, Default) ->
      proplists:get_value(Key, local_opts(Config#config.opts, []), Default).
  
  get_all(Config, Key) ->
      proplists:get_all_values(Key, Config#config.opts).
  
  set(Config, Key, Value) ->
      Opts = proplists:delete(Key, Config#config.opts),
      Config#config { opts = [{Key, Value} | Opts] }.
  
  set_global(Key, Value) ->
      application:set_env(rebar_global, Key, Value).
  