@@ -131,6 +131,18 @@ defmodule Mix.Task do
131131 """
132132 @ callback run ( command_line_args :: [ binary ] ) :: any
133133
134+ @ doc """
135+ A task may return a list of dependent tasks
136+ if they are to be re-enabled when this task gets re-enabled.
137+
138+ For instance, if task `"foo"` executes `"bar"` with
139+ `Mix.Task.run("bar")` from `run/1`, this method should be implemented
140+ to return `["bar"]`.
141+ """
142+ @ callback depends_on :: [ binary ]
143+
144+ @ optional_callbacks depends_on: 0
145+
134146 @ doc false
135147 defmacro __using__ ( _opts ) do
136148 quote do
@@ -613,10 +625,25 @@ defmodule Mix.Task do
613625 child projects.
614626 """
615627 @ spec reenable ( task_name ) :: :ok
616- def reenable ( task ) when is_binary ( task ) or is_atom ( task ) do
617- task = to_string ( task )
628+ def reenable ( task ) when is_atom ( task ) do
629+ task |> to_string ( ) |> reenable ( )
630+ end
631+
632+ def reenable ( task ) when is_binary ( task ) do
633+ module = get ( task )
634+
635+ # it’s safe against `no_return` because otherwise `run/1`
636+ # would be `no_return` as well
637+ if module && function_exported? ( module , :depends_on , 0 ) do
638+ Enum . each ( module . depends_on ( ) , & reenable / 1 )
639+ end
640+
641+ do_reenable ( task , module )
642+ end
643+
644+ defp do_reenable ( task , module ) do
618645 proj = Mix.Project . get ( )
619- recursive = ( module = get ( task ) ) && recursive ( module )
646+ recursive = module && recursive ( module )
620647
621648 Mix.TasksServer . delete_many ( [ { :task , task , proj } , { :alias , task , proj } ] )
622649
0 commit comments