about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/shells/fish/plugins/build-fish-plugin.nix77
-rw-r--r--pkgs/shells/fish/plugins/default.nix7
-rw-r--r--pkgs/top-level/all-packages.nix2
3 files changed, 86 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 { };
+
+})
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 97a3bf3a330aa..55a327dab5a50 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -8839,6 +8839,8 @@ in
 
   fish = callPackage ../shells/fish { };
 
+  fishPlugins = recurseIntoAttrs (callPackage ../shells/fish/plugins { });
+
   fish-foreign-env = callPackage ../shells/fish/fish-foreign-env { };
 
   ion = callPackage ../shells/ion {