diff --git a/nix/sources.nix b/nix/sources.nix index 9520f31..1aaa5db 100644 --- a/nix/sources.nix +++ b/nix/sources.nix @@ -1,6 +1,57 @@ # This file has been generated by Niv. let + + # + # The fetchers. fetch_ fetches specs of type . + # + + fetch_file = spec: + if spec.builtin or true then + builtins_fetchurl { inherit (spec) url sha256; } + else + pkgs.fetchurl { inherit (spec) url sha256; }; + + fetch_tarball = spec: + if spec.builtin or true then + builtins_fetchTarball { inherit (spec) url sha256; } + else + pkgs.fetchzip { inherit (spec) url sha256; }; + + fetch_builtin-tarball = spec: + builtins.trace + '' + WARNING: + The niv type "builtin-tarball" will soon be deprecated. You should + instead use `builtin = true`. + + $ niv modify -a type=tarball -a builtins=true + '' # TODO: attribute as JSON + builtins_fetchTarball { inherit (spec) url sha256; }; + + fetch_builtin-url = spec: + builtins.trace + '' + WARNING: + The niv type "builtin-url" will soon be deprecated. You should + instead use `builtin = true`. + + $ niv modify -a type=file -a builtins=true + '' # TODO: attribute as JSON + + (builtins_fetchurl { inherit (spec) url sha256; }); + + # + # The sources to fetch. + # + + sources = builtins.fromJSON (builtins.readFile ./sources.json); + + # + # Various helpers + # + + # The set of packages used when specs are fetched using non-builtins. pkgs = if hasNixpkgsPath then @@ -19,6 +70,30 @@ let add a package called "nixpkgs" to your sources.json. ''; + hasNixpkgsPath = (builtins.tryEval ).success; + hasThisAsNixpkgsPath = + (builtins.tryEval ).success && == ./.; + + # The actual fetching function. + fetch = name: spec: + + if ! builtins.hasAttr "type" spec then + abort "ERROR: niv spec ${name} does not have a 'type' attribute" + else if spec.type == "file" then fetch_file spec + else if spec.type == "tarball" then fetch_tarball spec + else if spec.type == "builtin-tarball" then fetch_builtin-tarball spec + else if spec.type == "builtin-url" then fetch_builtin-url spec + else + abort "ERROR: niv spec ${name} has unknown type ${builtins.fromJSON spec.type}"; + + # Ports of functions for previous nix versions + + # a Nix version of mapAttrs if the built-in doesn't exist + mapAttrs = builtins.mapAttrs or ( + f: set: with builtins; + listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) + ); + # fetchTarball version that is compatible between all the versions of Nix builtins_fetchTarball = { url, sha256 }@attrs: let @@ -39,56 +114,12 @@ let else fetchurl attrs; - # A wrapper around pkgs.fetchzip that has inspectable arguments, - # annoyingly this means we have to specify them - fetchzip = { url, sha256 }@attrs: pkgs.fetchzip attrs; - - # A wrapper around pkgs.fetchurl that has inspectable arguments, - # annoyingly this means we have to specify them - fetchurl = { url, sha256 }@attrs: pkgs.fetchurl attrs; - - hasNixpkgsPath = (builtins.tryEval ).success; - hasThisAsNixpkgsPath = - (builtins.tryEval ).success && == ./.; - - sources = builtins.fromJSON (builtins.readFile ./sources.json); - - mapAttrs = builtins.mapAttrs or ( - f: set: with builtins; - listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) - ); - - # borrowed from nixpkgs - functionArgs = f: f.__functionArgs or (builtins.functionArgs f); - callFunctionWith = autoArgs: f: args: - let - auto = builtins.intersectAttrs (functionArgs f) autoArgs; - in - f (auto // args); - - getFetcher = spec: - let - fetcherName = - if builtins.hasAttr "type" spec - then builtins.getAttr "type" spec - else "builtin-tarball"; - in - builtins.getAttr fetcherName { - "tarball" = fetchzip; - "builtin-tarball" = builtins_fetchTarball; - "file" = fetchurl; - "builtin-url" = builtins_fetchurl; - }; in -# NOTE: spec must _not_ have an "outPath" attribute mapAttrs ( - _: spec: + name: spec: if builtins.hasAttr "outPath" spec then abort "The values in sources.json should not have an 'outPath' attribute" else - if builtins.hasAttr "url" spec && builtins.hasAttr "sha256" spec - then - spec // { outPath = callFunctionWith spec (getFetcher spec) {}; } - else spec + spec // { outPath = fetch name spec; } ) sources