From fcfe2618d50b39e8991685dc2f42f1495951da7e Mon Sep 17 00:00:00 2001
From: Michael Kuhn <suraia@ikkoku.de>
Date: Wed, 13 Jul 2016 20:33:14 +0200
Subject: [PATCH] Improve shell integration.

Enable sh emulation for Zsh and allow loading modules recursively.
---
 share/spack/setup-env.sh | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh
index 8aa259cf15..c5245add5e 100755
--- a/share/spack/setup-env.sh
+++ b/share/spack/setup-env.sh
@@ -57,6 +57,11 @@
 ########################################################################
 
 function spack {
+    # Zsh does not do word splitting by default, this enables it for this function only
+    if [ -n "$ZSH_VERSION" ]; then
+        emulate -L sh
+    fi
+
     # save raw arguments into an array before butchering them
     args=( "$@" )
 
@@ -93,11 +98,18 @@ function spack {
             ;;
         "use"|"unuse"|"load"|"unload")
             # Shift any other args for use off before parsing spec.
+            _sp_subcommand_args=""
             _sp_module_args=""
-            if [[ "$1" =~ ^- ]]; then
-                _sp_module_args="$1"; shift
-                _sp_spec="$@"
-            fi
+            while [[ "$1" =~ ^- ]]; do
+                if [ "$1" = "-r" ]; then
+                    _sp_subcommand_args="$_sp_subcommand_args $1"
+                else
+                    _sp_module_args="$_sp_module_args $1"
+                fi
+                shift
+            done
+
+            _sp_spec="$@"
 
             # Here the user has run use or unuse with a spec.  Find a matching
             # spec using 'spack module find', then use the appropriate module
@@ -105,19 +117,19 @@ function spack {
             # If spack module command comes back with an error, do nothing.
             case $_sp_subcommand in
                 "use")
-                    if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
+                    if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args dotkit $_sp_spec); then
                         use $_sp_module_args $_sp_full_spec
                     fi ;;
                 "unuse")
-                    if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
+                    if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args dotkit $_sp_spec); then
                         unuse $_sp_module_args $_sp_full_spec
                     fi ;;
                 "load")
-                    if _sp_full_spec=$(command spack $_sp_flags module find tcl $_sp_spec); then
+                    if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args tcl $_sp_spec); then
                         module load $_sp_module_args $_sp_full_spec
                     fi ;;
                 "unload")
-                    if _sp_full_spec=$(command spack $_sp_flags module find tcl $_sp_spec); then
+                    if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args tcl $_sp_spec); then
                         module unload $_sp_module_args $_sp_full_spec
                     fi ;;
             esac
-- 
GitLab