d70672d92b
This should be a little bit more efficient, but also more readable.
159 lines
3.8 KiB
Nix
159 lines
3.8 KiB
Nix
lib: self:
|
|
|
|
let
|
|
inherit (lib) elemAt;
|
|
|
|
matchForgeRepo = builtins.match "(.+)/(.+)";
|
|
|
|
fetchers = lib.mapAttrs (_: fetcher: self.callPackage fetcher { }) {
|
|
github =
|
|
{ fetchFromGitHub }:
|
|
{
|
|
repo ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
let
|
|
m = matchForgeRepo repo;
|
|
in
|
|
assert m != null;
|
|
fetchFromGitHub {
|
|
owner = elemAt m 0;
|
|
repo = elemAt m 1;
|
|
rev = commit;
|
|
inherit sha256;
|
|
};
|
|
|
|
gitlab =
|
|
{ fetchFromGitLab }:
|
|
{
|
|
repo ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
let
|
|
m = matchForgeRepo repo;
|
|
in
|
|
assert m != null;
|
|
fetchFromGitLab {
|
|
owner = elemAt m 0;
|
|
repo = elemAt m 1;
|
|
rev = commit;
|
|
inherit sha256;
|
|
};
|
|
|
|
git = (
|
|
{ fetchgit }:
|
|
{
|
|
url ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
(fetchgit {
|
|
rev = commit;
|
|
inherit sha256 url;
|
|
}).overrideAttrs(_: {
|
|
GIT_SSL_NO_VERIFY = true;
|
|
})
|
|
);
|
|
|
|
bitbucket =
|
|
{ fetchhg }:
|
|
{
|
|
repo ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
fetchhg {
|
|
rev = commit;
|
|
url = "https://bitbucket.com/${repo}";
|
|
inherit sha256;
|
|
};
|
|
|
|
hg =
|
|
{ fetchhg }:
|
|
{
|
|
url ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
fetchhg {
|
|
rev = commit;
|
|
inherit sha256 url;
|
|
};
|
|
|
|
sourcehut =
|
|
{ fetchzip }:
|
|
{
|
|
repo ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
fetchzip {
|
|
url = "https://git.sr.ht/~${repo}/archive/${commit}.tar.gz";
|
|
inherit sha256;
|
|
};
|
|
|
|
codeberg =
|
|
{ fetchzip }:
|
|
{
|
|
repo ? null,
|
|
...
|
|
}:
|
|
{ sha256, commit, ... }:
|
|
fetchzip {
|
|
url = "https://codeberg.org/${repo}/archive/${commit}.tar.gz";
|
|
inherit sha256;
|
|
};
|
|
};
|
|
|
|
in {
|
|
|
|
melpaDerivation = variant:
|
|
{ ename, fetcher
|
|
, commit ? null
|
|
, sha256 ? null
|
|
, ... }@args:
|
|
let
|
|
sourceArgs = args.${variant};
|
|
version = sourceArgs.version or null;
|
|
deps = sourceArgs.deps or null;
|
|
error = sourceArgs.error or args.error or null;
|
|
hasSource = lib.hasAttr variant args;
|
|
pname = builtins.replaceStrings [ "@" ] [ "at" ] ename;
|
|
broken = error != null;
|
|
in
|
|
if hasSource then
|
|
lib.nameValuePair ename (
|
|
self.callPackage ({ melpaBuild, fetchurl, ... }@pkgargs:
|
|
melpaBuild {
|
|
inherit pname ename;
|
|
inherit (sourceArgs) commit;
|
|
version = lib.optionalString (version != null)
|
|
(lib.concatStringsSep "." (map toString
|
|
# Hack: Melpa archives contains versions with parse errors such as [ 4 4 -4 413 ] which should be 4.4-413
|
|
# This filter method is still technically wrong, but it's computationally cheap enough and tapers over the issue
|
|
(builtins.filter (n: n >= 0) version)));
|
|
# TODO: Broken should not result in src being null (hack to avoid eval errors)
|
|
src = if (sha256 == null || broken) then null else
|
|
fetchers.${fetcher} args sourceArgs;
|
|
recipe = if commit == null then null else
|
|
fetchurl {
|
|
name = pname + "-recipe";
|
|
url = "https://raw.githubusercontent.com/melpa/melpa/${commit}/recipes/${ename}";
|
|
inherit sha256;
|
|
};
|
|
packageRequires = lib.optionals (deps != null)
|
|
(map (dep: pkgargs.${dep} or self.${dep} or null)
|
|
deps);
|
|
meta = (sourceArgs.meta or {}) // {
|
|
inherit broken;
|
|
};
|
|
}
|
|
) {}
|
|
)
|
|
else
|
|
null;
|
|
|
|
}
|