about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/modules/programs/command-not-found/command-not-found.nix6
-rw-r--r--nixos/modules/programs/command-not-found/command-not-found.pl3
-rw-r--r--pkgs/shells/fish/command-not-found.patch13
-rw-r--r--pkgs/shells/fish/default.nix2
4 files changed, 21 insertions, 3 deletions
diff --git a/nixos/modules/programs/command-not-found/command-not-found.nix b/nixos/modules/programs/command-not-found/command-not-found.nix
index 9524d91ea3bc..9741aa7ca539 100644
--- a/nixos/modules/programs/command-not-found/command-not-found.nix
+++ b/nixos/modules/programs/command-not-found/command-not-found.nix
@@ -16,7 +16,7 @@ let
     isExecutable = true;
     inherit (pkgs) perl;
     perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
-      [ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite ]);
+      [ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]);
   };
 
 in
@@ -30,7 +30,7 @@ in
         local p=/run/current-system/sw/bin/command-not-found
         if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then
           # Run the helper program.
-          $p "$1"
+          $p "$@"
           # Retry the command if we just installed it.
           if [ $? = 126 ]; then
             "$@"
@@ -51,7 +51,7 @@ in
         local p=/run/current-system/sw/bin/command-not-found
         if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then
           # Run the helper program.
-          $p "$1"
+          $p "$@"
 
           # Retry the command if we just installed it.
           if [ $? = 126 ]; then
diff --git a/nixos/modules/programs/command-not-found/command-not-found.pl b/nixos/modules/programs/command-not-found/command-not-found.pl
index b233d973a4ab..5bdda26592e6 100644
--- a/nixos/modules/programs/command-not-found/command-not-found.pl
+++ b/nixos/modules/programs/command-not-found/command-not-found.pl
@@ -3,6 +3,7 @@
 use strict;
 use DBI;
 use DBD::SQLite;
+use String::ShellQuote;
 use Config;
 
 my $program = $ARGV[0];
@@ -31,6 +32,8 @@ the package ‘$package’, which I will now install for you.
 EOF
         ;
         exit 126 if system("nix-env", "-iA", "nixos.$package") == 0;
+    } elsif ($ENV{"NIX_AUTO_RUN"} // "") {
+        exec("nix-shell", "-p", $package, "--run", shell_quote("exec", @ARGV));
     } else {
         print STDERR <<EOF;
 The program ‘$program’ is currently not installed. You can install it by typing:
diff --git a/pkgs/shells/fish/command-not-found.patch b/pkgs/shells/fish/command-not-found.patch
new file mode 100644
index 000000000000..aaca001dcb67
--- /dev/null
+++ b/pkgs/shells/fish/command-not-found.patch
@@ -0,0 +1,13 @@
+diff --git a/share/functions/__fish_config_interactive.fish b/share/functions/__fish_config_interactive.fish
+index c3864a8..a12ac4d 100644
+--- a/share/functions/__fish_config_interactive.fish
++++ b/share/functions/__fish_config_interactive.fish
+@@ -230,7 +230,7 @@ function __fish_config_interactive -d "Initializations that should be performed
+ 		# Check for NixOS handler
+ 		else if test -f /run/current-system/sw/bin/command-not-found
+ 			function __fish_command_not_found_handler --on-event fish_command_not_found
+-				/run/current-system/sw/bin/command-not-found $argv[1]
++				/run/current-system/sw/bin/command-not-found $argv
+ 			end
+ 		# Ubuntu Feisty places this command in the regular path instead
+ 		else if type -q -p command-not-found
diff --git a/pkgs/shells/fish/default.nix b/pkgs/shells/fish/default.nix
index ef3794d5144c..c2fcfa3e7c18 100644
--- a/pkgs/shells/fish/default.nix
+++ b/pkgs/shells/fish/default.nix
@@ -4,6 +4,8 @@ stdenv.mkDerivation rec {
   name = "fish-${version}";
   version = "2.2.0";
 
+  patches = [ ./command-not-found.patch ];
+
   src = fetchurl {
     url = "http://fishshell.com/files/${version}/${name}.tar.gz";
     sha256 = "0ympqz7llmf0hafxwglykplw6j5cz82yhlrw50lw4bnf2kykjqx7";