62 lines
1.7 KiB
Elixir
62 lines
1.7 KiB
Elixir
import Snyk.MixProject.Common
|
|
|
|
defmodule Snyk.MixProject.Mix.Project do
|
|
def load_mix_project(""), do: error("Please provide a valid path for the project")
|
|
def load_mix_project(path) do
|
|
manifest = load_manifest(path)
|
|
|
|
apps = get_apps(manifest[:apps_path], path)
|
|
|
|
lock_file_name = get_lock_file_name(manifest[:lockfile])
|
|
lock_file_path = Path.join(path, lock_file_name)
|
|
lock_file = read_file(lock_file_path)
|
|
parent_umbrella_manifest = case Path.dirname(lock_file_path) do
|
|
^path -> nil
|
|
parent_path -> load_manifest(parent_path, "parent_app")
|
|
end
|
|
|
|
%{
|
|
manifest: manifest,
|
|
lock: lock_file,
|
|
apps: apps,
|
|
parent_umbrella_manifest: parent_umbrella_manifest
|
|
}
|
|
end
|
|
|
|
defp read_file(path) do
|
|
Path.expand(path)
|
|
|> Code.eval_file()
|
|
end
|
|
|
|
defp get_lock_file_name(nil), do: get_lock_file_name("")
|
|
defp get_lock_file_name(""), do: "mix.lock"
|
|
defp get_lock_file_name(filename), do: filename
|
|
|
|
defp load_manifest(path), do: load_manifest(path, "root_app")
|
|
defp load_manifest(path, app) do
|
|
Mix.Project.in_project(
|
|
String.to_atom(app),
|
|
path,
|
|
fn module ->
|
|
module.project ++ [module_name: inspect(module)]
|
|
end
|
|
)
|
|
end
|
|
|
|
defp get_apps(nil, _), do: nil
|
|
defp get_apps(apps_path, path) do
|
|
Path.join([path, apps_path, "/*/mix.exs"])
|
|
|> Path.absname
|
|
|> Path.wildcard
|
|
|> Enum.map(fn path -> Path.dirname(path) end)
|
|
|> Enum.reduce(
|
|
%{},
|
|
fn full_project_path, acc ->
|
|
relative_project_path = Path.relative_to(full_project_path, path)
|
|
Map.put(acc, relative_project_path, load_manifest(full_project_path, relative_project_path))
|
|
end
|
|
)
|
|
|
|
end
|
|
end
|