This commit is contained in:
Marvin Drescher
2026-03-07 10:42:03 +01:00
parent 861954d88a
commit b7153b9509
2 changed files with 280 additions and 22 deletions

137
flake.lock generated Normal file
View File

@@ -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
}

165
flake.nix
View File

@@ -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,144 @@
# 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;
src = crateTarball 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
);
};
};