top-level-wip
Hung 2023-02-14 01:56:48 -07:00
parent bf22c75270
commit ed84a5a871
4 changed files with 109 additions and 98 deletions

201
c_.nix
View File

@ -1,100 +1,111 @@
# a small helper that only builds on top of builtins functions # a small helper that only builds on top of builtins functions
{src}@inputs: _: (builtins // (
builtins // (let let
formatSecondsSinceEpoch = t: formatSecondsSinceEpoch = t:
let let
rem = x: y: x - x / y * y; rem = x: y: x - x / y * y;
days = t / 86400; days = t / 86400;
secondsInDay = rem t 86400; secondsInDay = rem t 86400;
hours = secondsInDay / 3600; hours = secondsInDay / 3600;
minutes = (rem secondsInDay 3600) / 60; minutes = (rem secondsInDay 3600) / 60;
seconds = rem t 60; seconds = rem t 60;
# Courtesy of https://stackoverflow.com/a/32158604. # Courtesy of https://stackoverflow.com/a/32158604.
z = days + 719468; z = days + 719468;
era = (if z >= 0 then z else z - 146096) / 146097; era = (if z >= 0 then z else z - 146096) / 146097;
doe = z - era * 146097; doe = z - era * 146097;
yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
y = yoe + era * 400; y = yoe + era * 400;
doy = doe - (365 * yoe + yoe / 4 - yoe / 100); doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
mp = (5 * doy + 2) / 153; mp = (5 * doy + 2) / 153;
d = doy - (153 * mp + 2) / 5 + 1; d = doy - (153 * mp + 2) / 5 + 1;
m = mp + (if mp < 10 then 3 else -9); m = mp + (if mp < 10 then 3 else -9);
y' = y + (if m <= 2 then 1 else 0); y' = y + (if m <= 2 then 1 else 0);
pad = s: if builtins.stringLength s < 2 then "0" + s else s; pad = s: if builtins.stringLength s < 2 then "0" + s else s;
in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}" in
+ "${pad (toString minutes)}${pad (toString seconds)}"; "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}"
+ "${pad (toString minutes)}${pad (toString seconds)}";
fetchTree = fetchTree =
# this is the value of flake.lock#lock.nodes.${input_name}.locked # this is the value of flake.lock#lock.nodes.${input_name}.locked
{type { type
, host? "" , host ? ""
, owner? "" , owner ? ""
, repo? "" , repo ? ""
, rev? "" , rev ? ""
, submodules? "" , submodules ? ""
, path? "" , path ? ""
, narHash? null , narHash ? null
, lastModified? 0 , lastModified ? 0
}@info: , src ? ./.
if info.type == "github" then }@info:
{ outPath = if info.type == "github" then
fetchTarball {
({ url = "https://api.${info.host or "github.com"}/repos/" outPath =
+ "${info.owner}/${info.repo}/tarball/${info.rev}"; } fetchTarball
// (if info ? narHash then { sha256 = info.narHash; } else {}) ({
); url = "https://api.${info.host or "github.com"}/repos/"
rev = info.rev; + "${info.owner}/${info.repo}/tarball/${info.rev}";
shortRev = builtins.substring 0 7 info.rev; }
lastModified = info.lastModified; // (if info ? narHash then { sha256 = info.narHash; } else { })
lastModifiedDate = formatSecondsSinceEpoch info.lastModified; );
narHash = info.narHash; rev = info.rev;
} shortRev = builtins.substring 0 7 info.rev;
else if info.type == "git" then lastModified = info.lastModified;
{ outPath = lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
builtins.fetchGit narHash = info.narHash;
({ url = info.url; } }
// (if info ? rev then { inherit (info) rev; } else {}) else if info.type == "git" then
// (if info ? ref then { inherit (info) ref; } else {}) {
// (if info ? submodules then { inherit (info) submodules; } else {}) outPath =
); builtins.fetchGit
lastModified = info.lastModified; ({ url = info.url; }
lastModifiedDate = formatSecondsSinceEpoch info.lastModified; // (if info ? rev then { inherit (info) rev; } else { })
narHash = info.narHash; // (if info ? ref then { inherit (info) ref; } else { })
} // (if info ? rev then { // (if info ? submodules then { inherit (info) submodules; } else { })
rev = info.rev; );
shortRev = builtins.substring 0 7 info.rev; lastModified = info.lastModified;
} else { lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
}) narHash = info.narHash;
else if info.type == "path" then } // (if info ? rev then {
{ outPath = builtins.path { rev = info.rev;
path = if builtins.substring 0 1 info.path != "/" shortRev = builtins.substring 0 7 info.rev;
then src + ("/" + info.path) # make this absolute path by prepending ./ } else { })
else info.path; # it's already an absolute path else if info.type == "path" then
}; {
narHash = info.narHash; outPath = builtins.path {
} path =
else if info.type == "tarball" then if builtins.substring 0 1 info.path != "/"
{ outPath = then src + ("/" + info.path) # make this absolute path by prepending ./
fetchTarball else info.path; # it's already an absolute path
({ inherit (info) url; } };
// (if info ? narHash then { sha256 = info.narHash; } else {}) narHash = info.narHash;
); }
} else if info.type == "tarball" then
else if info.type == "gitlab" then {
{ inherit (info) rev narHash lastModified; outPath =
outPath = fetchTarball
fetchTarball ({ inherit (info) url; }
({ url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; } // (if info ? narHash then { sha256 = info.narHash; } else { })
// (if info ? narHash then { sha256 = info.narHash; } else {}) );
); }
shortRev = builtins.substring 0 7 info.rev; else if info.type == "gitlab" then
} {
else inherit (info) rev narHash lastModified;
# FIXME: add Mercurial, tarball inputs. outPath =
throw "flake input has unsupported input type '${info.type}'"; fetchTarball
in { ({ url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; }
inherit fetchTree; // (if info ? narHash then { sha256 = info.narHash; } else { })
}) );
shortRev = builtins.substring 0 7 info.rev;
}
else
# FIXME: add Mercurial, tarball inputs.
throw "flake input has unsupported input type '${info.type}'";
in
{
inherit fetchTree;
}
)) nil

View File

@ -3,7 +3,7 @@
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
c_ = import ./c_.nix {src = ./.;}; c_ = import ./c_.nix;
in in
c_.fetchTree lock.nodes.flake-compat.locked c_.fetchTree lock.nodes.flake-compat.locked
) )

View File

@ -3,7 +3,7 @@
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
c_ = import ./../../c_.nix {src = ./.;}; c_ = import ./../../c_.nix;
in in
c_.fetchTree lock.nodes.flake-compat.locked c_.fetchTree lock.nodes.flake-compat.locked
) )

View File

@ -5,7 +5,7 @@
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in (import ./c_.nix {src = ./.;}).fetchTree lock.nodes.flake-compat.locked in (import ./c_.nix).fetchTree lock.nodes.flake-compat.locked
) )
{ src = ./.; } { src = ./.; }
).shellNix ).shellNix