about summary refs log tree commit diff
path: root/pkgs/profpatsch/execline/e.nix
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2021-07-27 12:05:49 +0200
committerProfpatsch <mail@profpatsch.de>2021-07-27 12:10:13 +0200
commit5a616c02b1b419eaeae0b608ec2a3c2398eec42f (patch)
tree1a4cc6f5b775f63b2bfa9de84cc7cc4ed6b0e0b8 /pkgs/profpatsch/execline/e.nix
parenta2ad923b121f54c2fd7bcbc0109c4bcf615259c8 (diff)
pkgs/profpatsch/e: fix by rewriting in rust and execing into block
calling `execlineb -c` has unfortunate quoting issues, cause for
cornercases like arguments that contain spaces or `"` the result would
be a completely broken command line.

Instead, let’s do our own block construction in a small rust
program (for speed). I tried implementing it in bash first but even
prepending spaces to a string is a complete waste of time in that
language.
Diffstat (limited to 'pkgs/profpatsch/execline/e.nix')
-rw-r--r--pkgs/profpatsch/execline/e.nix18
1 files changed, 4 insertions, 14 deletions
diff --git a/pkgs/profpatsch/execline/e.nix b/pkgs/profpatsch/execline/e.nix
index 90b235a4..4c569bcd 100644
--- a/pkgs/profpatsch/execline/e.nix
+++ b/pkgs/profpatsch/execline/e.nix
@@ -1,4 +1,4 @@
-{ writeExecline, getBins, pkgs }:
+{ writeExecline, getBins, pkgs, writeRustSimple }:
 let
 
   bins = getBins pkgs.rlwrap [ "rlwrap" ]
@@ -28,20 +28,10 @@ let
     if [ $# -eq 0 ]; then
       ${shell}
     else
-      cmd=
-      # substitute "[" and "]" to execline’s "{" and "}"
-      for arg in "$@"; do
-        if [ "$arg" = "[" ]; then
-          cmd="$cmd {"
-        else if [ "$arg" = "]" ]; then
-          cmd="$cmd }"
-        else
-          cmd="$cmd $arg"
-        fi; fi
-      done
-      # call execlineb with the arguments as script
-      ${bins.execlineb} -Pc "$cmd"
+      export EXECLINE_STRICT=2
+      ${run-cmd-line-block} "$@"
     fi
   '';
 
+  run-cmd-line-block = writeRustSimple "run-cmd-line-block" {} ./run-cmd-line-block.rs;
 in { inherit e; }