135 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
|  | # This file has been generated by Niv. | ||
|  | 
 | ||
|  | let | ||
|  | 
 | ||
|  |   # | ||
|  |   # The fetchers. fetch_<type> fetches specs of type <type>. | ||
|  |   # | ||
|  | 
 | ||
|  |   fetch_file = pkgs: spec: | ||
|  |     if spec.builtin or true then | ||
|  |       builtins_fetchurl { inherit (spec) url sha256; } | ||
|  |     else | ||
|  |       pkgs.fetchurl { inherit (spec) url sha256; }; | ||
|  | 
 | ||
|  |   fetch_tarball = pkgs: spec: | ||
|  |     if spec.builtin or true then | ||
|  |       builtins_fetchTarball { inherit (spec) url sha256; } | ||
|  |     else | ||
|  |       pkgs.fetchzip { inherit (spec) url sha256; }; | ||
|  | 
 | ||
|  |   fetch_git = spec: | ||
|  |     builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; }; | ||
|  | 
 | ||
|  |   fetch_builtin-tarball = spec: | ||
|  |     builtins.trace | ||
|  |       ''
 | ||
|  |         WARNING: | ||
|  |           The niv type "builtin-tarball" will soon be deprecated. You should | ||
|  |           instead use `builtin = true`. | ||
|  | 
 | ||
|  |           $ niv modify <package> -a type=tarball -a builtin=true | ||
|  |       ''
 | ||
|  |       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 <package> -a type=file -a builtin=true | ||
|  |       ''
 | ||
|  |       (builtins_fetchurl { inherit (spec) url sha256; }); | ||
|  | 
 | ||
|  |   # | ||
|  |   # Various helpers | ||
|  |   # | ||
|  | 
 | ||
|  |   # The set of packages used when specs are fetched using non-builtins. | ||
|  |   mkPkgs = sources: | ||
|  |     let | ||
|  |       sourcesNixpkgs = | ||
|  |         import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {}; | ||
|  |       hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; | ||
|  |       hasThisAsNixpkgsPath = <nixpkgs> == ./.; | ||
|  |     in | ||
|  |       if builtins.hasAttr "nixpkgs" sources | ||
|  |       then sourcesNixpkgs | ||
|  |       else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then | ||
|  |         import <nixpkgs> {} | ||
|  |       else | ||
|  |         abort | ||
|  |           ''
 | ||
|  |             Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or | ||
|  |             add a package called "nixpkgs" to your sources.json. | ||
|  |           '';
 | ||
|  | 
 | ||
|  |   # The actual fetching function. | ||
|  |   fetch = pkgs: 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 pkgs spec | ||
|  |     else if spec.type == "tarball" then fetch_tarball pkgs spec | ||
|  |     else if spec.type == "git" then fetch_git 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.toJSON spec.type}"; | ||
|  | 
 | ||
|  |   # Ports of functions for older 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 | ||
|  |       inherit (builtins) lessThan nixVersion fetchTarball; | ||
|  |     in | ||
|  |       if lessThan nixVersion "1.12" then | ||
|  |         fetchTarball { inherit url; } | ||
|  |       else | ||
|  |         fetchTarball attrs; | ||
|  | 
 | ||
|  |   # fetchurl version that is compatible between all the versions of Nix | ||
|  |   builtins_fetchurl = { url, sha256 }@attrs: | ||
|  |     let | ||
|  |       inherit (builtins) lessThan nixVersion fetchurl; | ||
|  |     in | ||
|  |       if lessThan nixVersion "1.12" then | ||
|  |         fetchurl { inherit url; } | ||
|  |       else | ||
|  |         fetchurl attrs; | ||
|  | 
 | ||
|  |   # Create the final "sources" from the config | ||
|  |   mkSources = config: | ||
|  |     mapAttrs ( | ||
|  |       name: spec: | ||
|  |         if builtins.hasAttr "outPath" spec | ||
|  |         then abort | ||
|  |           "The values in sources.json should not have an 'outPath' attribute" | ||
|  |         else | ||
|  |           spec // { outPath = fetch config.pkgs name spec; } | ||
|  |     ) config.sources; | ||
|  | 
 | ||
|  |   # The "config" used by the fetchers | ||
|  |   mkConfig = | ||
|  |     { sourcesFile ? ./sources.json | ||
|  |     , sources ? builtins.fromJSON (builtins.readFile sourcesFile) | ||
|  |     , pkgs ? mkPkgs sources | ||
|  |     }: rec { | ||
|  |       # The sources, i.e. the attribute set of spec name to spec | ||
|  |       inherit sources; | ||
|  | 
 | ||
|  |       # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers | ||
|  |       inherit pkgs; | ||
|  |     }; | ||
|  | in | ||
|  | mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } |