@@ -37,6 +37,8 @@ defmodule Workspace.Filtering do
3737 Only projects located under any of the provided path will be considered.
3838 * `:dependency` (`t:atom/0`) - keeps only projects that have the given dependency.
3939 * `:dependent` (`t:atom/0`) - keeps only dependencies of the given project.
40+ * `:recursive` (`t:boolean/0`) - if set, when used with `:dependency` or `:dependent`,
41+ it will consider all transitive dependencies instead of just first-level ones. Defaults to `false`.
4042 * `:affected` (`t:boolean/0`) - if set only the affected projects will be
4143 included and everything else will be skipped. Defaults to `false`.
4244 * `:modified` (`t:boolean/0`) - if set only the modified projects will be
@@ -86,6 +88,7 @@ defmodule Workspace.Filtering do
8688 tags: Enum . map ( opts [ :tags ] || [ ] , & maybe_to_tag / 1 ) ,
8789 dependency: maybe_to_atom ( opts [ :dependency ] ) ,
8890 dependent: maybe_to_atom ( opts [ :dependent ] ) ,
91+ recursive: opts [ :recursive ] || false ,
8992 paths: opts [ :paths ]
9093 ]
9194
@@ -152,10 +155,10 @@ defmodule Workspace.Filtering do
152155 |> skip_if ( workspace , fn project , _workspace -> not_affected? ( project , opts [ :affected ] ) end )
153156 |> skip_if ( workspace , fn project , _workspace -> not_modified? ( project , opts [ :modified ] ) end )
154157 |> skip_if ( workspace , fn project , workspace ->
155- not_dependency? ( workspace , project , opts [ :dependency ] )
158+ not_dependency? ( workspace , project , opts [ :dependency ] , opts [ :recursive ] )
156159 end )
157160 |> skip_if ( workspace , fn project , workspace ->
158- not_dependent? ( workspace , project , opts [ :dependent ] )
161+ not_dependent? ( workspace , project , opts [ :dependent ] , opts [ :recursive ] )
159162 end )
160163 end
161164
@@ -203,13 +206,29 @@ defmodule Workspace.Filtering do
203206 defp not_modified? ( _project , false ) , do: false
204207 defp not_modified? ( project , true ) , do: not Workspace.Project . modified? ( project )
205208
206- defp not_dependency? ( _workspace , _project , nil ) , do: false
209+ defp not_dependency? ( _workspace , _project , nil , _recursive ) , do: false
207210
208- defp not_dependency? ( workspace , project , dependency ) ,
209- do: dependency not in Workspace.Graph . dependencies ( workspace , project . app )
211+ defp not_dependency? ( workspace , project , dependency , recursive ) do
212+ deps =
213+ if recursive do
214+ Workspace.Graph . all_dependencies ( workspace , project . app )
215+ else
216+ Workspace.Graph . dependencies ( workspace , project . app )
217+ end
218+
219+ dependency not in deps
220+ end
210221
211- defp not_dependent? ( _workspace , _project , nil ) , do: false
222+ defp not_dependent? ( _workspace , _project , nil , _recursive ) , do: false
212223
213- defp not_dependent? ( workspace , project , dependent ) ,
214- do: project . app not in Workspace.Graph . dependencies ( workspace , dependent )
224+ defp not_dependent? ( workspace , project , dependent , recursive ) do
225+ deps =
226+ if recursive do
227+ Workspace.Graph . all_dependencies ( workspace , dependent )
228+ else
229+ Workspace.Graph . dependencies ( workspace , dependent )
230+ end
231+
232+ project . app not in deps
233+ end
215234end
0 commit comments