anchor.diff:  
   execute_plugin_hook(Hook, Command, Modules, Config, ModuleFile, Env) ->
       HookFunction = list_to_atom(Hook ++ atom_to_list(Command)),
  -    execute(HookFunction, Modules, Config, ModuleFile, Env).
  +    execute(HookFunction, hook, Modules, Config, ModuleFile, Env).
   
   %%
   %% Execute a command across all applicable modules
   %%
   execute(Command, Modules, Config, ModuleFile, Env) ->
  +    execute(Command, not_a_hook, Modules, Config, ModuleFile, Env).
  +
  +execute(Command, Type, Modules, Config, ModuleFile, Env) ->
       case select_modules(Modules, Command, []) of
           [] ->
  -            Cmd = atom_to_list(Command),
  -            case lists:prefix("pre_", Cmd)
  -                orelse lists:prefix("post_", Cmd) of
  -                true ->
  +            case Type of
  +                hook ->
                       ok;
  -                false ->
  +                not_a_hook ->
                       ?WARN("'~p' command does not apply to directory ~s\n",
                             [Command, rebar_utils:get_cwd()])
               end,
  
positive.code:     %% Get the list of plug-in modules from rebar.config. These
      %% modules may participate in preprocess and postprocess.
      {ok, PluginModules} = plugin_modules(Config1, PredirsAssoc),
  
      {Config2, PluginPredirs} = acc_modules(PluginModules, preprocess,
                                             Config1, ModuleSetFile),
  
      AllPredirs = Predirs ++ PluginPredirs,
  
      ?DEBUG("Predirs: ~p\n", [AllPredirs]),
      {Config3, DirSet2} = process_each(AllPredirs, Command, Config2,
                                        ModuleSetFile, DirSet),
  
      %% Make sure the CWD is reset properly; processing the dirs may have
      %% caused it to change
  
negative.code: 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);
  skip_or_process_dir(Dir, Command, Config, DirSet, CurrentCodePath,
                      {_, File}=ModuleSet) ->
      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);
          false ->
              %% not an app dir, no need to consider apps=/skip_apps=
              process_dir1(Dir, Command, Config, DirSet, CurrentCodePath,
                           ModuleSet)
      end.
  
  skip_or_process_dir1(Dir, Command, Config, DirSet, CurrentCodePath, ModuleSet,
                       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
              %% way to signal this to rebar_core, so we have to explicitly do it
              %% 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);
          {Config1, {true, SkippedApp}} ->
              ?DEBUG("Skipping app: ~p~n", [SkippedApp]),
              {increment_operations(Config1), DirSet};
          {Config1, false} ->
              process_dir1(Dir, Command, Config1, DirSet, CurrentCodePath,
                           ModuleSet)
      end.
  
  process_dir1(Dir, Command, Config, DirSet, CurrentCodePath,
               {DirModules, File}) ->
      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
  