@@ -120,9 +120,21 @@ defmodule Igniter.Util.Install do
120120 Keyword . put ( options , :operation , "compiling #{ installing_names } " )
121121 )
122122
123- available_tasks =
123+ { available_tasks , unavailable_tasks } =
124124 Enum . zip ( installing , Enum . map ( installing , & Mix.Task . get ( "#{ & 1 } .install" ) ) )
125- |> Enum . filter ( fn { _desired_task , source_task } -> source_task end )
125+ |> Enum . split_with ( fn { _desired_task , source_task } -> source_task end )
126+
127+ if Enum . any? ( unavailable_tasks ) do
128+ Mix . shell ( ) . info ( """
129+
130+ #{ IO.ANSI . yellow ( ) } The following installers did not exist or could not be found.#{ IO.ANSI . reset ( ) }
131+ If you chose not to install dependencies, this will be true for any uninstalled packages.
132+
133+ #{ Enum . map_join ( unavailable_tasks , "\n " , & "* #{ IO.ANSI . yellow ( ) } #{ elem ( & 1 , 0 ) } .install#{ IO.ANSI . reset ( ) } " ) }
134+ """ )
135+
136+ # `#name}.install` #{IO.ANSI.red()}x#{IO.ANSI.reset()}")
137+ end
126138
127139 case igniter . issues do
128140 [ ] ->
@@ -149,8 +161,6 @@ defmodule Igniter.Util.Install do
149161 )
150162 end
151163
152- IO . puts ( "\n Successfully installed:\n \n #{ Enum . map_join ( installing , "\n " , & "* #{ & 1 } " ) } " )
153-
154164 _issues ->
155165 Igniter . display_issues ( igniter )
156166 exit ( { :shutdown , 1 } )
@@ -159,10 +169,38 @@ defmodule Igniter.Util.Install do
159169
160170 defp run_installers ( igniter , igniter_task_sources , title , argv , options ) do
161171 igniter_task_sources
162- |> Enum . reduce ( igniter , fn { name , task } , igniter ->
163- igniter = Igniter . compose_task ( igniter , task , argv )
164- Mix . shell ( ) . info ( "`#{ name } .install` #{ IO.ANSI . green ( ) } ✔#{ IO.ANSI . reset ( ) } " )
165- igniter
172+ |> Enum . reduce ( igniter , fn { name , task_name } , igniter ->
173+ task = task_name |> Mix.Task . get ( )
174+
175+ if ! task . supports_umbrella? ( ) && Mix.Project . umbrella? ( ) do
176+ Igniter . add_issue ( igniter , "Cannot run #{ task_name } in an umbrella project." )
177+ else
178+ igniter
179+ |> Map . put ( :task , Mix.Task . task_name ( task ) )
180+ |> Map . put ( :parent , igniter . task )
181+ |> Igniter.Mix.Task . configure_and_run ( task , argv )
182+ |> Map . put ( :parent , igniter . parent )
183+ |> Map . put ( :task , igniter . task )
184+ |> Map . replace! ( :args , igniter . args )
185+ |> tap ( fn new_igniter ->
186+ new_issue_count = Enum . count ( new_igniter . issues )
187+ old_issue_count = Enum . count ( igniter . issues )
188+
189+ new_warning_count = Enum . count ( new_igniter . warnings )
190+ old_warning_count = Enum . count ( igniter . warnings )
191+
192+ cond do
193+ new_issue_count > old_issue_count ->
194+ Mix . shell ( ) . info ( "`#{ name } .install` #{ IO.ANSI . red ( ) } x#{ IO.ANSI . reset ( ) } " )
195+
196+ new_warning_count > old_warning_count ->
197+ Mix . shell ( ) . info ( "`#{ name } .install` #{ IO.ANSI . yellow ( ) } !#{ IO.ANSI . reset ( ) } " )
198+
199+ true ->
200+ Mix . shell ( ) . info ( "`#{ name } .install` #{ IO.ANSI . green ( ) } ✔#{ IO.ANSI . reset ( ) } " )
201+ end
202+ end )
203+ end
166204 end )
167205 |> Igniter . do_or_dry_run ( Keyword . put ( options , :title , title ) )
168206
0 commit comments