@@ -22,7 +22,7 @@ defmodule MixDependencySubmission.Fetcher.MixRuntime do
22
22
iex> %{
23
23
...> burrito: %{
24
24
...> scm: Hex.SCM,
25
- ...> dependencies: [:jason, :req, :typed_struct],
25
+ ...> dependencies: [:jason, :req, :typed_struct, :kernel, :stdlib, :elixir, :logger, :eex ],
26
26
...> mix_config: _config,
27
27
...> relationship: :direct,
28
28
...> scope: :runtime,
@@ -35,11 +35,83 @@ defmodule MixDependencySubmission.Fetcher.MixRuntime do
35
35
"""
36
36
@ impl Fetcher
37
37
def fetch do
38
- root_deps = [ depth: 1 ] |> Mix.Project . deps_tree ( ) |> Map . keys ( )
39
- deps_paths = Mix.Project . deps_paths ( )
40
- deps_scms = Mix.Project . deps_scms ( )
38
+ app = Mix.Project . config ( ) [ :app ]
41
39
42
- Map . new ( Mix.Project . deps_tree ( ) , & resolve_dep ( & 1 , root_deps , deps_paths , deps_scms ) )
40
+ root_deps =
41
+ [ depth: 1 ]
42
+ |> Mix.Project . deps_tree ( )
43
+ |> Map . keys ( )
44
+ |> Enum . concat ( get_app_dependencies ( app , true ) )
45
+ |> Enum . uniq ( )
46
+
47
+ deps_tree = full_runtime_tree ( app )
48
+
49
+ deps_paths =
50
+ deps_tree
51
+ |> Map . keys ( )
52
+ |> Enum . reduce ( Mix.Project . deps_paths ( ) , fn dep , deps_paths ->
53
+ try do
54
+ app_dir = Application . app_dir ( dep )
55
+ Map . put_new ( deps_paths , dep , app_dir )
56
+ rescue
57
+ ArgumentError ->
58
+ deps_paths
59
+ end
60
+ end )
61
+
62
+ deps_scms =
63
+ deps_tree
64
+ |> Map . keys ( )
65
+ |> Enum . reduce ( Mix.Project . deps_scms ( ) , fn dep , deps_scms ->
66
+ Map . put_new ( deps_scms , dep , MixDependencySubmission.SCM.System )
67
+ end )
68
+
69
+ Map . new ( deps_tree , & resolve_dep ( & 1 , root_deps , deps_paths , deps_scms ) )
70
+ end
71
+
72
+ @ spec full_runtime_tree ( app :: Fetcher . app_name ( ) ) :: % {
73
+ Fetcher . app_name ( ) => [ Fetcher . app_name ( ) ]
74
+ }
75
+ defp full_runtime_tree ( app ) do
76
+ app_dependencies = app |> get_app_dependencies ( true ) |> Enum . map ( & { & 1 , [ ] } )
77
+
78
+ Mix.Project . deps_tree ( )
79
+ |> Enum . concat ( app_dependencies )
80
+ |> Enum . group_by ( & elem ( & 1 , 0 ) , & elem ( & 1 , 1 ) )
81
+ |> Enum . flat_map ( fn { app , dependencies } ->
82
+ dependencies =
83
+ [ dependencies | get_app_dependencies ( app , false ) ] |> List . flatten ( ) |> Enum . uniq ( )
84
+
85
+ [ { app , dependencies } | Enum . map ( dependencies , & { & 1 , [ ] } ) ]
86
+ end )
87
+ |> Enum . group_by ( & elem ( & 1 , 0 ) , & elem ( & 1 , 1 ) )
88
+ |> Map . new ( fn { app , dependencies } ->
89
+ { app , dependencies |> List . flatten ( ) |> Enum . uniq ( ) }
90
+ end )
91
+ end
92
+
93
+ @ spec get_app_dependencies ( app :: Fetcher . app_name ( ) , root? :: boolean ( ) ) :: [
94
+ Fetcher . app_name ( )
95
+ ]
96
+ defp get_app_dependencies ( app , root? )
97
+ defp get_app_dependencies ( nil , _root? ) , do: [ ]
98
+
99
+ defp get_app_dependencies ( app , root? ) do
100
+ case Application . spec ( app ) do
101
+ nil ->
102
+ [ ]
103
+
104
+ spec ->
105
+ included = spec [ :included_applications ] || [ ]
106
+ applications = spec [ :applications ] || [ ]
107
+ optional = spec [ :optional_applications ] || [ ]
108
+
109
+ if root? do
110
+ Enum . uniq ( included ++ applications ++ optional )
111
+ else
112
+ Enum . uniq ( included ++ ( applications -- optional ) )
113
+ end
114
+ end
43
115
end
44
116
45
117
@ spec resolve_dep (
0 commit comments