about summary refs log tree commit diff
path: root/pkgs/shells
diff options
context:
space:
mode:
authorpacien <pacien.trangirard@pacien.net>2020-12-28 21:14:26 +0100
committerpacien <pacien.trangirard@pacien.net>2021-01-04 18:51:11 +0100
commitc083b27791daabbee7c4d67f5315ff5c877f1076 (patch)
tree9337dc4732ed1c008c441411b3cfe71628ad6f31 /pkgs/shells
parentbf77245202a01e542a38ba74a8800b80070eb28f (diff)
fishPlugins: bootstrap fish plugin scope
Diffstat (limited to 'pkgs/shells')
-rw-r--r--pkgs/shells/fish/plugins/build-fish-plugin.nix77
-rw-r--r--pkgs/shells/fish/plugins/default.nix7
2 files changed, 84 insertions, 0 deletions
diff --git a/pkgs/shells/fish/plugins/build-fish-plugin.nix b/pkgs/shells/fish/plugins/build-fish-plugin.nix
new file mode 100644
index 0000000000000..e2ec342e54407
--- /dev/null
+++ b/pkgs/shells/fish/plugins/build-fish-plugin.nix
@@ -0,0 +1,77 @@
+{ stdenv, lib, writeShellScriptBin, writeScript, fish }:
+
+let
+  rtpPath = "share/fish";
+
+  mapToFuncPath = v:
+    if lib.isString v
+    then v
+    else "${v}/${rtpPath}/vendor_functions.d";
+
+  fishWithFunctionPath = plugins: let
+    funcPaths = map mapToFuncPath plugins;
+  in writeShellScriptBin "fish" ''
+    ${fish}/bin/fish \
+      --init-command \
+        "set --prepend fish_function_path ${lib.escapeShellArgs funcPaths}" \
+      "$@"
+  '';
+
+in attrs@{
+  pname,
+  version,
+  src,
+
+  name ? "fishplugin-${pname}-${version}",
+  unpackPhase ? "",
+  configurePhase ? ":",
+  buildPhase ? ":",
+  preInstall ? "",
+  postInstall ? "",
+  # name of the subdirectory in which to store the plugin
+  installPath ? lib.getName pname,
+
+  checkInputs ? [],
+  # plugins or paths to add to the function path of the test fish shell
+  checkFunctionPath ? [],
+  # test script to be executed in a fish shell
+  checkPhase ? "",
+  doCheck ? checkPhase != "",
+
+  ...
+}:
+
+stdenv.mkDerivation (attrs // {
+  inherit name;
+  inherit unpackPhase configurePhase buildPhase;
+
+  inherit preInstall postInstall;
+  installPhase = ''
+    runHook preInstall
+
+    (
+      install_vendor_files() {
+        source="$1"
+        target="$out/${rtpPath}/vendor_$2.d"
+
+        [ -d $source ] || return 0
+        mkdir -p $target
+        cp -r $source/*.fish "$target/"
+      }
+
+      install_vendor_files completions completions
+      install_vendor_files functions functions
+      install_vendor_files conf conf
+      install_vendor_files conf.d conf
+    )
+
+    runHook postInstall
+  '';
+
+  inherit doCheck;
+  checkInputs = [ (fishWithFunctionPath checkFunctionPath) ] ++ checkInputs;
+  checkPhase = ''
+    export HOME=$(mktemp -d)  # fish wants a writable home
+    fish "${writeScript "${name}-test" checkPhase}"
+  '';
+})
diff --git a/pkgs/shells/fish/plugins/default.nix b/pkgs/shells/fish/plugins/default.nix
new file mode 100644
index 0000000000000..95bf6504bbed0
--- /dev/null
+++ b/pkgs/shells/fish/plugins/default.nix
@@ -0,0 +1,7 @@
+{ lib, newScope }:
+
+lib.makeScope newScope (self: with self; {
+
+  buildFishPlugin = callPackage ./build-fish-plugin.nix { };
+
+})