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 {}; 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