mirror of
https://github.com/NotAShelf/nvf.git
synced 2026-03-02 23:12:56 +00:00
npins/sources.nix: format
This commit is contained in:
parent
f5d7c1b7c4
commit
c7dddbb387
1 changed files with 168 additions and 183 deletions
|
|
@ -12,16 +12,21 @@ let
|
||||||
# Backwards-compatibly make something that previously didn't take any arguments take some
|
# Backwards-compatibly make something that previously didn't take any arguments take some
|
||||||
# The function must return an attrset, and will unfortunately be eagerly evaluated
|
# The function must return an attrset, and will unfortunately be eagerly evaluated
|
||||||
# Same thing, but it catches eval errors on the default argument so that one may still call it with other arguments
|
# Same thing, but it catches eval errors on the default argument so that one may still call it with other arguments
|
||||||
mkFunctor =
|
mkFunctor = fn: let
|
||||||
fn:
|
|
||||||
let
|
|
||||||
e = builtins.tryEval (fn {});
|
e = builtins.tryEval (fn {});
|
||||||
in
|
in
|
||||||
(if e.success then e.value else { error = fn { }; }) // { __functor = _self: fn; };
|
(
|
||||||
|
if e.success
|
||||||
|
then e.value
|
||||||
|
else {error = fn {};}
|
||||||
|
)
|
||||||
|
// {__functor = _self: fn;};
|
||||||
|
|
||||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
|
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
|
||||||
range =
|
range = first: last:
|
||||||
first: last: if first > last then [ ] else builtins.genList (n: first + n) (last - first + 1);
|
if first > last
|
||||||
|
then []
|
||||||
|
else builtins.genList (n: first + n) (last - first + 1);
|
||||||
|
|
||||||
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
|
# 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));
|
||||||
|
|
@ -33,45 +38,39 @@ let
|
||||||
# If the environment variable NPINS_OVERRIDE_${name} is set, then use
|
# If the environment variable NPINS_OVERRIDE_${name} is set, then use
|
||||||
# the path directly as opposed to the fetched source.
|
# the path directly as opposed to the fetched source.
|
||||||
# (Taken from Niv for compatibility)
|
# (Taken from Niv for compatibility)
|
||||||
mayOverride =
|
mayOverride = name: path: let
|
||||||
name: path:
|
|
||||||
let
|
|
||||||
envVarName = "NPINS_OVERRIDE_${saneName}";
|
envVarName = "NPINS_OVERRIDE_${saneName}";
|
||||||
saneName = stringAsChars (c: if (builtins.match "[a-zA-Z0-9]" c) == null then "_" else c) name;
|
saneName = stringAsChars (c:
|
||||||
|
if (builtins.match "[a-zA-Z0-9]" c) == null
|
||||||
|
then "_"
|
||||||
|
else c)
|
||||||
|
name;
|
||||||
ersatz = builtins.getEnv envVarName;
|
ersatz = builtins.getEnv envVarName;
|
||||||
in
|
in
|
||||||
if ersatz == "" then
|
if ersatz == ""
|
||||||
path
|
then path
|
||||||
else
|
else
|
||||||
# this turns the string into an actual Nix path (for both absolute and
|
# this turns the string into an actual Nix path (for both absolute and
|
||||||
# relative paths)
|
# relative paths)
|
||||||
builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" (
|
builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" (
|
||||||
if builtins.substring 0 1 ersatz == "/" then
|
if builtins.substring 0 1 ersatz == "/"
|
||||||
/. + ersatz
|
then /. + ersatz
|
||||||
else
|
else /. + builtins.getEnv "PWD" + "/${ersatz}"
|
||||||
/. + builtins.getEnv "PWD" + "/${ersatz}"
|
|
||||||
);
|
);
|
||||||
|
|
||||||
mkSource =
|
mkSource = name: spec: {pkgs ? null}:
|
||||||
name: spec:
|
assert spec ? type; let
|
||||||
{
|
|
||||||
pkgs ? null,
|
|
||||||
}:
|
|
||||||
assert spec ? type;
|
|
||||||
let
|
|
||||||
# Unify across builtin and pkgs fetchers.
|
# Unify across builtin and pkgs fetchers.
|
||||||
# `fetchGit` requires a wrapper because of slight API differences.
|
# `fetchGit` requires a wrapper because of slight API differences.
|
||||||
fetchers =
|
fetchers =
|
||||||
if pkgs == null then
|
if pkgs == null
|
||||||
{
|
then {
|
||||||
inherit (builtins) fetchTarball fetchurl;
|
inherit (builtins) fetchTarball fetchurl;
|
||||||
# For some fucking reason, fetchGit has a different signature than the other builtin fetchers …
|
# For some fucking reason, fetchGit has a different signature than the other builtin fetchers …
|
||||||
fetchGit = args: (builtins.fetchGit args).outPath;
|
fetchGit = args: (builtins.fetchGit args).outPath;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
fetchTarball = {
|
||||||
fetchTarball =
|
|
||||||
{
|
|
||||||
url,
|
url,
|
||||||
sha256,
|
sha256,
|
||||||
}:
|
}:
|
||||||
|
|
@ -80,8 +79,7 @@ let
|
||||||
extension = "tar";
|
extension = "tar";
|
||||||
};
|
};
|
||||||
inherit (pkgs) fetchurl;
|
inherit (pkgs) fetchurl;
|
||||||
fetchGit =
|
fetchGit = {
|
||||||
{
|
|
||||||
url,
|
url,
|
||||||
submodules,
|
submodules,
|
||||||
rev,
|
rev,
|
||||||
|
|
@ -97,30 +95,27 @@ let
|
||||||
|
|
||||||
# Dispatch to the correct code path based on the type
|
# Dispatch to the correct code path based on the type
|
||||||
path =
|
path =
|
||||||
if spec.type == "Git" then
|
if spec.type == "Git"
|
||||||
mkGitSource fetchers spec
|
then mkGitSource fetchers spec
|
||||||
else if spec.type == "GitRelease" then
|
else if spec.type == "GitRelease"
|
||||||
mkGitSource fetchers spec
|
then mkGitSource fetchers spec
|
||||||
else if spec.type == "PyPi" then
|
else if spec.type == "PyPi"
|
||||||
mkPyPiSource fetchers spec
|
then mkPyPiSource fetchers spec
|
||||||
else if spec.type == "Channel" then
|
else if spec.type == "Channel"
|
||||||
mkChannelSource fetchers spec
|
then mkChannelSource fetchers spec
|
||||||
else if spec.type == "Tarball" then
|
else if spec.type == "Tarball"
|
||||||
mkTarballSource fetchers spec
|
then mkTarballSource fetchers spec
|
||||||
else if spec.type == "Container" then
|
else if spec.type == "Container"
|
||||||
mkContainerSource pkgs spec
|
then mkContainerSource pkgs spec
|
||||||
else
|
else builtins.throw "Unknown source type ${spec.type}";
|
||||||
builtins.throw "Unknown source type ${spec.type}";
|
|
||||||
in
|
in
|
||||||
spec // {outPath = mayOverride name path;};
|
spec // {outPath = mayOverride name path;};
|
||||||
|
|
||||||
mkGitSource =
|
mkGitSource = {
|
||||||
{
|
|
||||||
fetchTarball,
|
fetchTarball,
|
||||||
fetchGit,
|
fetchGit,
|
||||||
...
|
...
|
||||||
}:
|
}: {
|
||||||
{
|
|
||||||
repository,
|
repository,
|
||||||
revision,
|
revision,
|
||||||
url ? null,
|
url ? null,
|
||||||
|
|
@ -131,34 +126,37 @@ let
|
||||||
assert repository ? type;
|
assert repository ? type;
|
||||||
# At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
|
# At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository
|
||||||
# In the latter case, there we will always be an url to the tarball
|
# In the latter case, there we will always be an url to the tarball
|
||||||
if url != null && !submodules then
|
if url != null && !submodules
|
||||||
|
then
|
||||||
fetchTarball {
|
fetchTarball {
|
||||||
inherit url;
|
inherit url;
|
||||||
sha256 = hash;
|
sha256 = hash;
|
||||||
}
|
}
|
||||||
else
|
else let
|
||||||
let
|
|
||||||
url =
|
url =
|
||||||
if repository.type == "Git" then
|
if repository.type == "Git"
|
||||||
repository.url
|
then repository.url
|
||||||
else if repository.type == "GitHub" then
|
else if repository.type == "GitHub"
|
||||||
"https://github.com/${repository.owner}/${repository.repo}.git"
|
then "https://github.com/${repository.owner}/${repository.repo}.git"
|
||||||
else if repository.type == "GitLab" then
|
else if repository.type == "GitLab"
|
||||||
"${repository.server}/${repository.repo_path}.git"
|
then "${repository.server}/${repository.repo_path}.git"
|
||||||
else if repository.type == "Forgejo" then
|
else if repository.type == "Forgejo"
|
||||||
"${repository.server}/${repository.owner}/${repository.repo}.git"
|
then "${repository.server}/${repository.owner}/${repository.repo}.git"
|
||||||
else
|
else throw "Unrecognized repository type ${repository.type}";
|
||||||
throw "Unrecognized repository type ${repository.type}";
|
urlToName = url: rev: let
|
||||||
urlToName =
|
|
||||||
url: rev:
|
|
||||||
let
|
|
||||||
matched = builtins.match "^.*/([^/]*)(\\.git)?$" url;
|
matched = builtins.match "^.*/([^/]*)(\\.git)?$" url;
|
||||||
|
|
||||||
short = builtins.substring 0 7 rev;
|
short = builtins.substring 0 7 rev;
|
||||||
|
|
||||||
appendShort = if (builtins.match "[a-f0-9]*" rev) != null then "-${short}" else "";
|
appendShort =
|
||||||
in
|
if (builtins.match "[a-f0-9]*" rev) != null
|
||||||
"${if matched == null then "source" else builtins.head matched}${appendShort}";
|
then "-${short}"
|
||||||
|
else "";
|
||||||
|
in "${
|
||||||
|
if matched == null
|
||||||
|
then "source"
|
||||||
|
else builtins.head matched
|
||||||
|
}${appendShort}";
|
||||||
name = urlToName url revision;
|
name = urlToName url revision;
|
||||||
in
|
in
|
||||||
fetchGit {
|
fetchGit {
|
||||||
|
|
@ -168,9 +166,7 @@ let
|
||||||
inherit name submodules url;
|
inherit name submodules url;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkPyPiSource =
|
mkPyPiSource = {fetchurl, ...}: {
|
||||||
{ fetchurl, ... }:
|
|
||||||
{
|
|
||||||
url,
|
url,
|
||||||
hash,
|
hash,
|
||||||
...
|
...
|
||||||
|
|
@ -180,9 +176,7 @@ let
|
||||||
sha256 = hash;
|
sha256 = hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkChannelSource =
|
mkChannelSource = {fetchTarball, ...}: {
|
||||||
{ fetchTarball, ... }:
|
|
||||||
{
|
|
||||||
url,
|
url,
|
||||||
hash,
|
hash,
|
||||||
...
|
...
|
||||||
|
|
@ -192,9 +186,7 @@ let
|
||||||
sha256 = hash;
|
sha256 = hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkTarballSource =
|
mkTarballSource = {fetchTarball, ...}: {
|
||||||
{ fetchTarball, ... }:
|
|
||||||
{
|
|
||||||
url,
|
url,
|
||||||
locked_url ? url,
|
locked_url ? url,
|
||||||
hash,
|
hash,
|
||||||
|
|
@ -205,16 +197,14 @@ let
|
||||||
sha256 = hash;
|
sha256 = hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkContainerSource =
|
mkContainerSource = pkgs: {
|
||||||
pkgs:
|
|
||||||
{
|
|
||||||
image_name,
|
image_name,
|
||||||
image_tag,
|
image_tag,
|
||||||
image_digest,
|
image_digest,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
if pkgs == null then
|
if pkgs == null
|
||||||
builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers"
|
then builtins.throw "container sources require passing in a Nixpkgs value: https://github.com/andir/npins/blob/master/README.md#using-the-nixpkgs-fetchers"
|
||||||
else
|
else
|
||||||
pkgs.dockerTools.pullImage {
|
pkgs.dockerTools.pullImage {
|
||||||
imageName = image_name;
|
imageName = image_name;
|
||||||
|
|
@ -223,27 +213,22 @@ let
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
mkFunctor (
|
mkFunctor (
|
||||||
{
|
{input ? ./sources.json}: let
|
||||||
input ? ./sources.json,
|
|
||||||
}:
|
|
||||||
let
|
|
||||||
data =
|
data =
|
||||||
if builtins.isPath input then
|
if builtins.isPath input
|
||||||
|
then
|
||||||
# while `readFile` will throw an error anyways if the path doesn't exist,
|
# while `readFile` will throw an error anyways if the path doesn't exist,
|
||||||
# we still need to check beforehand because *our* error can be caught but not the one from the builtin
|
# we still need to check beforehand because *our* error can be caught but not the one from the builtin
|
||||||
# *piegames sighs*
|
# *piegames sighs*
|
||||||
if builtins.pathExists input then
|
if builtins.pathExists input
|
||||||
builtins.fromJSON (builtins.readFile input)
|
then builtins.fromJSON (builtins.readFile input)
|
||||||
else
|
else throw "Input path ${toString input} does not exist"
|
||||||
throw "Input path ${toString input} does not exist"
|
else if builtins.isAttrs input
|
||||||
else if builtins.isAttrs input then
|
then input
|
||||||
input
|
else throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset";
|
||||||
else
|
|
||||||
throw "Unsupported input type ${builtins.typeOf input}, must be a path or an attrset";
|
|
||||||
version = data.version;
|
version = data.version;
|
||||||
in
|
in
|
||||||
if version == 7 then
|
if version == 7
|
||||||
builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins
|
then builtins.mapAttrs (name: spec: mkFunctor (mkSource name spec)) data.pins
|
||||||
else
|
else throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
|
||||||
throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`"
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue