Current section
Files
Jump to
Current section
Files
lib/repoquery.ex
defmodule Repoquery do
def query(repo_id, package) do
case package_versions_info(repo_id, package) do
{:error, error_struct} ->
{:error, [error_struct]}
{"Repoid" <> _, 0} ->
{:error, ["Repo not found"]}
{msg, exit_code} when exit_code > 0 ->
{:error, ["#{exit_code}, #{msg}"]}
{results, 0} ->
{:ok, parse_info(results)}
end
end
defp package_versions_info(repo_id, package) do
try do
System.cmd("yum", "--disablerepo=*", "--enablerepo=#{repo_id}", "clean")
System.cmd("yum", "--disablerepo=*", "--enablerepo=#{repo_id}", "makecache")
System.cmd("repoquery", ["--repoid=#{repo_id}", "--info", "--show-duplicates", "*#{package}*"], [stderr_to_stdout: true])
rescue
e in ErlangError -> {:error, e}
end
end
defp parse_info(results) do
results
|> String.split("\n")
|> Enum.filter_map(&relevant_metadata?/1, &extract_value/1)
|> Enum.chunk(3)
|> Enum.map(&mapify_list/1)
end
defp extract_value(str) do
str |> String.split(": ") |> List.last
end
defp relevant_metadata?(str) do
String.match?(str, ~r/Name\s+:|Version\s+:|Release\s+:/)
end
defp mapify_list([name, version, release]) do
[name: name, version: version, release: release]
end
end