anchor.diff:          then abort
             "The values in sources.json should not have an 'outPath' attribute"
           else
  -          spec // { outPath = fetch config.pkgs name spec; }
  +          spec // { outPath = replace name (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
  +    { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
  +    , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
  +    , system ? builtins.currentSystem
  +    , pkgs ? mkPkgs sources system
       }: rec {
         # The sources, i.e. the attribute set of spec name to spec
         inherit sources;
  
positive.code:       # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
        inherit pkgs;
      };
  in
  mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
  
negative.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 name spec
      else if spec.type == "tarball" then fetch_tarball pkgs name spec
      else if spec.type == "git" then fetch_git name spec
      else if spec.type == "local" then fetch_local spec
      else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
      else if spec.type == "builtin-url" then fetch_builtin-url name
      else
        abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
  
    # If the environment variable NIV_OVERRIDE_${name} is set, then use
    # the path directly as opposed to the fetched source.
    replace = name: drv:
      let
        saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
        ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
      in
        if ersatz == "" then drv else ersatz;
  
    # Ports of functions for older nix versions
  
  