nixpkgs/pkgs/desktops/pantheon/nixpkgs_github_update/lib/nixpkgs_github_update/nix.ex

86 lines
1.8 KiB
Elixir

defmodule NixpkgsGitHubUpdate.Nix do
def executable do
nix = System.find_executable("nix")
if nix == nil do
raise RuntimeError, message: "missing executable for 'nix'"
end
nix
end
def eval!(attribute) do
System.cmd(
executable(),
[
"eval",
"--json",
attribute
],
stderr_to_stdout: true
)
|> handle_eval
end
defp handle_eval({eval_result, 0}) do
case eval_result do
"" -> eval_result
_ -> Poison.Parser.parse!(eval_result, %{})
end
end
defp handle_eval({eval_result, _}) do
raise RuntimeError, message: "Error running nix eval: #{eval_result}"
end
def attribute_exists?(attribute) do
attr_exist_expression = """
with import <nixpkgs> {};
let
attrSet = pkgs.lib.attrByPath (pkgs.lib.splitString "." "#{attribute}") null pkgs;
in
if attrSet == null then false
else true
"""
eval!("(#{attr_exist_expression})")
end
def update_source_version(attribute, version) do
System.cmd("update-source-version", [
attribute,
version
])
end
def get_url_attr(attribute) do
case attribute_exists?("#{attribute}.src.fetchSubmodules") do
true -> "url"
false -> "urls"
end
end
def get_owner_repo(attribute) do
url_attr = get_url_attr(attribute)
eval!("nixpkgs.#{attribute}.src.#{url_attr}")
|> case do
# It's fetchFromGitHub if we got a list
[url | _] ->
URI.parse(url).path
|> String.split("/archive", trim: true)
|> List.first()
|> String.split("/", trim: true)
# It's fetchgit if we got a plain string
url ->
URI.parse(url).path
|> String.split(".git", trim: true)
|> List.first()
|> String.split("/", trim: true)
end
|> List.to_tuple()
end
end