anchor.diff:        # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
         inherit pkgs;
       };
  +
   in
   mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
  
positive.code:     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
  
  
negative.code:         then abort
            "The values in sources.json should not have an 'outPath' attribute"
          else
            spec // { outPath = replace name (fetch config.pkgs name spec); }
      ) config.sources;
  
    # The "config" used by the fetchers
    mkConfig =
      { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
      , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
      , pkgs ? mkPkgs sources
      }: rec {
        # The sources, i.e. the attribute set of spec name to spec
  