anchor.diff:    # 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_file = pkgs: name: spec:
  +    let
  +      name' = sanitizeName name + "-src";
  +    in
  +      if spec.builtin or true then
  +        builtins_fetchurl { inherit (spec) url sha256; name = name'; }
  +      else
  +        pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
   
  -  fetch_tarball = pkgs: spec:
  -    if spec.builtin or true then
  -      builtins_fetchTarball { inherit (spec) url sha256; }
  -    else
  -      pkgs.fetchzip { inherit (spec) url sha256; };
  +  fetch_tarball = pkgs: name: spec:
  +    let
  +      name' = sanitizeName name + "-src";
  +    in
  +      if spec.builtin or true then
  +        builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
  +      else
  +        pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
   
  -  fetch_git = spec:
  -    builtins.fetchGit { url = spec.repo; inherit (spec) rev ref; };
  +  fetch_git = name: spec:
  +    let
  +      ref =
  +        if spec ? ref then spec.ref else
  +          if spec ? branch then "refs/heads/${spec.branch}" else
  +            if spec ? tag then "refs/tags/${spec.tag}" else
  +              abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
  +    in
  +      builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; };
   
  -  fetch_builtin-tarball = spec:
  -    builtins.trace
  -      ''
  -        WARNING:
  -          The niv type "builtin-tarball" will soon be deprecated. You should
  -          instead use `builtin = true`.
  +  fetch_local = spec: spec.path;
   
  -          $ niv modify <package> -a type=tarball -a builtin=true
  -      ''
  -      builtins_fetchTarball { inherit (spec) url sha256; };
  +  fetch_builtin-tarball = name: throw
  +    ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
  +        $ niv modify ${name} -a type=tarball -a builtin=true'';
   
  -  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; });
  +  fetch_builtin-url = name: throw
  +    ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
  +        $ niv modify ${name} -a type=file -a builtin=true'';
   
     #
     # Various helpers
     #
   
  +  # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
  +  sanitizeName = name:
  +    (
  +      concatMapStrings (s: if builtins.isList s then "-" else s)
  +        (
  +          builtins.split "[^[:alnum:]+._?=-]+"
  +            ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
  +        )
  +    );
  +
     # The set of packages used when specs are fetched using non-builtins.
  -  mkPkgs = sources:
  +  mkPkgs = sources: system:
       let
         sourcesNixpkgs =
  -        import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) {};
  +        import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
         hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
         hasThisAsNixpkgsPath = <nixpkgs> == ./.;
       in
  
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;
  
    # 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;
  
  
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
  
  