# Copyright (C) 2020 by the Georgia Tech Research Institute (GTRI)
# This software may be modified and distributed under the terms of
# the BSD 3-Clause license. See the LICENSE file for details.
defmodule ProjectIdent do
@moduledoc """
ProjectIdent module
"""
@doc """
find_files: Traverses paths according to the given repository and project type
and returns a list of matches
"""
@spec find_files(atom | %{path: any}, atom | %{files: any, path: any}) :: [binary]
def find_files(repo, project_type) do
Path.wildcard(
"#{repo.path}/#{project_type.path}/#{ProjectType.types_to_string(project_type)}"
)
end
@doc """
categorize_repo/1: takes in a Repository and will return a list
of found project types within the repo.
"""
def categorize_repo(repo, project_types) do
Enum.reduce(project_types, %{}, fn project_type, acc ->
search = find_files(repo, project_type)
if Enum.empty?(search) do
acc
else
Map.put(acc, project_type.name, search)
end
end)
end
@doc """
get_project_types_identified: takes in a Repository and will return a list of maps
of found project types within the repo.
"""
def get_project_types_identified(repo) do
## Non-metric data about repo
mix_type = %ProjectType{
name: :mix,
path: "",
files: ["mix.exs,mix.lock"]
}
python_type = %ProjectType{
name: :python,
path: "**",
files: ["*requirements.txt*"]
}
node_type = %ProjectType{
name: :node,
path: "**",
files: ["package*.json", "yarn.lock"]
}
go_type = %ProjectType{
name: :go_mod,
path: "**",
files: ["go.mod"]
}
cargo_type = %ProjectType{
name: :cargo,
path: "**",
files: ["Cargo.toml"]
}
rubygem_type = %ProjectType{
name: :rubygem,
path: "**",
files: ["Gemfile*,*.gemspec"]
}
maven_type = %ProjectType{
name: :maven,
path: "**",
files: ["pom.xml"]
}
gradle_type = %ProjectType{
name: :gradle,
path: "**",
files: ["build.gradle*"]
}
project_types = [
mix_type,
python_type,
node_type,
go_type,
cargo_type,
rubygem_type,
maven_type,
gradle_type
]
if is_map(repo) && Map.has_key?(repo, :__struct__) do
categorize_repo(repo, project_types) |> Helpers.convert_config_to_list()
else
repo = %{path: repo}
categorize_repo(repo, project_types) |> Helpers.convert_config_to_list()
end
end
end