diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..78290c2 --- /dev/null +++ b/flake.lock @@ -0,0 +1,137 @@ +{ + "nodes": { + "fenix": { + "inputs": { + "nixpkgs": [ + "naersk", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1752475459, + "narHash": "sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "bf0d6f70f4c9a9cf8845f992105652173f4b617f", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "index": { + "flake": false, + "locked": { + "lastModified": 1772876513, + "narHash": "sha256-o/J9jCCQHqEz2wnKeC9hgES/bdHL8b7RvHVF5wNyRBA=", + "owner": "rust-lang", + "repo": "crates.io-index", + "rev": "2a0f009bb63a4f26534af79c2f035c26bb032d6c", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "repo": "crates.io-index", + "type": "github" + } + }, + "naersk": { + "inputs": { + "fenix": "fenix", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1769799857, + "narHash": "sha256-88IFXZ7Sa1vxbz5pty0Io5qEaMQMMUPMonLa3Ls/ss4=", + "owner": "nix-community", + "repo": "naersk", + "rev": "9d4ed44d8b8cecdceb1d6fd76e74123d90ae6339", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "naersk", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1772736753, + "narHash": "sha256-au/m3+EuBLoSzWUCb64a/MZq6QUtOV8oC0D9tY2scPQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "917fec990948658ef1ccd07cef2a1ef060786846", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "index": "index", + "naersk": "naersk", + "nixpkgs": "nixpkgs", + "utils": "utils" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1752428706, + "narHash": "sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu+QEnJn2Sfg=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "591e3b7624be97e4443ea7b5542c191311aa141d", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 36d5a42..a3a79c2 100644 --- a/flake.nix +++ b/flake.nix @@ -13,12 +13,24 @@ }; }; - outputs = { self, nixpkgs, utils, naersk, index }: + outputs = + { + self, + nixpkgs, + utils, + naersk, + index, + }: let crate = self.lib.crate "bat"; pname = crate.latest.name; - forPkgs = pkgs: - rec { + filterAttrs = + pred: set: + builtins.removeAttrs set (builtins.filter (name: !pred name set.${name}) (builtins.attrNames set)); + forPkgs = pkgs: rec { + packages = pkgs.lib.mapAttrs ( + _name: versions: pkgs.lib.mapAttrs (_v: attrs: attrs.build { inherit pkgs; }) versions + ) self.lib.crates_io; # # `nix build` # packages.${pname} = crate.latest.package { inherit pkgs; }; @@ -27,35 +39,143 @@ # drv = packages.${pname}; # }; # defaultApp = apps.${pname}; - }; + }; forSystem = system: forPkgs nixpkgs.legacyPackages."${system}"; in - (utils.lib.eachDefaultSystem forSystem) // { + (utils.lib.eachDefaultSystem forSystem) + // rec { + overlays.default = final: prev: { + crates_io = final.lib.mapAttrs ( + _: value: + final.lib.mapAttrs ( + _version: attrs: + attrs + // { + src = lib.crateTarball attrs; + build = attrs.build { pkgs = final; }; + } + ) value + ) lib.crates_io; + }; lib = rec { config = builtins.fromJSON (builtins.readFile "${index}/config.json"); - crate = name: + buildCrate = + meta: + extra@{ pkgs, ... }: + let + naersk-lib = naersk.lib."${pkgs.system}"; + in + naersk-lib.buildPackage ( + (removeAttrs extra [ "pkgs" ]) + // { + root = pkgs.runCommandLocal "unpack-${meta.name}" { } '' + mkdir -p $out + tar xzvf ${crateTarball meta} -C $out --strip-components=1 + ''; + } + ); + crateTarball = + { + name, + vers, + cksum, + ... + }: + let + url = "${config.dl}/${name}/${vers}/download"; + in + builtins.fetchurl { + inherit url; + sha256 = cksum; + }; + crate = + name: let dbg = val: builtins.trace val val; strlen = builtins.stringLength; substr = builtins.substring; - path = if strlen name < 4 then "${toString (strlen name)}/${substr 0 1 name}/${name}" else "${substr 0 2 name}/${substr 2 2 name}/${name}"; - build = meta: extra @ { pkgs, ... }: - let naersk-lib = naersk.lib."${pkgs.system}"; in - naersk-lib.buildPackage ((builtins.removeAttrs extra [ "pkgs" ]) // { - root = pkgs.runCommandLocal "unpack-${name}" {} '' - mkdir -p $out - tar xzvf ${meta.tarball} -C $out --strip-components=1 - ''; - }); - versions = builtins.foldl' - (p: i: - let meta = i // rec { url = "${config.dl}/${name}/${i.vers}/download"; package = build meta; tarball = builtins.fetchurl { inherit url; sha256 = i.cksum; }; }; in - p // { latest = meta; "${i.vers}" = meta; } - ) - { } - (map builtins.fromJSON (builtins.filter (s: builtins.isString s && strlen s > 0) (builtins.split "\n" (builtins.readFile "${index}/${path}")))); + path = + if strlen name < 4 then + "${toString (strlen name)}/${substr 0 1 name}/${name}" + else + "${substr 0 2 name}/${substr 2 2 name}/${name}"; + versions = + builtins.foldl' + ( + p: i: + let + meta = i // rec { + url = "${config.dl}/${name}/${i.vers}/download"; + package = buildCrate meta; + tarball = crateTarball meta; + }; + in + p + // { + latest = meta; + "${i.vers}" = meta; + } + ) + { } + ( + map builtins.fromJSON ( + builtins.filter (s: builtins.isString s && strlen s > 0) ( + builtins.split "\n" (builtins.readFile "${index}/${path}") + ) + ) + ); in versions; + crates_io = + let + traverse = + path: levels: + let + entries = (builtins.readDir path); + filterTy = t: builtins.attrNames (filterAttrs (_: ty: ty == t) entries); + dirs = filterTy "directory"; + crateDirs = builtins.filter (dir: (builtins.substring 0 1 dir) != ".") dirs; + files = filterTy "regular"; + in + if levels == 0 then + map (name: "${path}/${name}") files + else + builtins.concatLists (map (dir: traverse "${path}/${dir}" (levels - 1)) crateDirs); + cratePaths = traverse "${index}" 2; + crateVersions = + path: + let + meta = builtins.readFile path; + metaLines = builtins.split "\n" meta; + versionsLines = builtins.filter (l: builtins.isString l && builtins.stringLength l > 10) metaLines; + versionsMeta = map builtins.fromJSON versionsLines; + versions = map ( + meta: + let + inherit (meta) vers; + in + { + name = vers; + value = meta // { + build = lib.buildCrate meta; + }; + } + ) versionsMeta; + in + ( + (builtins.listToAttrs versions) + // { + "latest" = (builtins.elemAt versions (builtins.length versions - 1)).value; + } + ); + crateNames = map baseNameOf cratePaths; + in + builtins.listToAttrs ( + map (path: { + name = baseNameOf (builtins.unsafeDiscardStringContext path); + value = crateVersions path; + }) cratePaths + ); }; };