all
This commit is contained in:
137
flake.lock
generated
Normal file
137
flake.lock
generated
Normal 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
165
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,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
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user