Skip to content

Commit

Permalink
jetbrains.plugins: format rfc style
Browse files Browse the repository at this point in the history
  • Loading branch information
thiagokokada committed Feb 24, 2025
1 parent a14f0ad commit 9a4f097
Showing 1 changed file with 87 additions and 79 deletions.
166 changes: 87 additions & 79 deletions pkgs/applications/editors/jetbrains/plugins/default.nix
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
{ fetchurl
, fetchzip
, lib
, stdenv
, callPackage
, autoPatchelfHook
, glib
, darwin
{
fetchurl,
fetchzip,
lib,
stdenv,
callPackage,
autoPatchelfHook,
glib,
darwin,
}:

let
pluginsJson = builtins.fromJSON (builtins.readFile ./plugins.json);
specialPluginsInfo = callPackage ./specialPlugins.nix { };
fetchPluginSrc = url: hash:
fetchPluginSrc =
url: hash:
let
isJar = lib.hasSuffix ".jar" url;
fetcher = if isJar then fetchurl else fetchzip;
Expand All @@ -23,21 +25,26 @@ let
files = builtins.mapAttrs (key: value: fetchPluginSrc key value) pluginsJson.files;
ids = builtins.attrNames pluginsJson.plugins;

mkPlugin = id: file:
if !specialPluginsInfo ? "${id}"
then files."${file}"
mkPlugin =
id: file:
if !specialPluginsInfo ? "${id}" then
files."${file}"
else
stdenv.mkDerivation ({
name = "jetbrains-plugin-${id}";
installPhase = ''
runHook preInstall
mkdir -p $out && cp -r . $out
runHook postInstall
'';
src = files."${file}";
} // specialPluginsInfo."${id}");

selectFile = id: ide: build:
stdenv.mkDerivation (
{
name = "jetbrains-plugin-${id}";
installPhase = ''
runHook preInstall
mkdir -p $out && cp -r . $out
runHook postInstall
'';
src = files."${file}";
}
// specialPluginsInfo."${id}"
);

selectFile =
id: ide: build:
if !builtins.elem ide pluginsJson.plugins."${id}".compatible then
throw "Plugin with id ${id} does not support IDE ${ide}"
else if !pluginsJson.plugins."${id}".builds ? "${build}" then
Expand All @@ -47,40 +54,41 @@ let
else
pluginsJson.plugins."${id}".builds."${build}";

byId = builtins.listToAttrs
(map
(id: {
name = id;
value = ide: build: mkPlugin id (selectFile id ide build);
})
ids);

byName = builtins.listToAttrs
(map
(id: {
name = pluginsJson.plugins."${id}".name;
value = byId."${id}";
})
ids);


in {
byId = builtins.listToAttrs (
map (id: {
name = id;
value = ide: build: mkPlugin id (selectFile id ide build);
}) ids
);

byName = builtins.listToAttrs (
map (id: {
name = pluginsJson.plugins."${id}".name;
value = byId."${id}";
}) ids
);
in
{
# Only use if you know what youre doing
raw = { inherit files byId byName; };

tests = callPackage ./tests.nix {};
tests = callPackage ./tests.nix { };

addPlugins = ide: unprocessedPlugins:
addPlugins =
ide: unprocessedPlugins:
let

processPlugin = plugin:
if lib.isDerivation plugin then plugin else
if byId ? "${plugin}" then byId."${plugin}" ide.pname ide.buildNumber else
if byName ? "${plugin}" then byName."${plugin}" ide.pname ide.buildNumber else
throw "Could not resolve plugin ${plugin}";
processPlugin =
plugin:
if lib.isDerivation plugin then
plugin
else if byId ? "${plugin}" then
byId."${plugin}" ide.pname ide.buildNumber
else if byName ? "${plugin}" then
byName."${plugin}" ide.pname ide.buildNumber
else
throw "Could not resolve plugin ${plugin}";

plugins = map processPlugin unprocessedPlugins;

in
stdenv.mkDerivation rec {
pname = meta.mainProgram + "-with-plugins";
Expand All @@ -102,36 +110,36 @@ in {
inherit (ide) meta;

buildPhase =
let
appDir = lib.optionalString stdenv.hostPlatform.isDarwin "Applications/${lib.escapeShellArg ide.product}.app";
rootDir = if stdenv.hostPlatform.isDarwin then "${appDir}/Contents" else meta.mainProgram;
in
''
cp -r ${ide} $out
chmod +w -R $out
rm -f $out/${rootDir}/plugins/plugin-classpath.txt
IFS=' ' read -ra pluginArray <<< "$newPlugins"
for plugin in "''${pluginArray[@]}"
do
pluginfiles=$(ls $plugin);
if [ $(echo $pluginfiles | wc -l) -eq 1 ] && echo $pluginfiles | grep -E "\.jar" 1> /dev/null; then
# if the plugin contains a single jar file, link it directly into the plugins folder
ln -s "$plugin/$(echo $pluginfiles | head -1)" $out/${rootDir}/plugins/
else
# otherwise link the plugin directory itself
ln -s "$plugin" -t $out/${rootDir}/plugins/
fi
done
sed "s|${ide.outPath}|$out|" \
-i $(realpath $out/bin/${meta.mainProgram})
if test -f "$out/bin/${meta.mainProgram}-remote-dev-server"; then
let
appDir = lib.optionalString stdenv.hostPlatform.isDarwin "Applications/${lib.escapeShellArg ide.product}.app";
rootDir = if stdenv.hostPlatform.isDarwin then "${appDir}/Contents" else meta.mainProgram;
in
''
cp -r ${ide} $out
chmod +w -R $out
rm -f $out/${rootDir}/plugins/plugin-classpath.txt
IFS=' ' read -ra pluginArray <<< "$newPlugins"
for plugin in "''${pluginArray[@]}"; do
pluginfiles=$(ls $plugin);
if [ $(echo $pluginfiles | wc -l) -eq 1 ] && echo $pluginfiles | grep -E "\.jar" 1> /dev/null; then
# if the plugin contains a single jar file, link it directly into the plugins folder
ln -s "$plugin/$(echo $pluginfiles | head -1)" $out/${rootDir}/plugins/
else
# otherwise link the plugin directory itself
ln -s "$plugin" -t $out/${rootDir}/plugins/
fi
done
sed "s|${ide.outPath}|$out|" \
-i $(realpath $out/bin/${meta.mainProgram}-remote-dev-server)
fi
-i $(realpath $out/bin/${meta.mainProgram})
'' + lib.optionalString stdenv.hostPlatform.isLinux ''
autoPatchelf $out
'';
if [[ -f "$out/bin/${meta.mainProgram}-remote-dev-server" ]]; then
sed "s|${ide.outPath}|$out|" \
-i $(realpath $out/bin/${meta.mainProgram}-remote-dev-server)
fi
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
autoPatchelf $out
'';
};
}

0 comments on commit 9a4f097

Please sign in to comment.