2024-12-11 09:42:06 +01:00
|
|
|
{
|
|
|
|
|
lib,
|
|
|
|
|
fetchurl,
|
|
|
|
|
fetchzip,
|
|
|
|
|
stdenv,
|
|
|
|
|
}:
|
|
|
|
|
with builtins;
|
|
|
|
|
with lib;
|
|
|
|
|
let
|
|
|
|
|
SEPARATOR = "/--/";
|
|
|
|
|
|
|
|
|
|
fetchPluginSrc =
|
|
|
|
|
{ url, hash }:
|
|
|
|
|
let
|
|
|
|
|
isJar = hasSuffix ".jar" url;
|
|
|
|
|
fetcher = if isJar then fetchurl else fetchzip;
|
|
|
|
|
in
|
|
|
|
|
fetcher {
|
|
|
|
|
executable = isJar;
|
|
|
|
|
inherit url hash;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
downloadPlugin =
|
|
|
|
|
{
|
|
|
|
|
name,
|
|
|
|
|
version,
|
|
|
|
|
url,
|
|
|
|
|
hash,
|
|
|
|
|
}:
|
|
|
|
|
let
|
|
|
|
|
isJar = hasSuffix ".jar" url;
|
|
|
|
|
installPhase =
|
|
|
|
|
if isJar then
|
|
|
|
|
''
|
|
|
|
|
runHook preInstall
|
|
|
|
|
mkdir -p $out && cp $src $out
|
|
|
|
|
runHook postInstall
|
|
|
|
|
''
|
|
|
|
|
else
|
|
|
|
|
''
|
|
|
|
|
runHook preInstall
|
|
|
|
|
mkdir -p $out && cp -r . $out
|
|
|
|
|
runHook postInstall
|
|
|
|
|
'';
|
|
|
|
|
in
|
|
|
|
|
stdenv.mkDerivation {
|
|
|
|
|
inherit name version;
|
|
|
|
|
src = fetchPluginSrc { inherit url hash; };
|
|
|
|
|
dontUnpack = isJar;
|
|
|
|
|
inherit installPhase;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
readGeneratedDir = attrNames (
|
|
|
|
|
filterAttrs (name: _: hasSuffix ".json" name) (readDir ./generated/ides)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
# Folds into the set of { IDENAME = { VERSION = [ x y ]; }; }
|
|
|
|
|
buildIdeVersionMap = (
|
|
|
|
|
accu: value:
|
|
|
|
|
accu
|
|
|
|
|
// {
|
|
|
|
|
"${value.version}" = (accu."${value.version}" or { }) // value.value;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
# Find and construct plugin from a list of plugins
|
|
|
|
|
findPlugin =
|
|
|
|
|
pluginList: name: version:
|
|
|
|
|
let
|
|
|
|
|
key = "${name}${SEPARATOR}${version}";
|
|
|
|
|
match = pluginList."${key}";
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
inherit name version;
|
2025-01-03 16:07:10 +03:00
|
|
|
url = "http://kafpi.local/${match.p}";
|
2024-12-11 09:42:06 +01:00
|
|
|
hash = "sha256-${match.h}";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
allPlugins = fromJSON (readFile ./generated/all_plugins.json);
|
|
|
|
|
in
|
|
|
|
|
(groupBy' buildIdeVersionMap { } (x: x.ideName) (
|
|
|
|
|
map (
|
|
|
|
|
jsonFile:
|
|
|
|
|
let
|
|
|
|
|
# Split the JSON filename into IDENAME-VERSION and remove json suffix
|
|
|
|
|
parts = splitString "-" (removeSuffix ".json" jsonFile);
|
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
ideName = concatStrings (intersperse "-" (init parts));
|
|
|
|
|
version = elemAt parts ((length parts) - 1);
|
|
|
|
|
value = mapAttrs (k: v: downloadPlugin (findPlugin allPlugins k v)) (
|
|
|
|
|
fromJSON (readFile (./generated/ides + "/${jsonFile}"))
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
) readGeneratedDir
|
|
|
|
|
))
|