anchor.diff:      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 == "tarball" then fetch_tarball pkgs name 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 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
   
  
positive.code:     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;
  
  
negative.code:       # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
        inherit pkgs;
      };
  
  in
  mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
  