diff --git a/nix/sources.json b/nix/sources.json index e5bb887d..a5251eff 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -5,10 +5,10 @@ "homepage": "https://nur.nix-community.org/", "owner": "nix-community", "repo": "NUR", - "rev": "5169a012713a35c4ebef6e1f2841a02116bce5e2", - "sha256": "050i6vs5v4g809pa4as0ycdiazsiy0rhnan0g85l0x533vkz9k53", + "rev": "3c566b681fab5c9f9656bcc2e1a878abd0bfcd5d", + "sha256": "096pna6w1bngqh3c5z684a0r9byjd3z8d0q5ff101fxyw0mi6csi", "type": "tarball", - "url": "https://github.com/nix-community/NUR/archive/5169a012713a35c4ebef6e1f2841a02116bce5e2.tar.gz", + "url": "https://github.com/nix-community/NUR/archive/3c566b681fab5c9f9656bcc2e1a878abd0bfcd5d.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "arc-nixexprs": { @@ -17,10 +17,10 @@ "homepage": null, "owner": "arcnmx", "repo": "nixexprs", - "rev": "1a6fb812ced3df8686938021e2daa46823f9f7a4", - "sha256": "083w8qsqfavnyyc7g8n5c198jksz9c2myp5m82ldlqn00p274yk2", + "rev": "7d9b3512297b634fda5f97a0ffb45d757525bb38", + "sha256": "1xfckbg0x11c5qd7zd6nvwq11crxli7pxf2h9rryrc77grja3vly", "type": "tarball", - "url": "https://github.com/arcnmx/nixexprs/archive/1a6fb812ced3df8686938021e2daa46823f9f7a4.tar.gz", + "url": "https://github.com/arcnmx/nixexprs/archive/7d9b3512297b634fda5f97a0ffb45d757525bb38.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "home-manager": { @@ -61,9 +61,8 @@ }, "nix-hexchen": { "branch": "main", - "ref": "main", "repo": "https://gitlab.com/hexchen/nixfiles", - "rev": "c0cb61737832d3332984b92939eb15e90ed6b8c2", + "rev": "2dfbd032f05ad79176a5756cd76dbda4a828e4d8", "type": "git" }, "nixos-mailserver": { @@ -82,10 +81,10 @@ "homepage": "", "owner": "nixos", "repo": "nixpkgs", - "rev": "93de027ee045d0c1fbf13418fb86d86e6309b962", - "sha256": "0lz73h01pzcgz8l20k1qawk20g7jcjnrppbxf1wvr8fq21dl4bj1", + "rev": "1fe6ed37fd9beb92afe90671c0c2a662a03463dd", + "sha256": "1daa0y3p17shn9gibr321vx8vija6bfsb5zd7h4pxdbbwjkfq8n2", "type": "tarball", - "url": "https://github.com/nixos/nixpkgs/archive/93de027ee045d0c1fbf13418fb86d86e6309b962.tar.gz", + "url": "https://github.com/nixos/nixpkgs/archive/1fe6ed37fd9beb92afe90671c0c2a662a03463dd.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "nixpkgs-mozilla": { @@ -106,16 +105,16 @@ "homepage": "", "owner": "nixos", "repo": "nixpkgs", - "rev": "1fe6ed37fd9beb92afe90671c0c2a662a03463dd", - "sha256": "1daa0y3p17shn9gibr321vx8vija6bfsb5zd7h4pxdbbwjkfq8n2", + "rev": "415db954d8c45ee99bfe5fa18c34e57f9b9cb218", + "sha256": "0rxlx4xkayc5bxlkrm6fprkgicighcbzmgkzn70gqh356v4qimkq", "type": "tarball", - "url": "https://github.com/nixos/nixpkgs/archive/1fe6ed37fd9beb92afe90671c0c2a662a03463dd.tar.gz", + "url": "https://github.com/nixos/nixpkgs/archive/415db954d8c45ee99bfe5fa18c34e57f9b9cb218.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, "pbb-nixfiles": { "branch": "main", "repo": "https://git.petabyte.dev/petabyteboy/nixfiles.git", - "rev": "c3b08fe355d08facf2b2d2f0f96050892242cd38", + "rev": "fbb5aebfcc93383089e1f3d1b1cd07a6d3bab39f", "type": "git" }, "qyliss-nixlib": { @@ -132,10 +131,10 @@ "homepage": null, "owner": "arcnmx", "repo": "tf-nix", - "rev": "f4fe8c91d7048340ac5ff018c70736db4e92ce25", - "sha256": "1qjpj0xwwxhc2qj8ciscqz60x7wgsaw72zza61hckh0qc9xdwx6w", + "rev": "217a0d1c61da95d0cb91c9f52138743d0dfc6e4e", + "sha256": "0fr740nj0c3sldl5f7abrdxlfpr2iz15ghpafmhhrrgvbyh24aq4", "type": "tarball", - "url": "https://github.com/arcnmx/tf-nix/archive/f4fe8c91d7048340ac5ff018c70736db4e92ce25.tar.gz", + "url": "https://github.com/arcnmx/tf-nix/archive/217a0d1c61da95d0cb91c9f52138743d0dfc6e4e.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/nix/sources.nix b/nix/sources.nix index cde012b1..1938409d 100644 --- a/nix/sources.nix +++ b/nix/sources.nix @@ -6,156 +6,162 @@ let # The fetchers. fetch_ fetches specs of 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: name: spec: let - ok = str: !builtins.isNull (builtins.match "[a-zA-Z0-9+-._?=]" str); - # sanitize the name, though nix will still fail if name starts with period - name' = stringAsChars (x: if !ok x then "-" else x) "${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; - }; + 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_local = spec: spec.path; - 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-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 = 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''; + 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 = == ./.; - in if builtins.hasAttr "nixpkgs" sources then - sourcesNixpkgs - else if hasNixpkgsPath && !hasThisAsNixpkgsPath then - import { } - else - abort '' - Please specify either (through -I or NIX_PATH=nixpkgs=...) or - add a package called "nixpkgs" to your sources.json. - ''; + in + if builtins.hasAttr "nixpkgs" sources + then sourcesNixpkgs + else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then + import {} + else + abort + '' + Please specify either (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 + 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 name spec - else if spec.type == "git" then - fetch_git 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 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}"; + 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; + 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; + in + if ersatz == "" then drv else + # this turns the string into an actual Nix path (for both absolute and + # relative paths) + if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; # 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))); + mapAttrs = builtins.mapAttrs or ( + f: set: with builtins; + listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) + ); # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 - range = first: last: - if first > last then - [ ] - else - builtins.genList (n: first + n) (last - first + 1); + range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 - stringToCharacters = s: - map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); + stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); + concatMapStrings = f: list: concatStrings (map f list); concatStrings = builtins.concatStringsSep ""; + # https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 + optionalAttrs = cond: as: if cond then as else {}; + # fetchTarball version that is compatible between all the versions of Nix - builtins_fetchTarball = { url, name, sha256 }@attrs: - let inherit (builtins) lessThan nixVersion fetchTarball; - in if lessThan nixVersion "1.12" then - fetchTarball { inherit name url; } - else - fetchTarball attrs; + builtins_fetchTarball = { url, name ? null, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchTarball; + in + if lessThan nixVersion "1.12" then + fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) + 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; + builtins_fetchurl = { url, name ? null, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchurl; + in + if lessThan nixVersion "1.12" then + fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) + 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 = replace name (fetch config.pkgs name spec); }) - config.sources; + mapAttrs ( + name: spec: + if builtins.hasAttr "outPath" spec + 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 + mkConfig = + { 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; @@ -164,6 +170,5 @@ let inherit pkgs; }; -in mkSources (mkConfig { }) // { - __functor = _: settings: mkSources (mkConfig settings); -} +in +mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }