summary refs log tree commit diff
path: root/pkgs/stdenv/generic/setup.sh
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-06-30 13:48:29 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-08-09 12:44:49 +0200
commit3e33c975fb850e903feaac4925b8e267493a6205 (patch)
tree16ba401594cfc09d15fee55c5ac3201b0da56021 /pkgs/stdenv/generic/setup.sh
parent1a44dbbbb900acb993fc68995fc3cfb50e5122ba (diff)
downloadnixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar.gz
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar.bz2
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar.lz
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar.xz
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.tar.zst
nixlib-3e33c975fb850e903feaac4925b8e267493a6205.zip
stdenv: Make unpackFile extensible via the hook mechanism
unpackCmd is now a regular hook, so there can be multiple functions
hooking into it.
Diffstat (limited to 'pkgs/stdenv/generic/setup.sh')
-rw-r--r--pkgs/stdenv/generic/setup.sh49
1 files changed, 33 insertions, 16 deletions
diff --git a/pkgs/stdenv/generic/setup.sh b/pkgs/stdenv/generic/setup.sh
index c3ebc3e9b5f0..9a756fd47235 100644
--- a/pkgs/stdenv/generic/setup.sh
+++ b/pkgs/stdenv/generic/setup.sh
@@ -23,25 +23,41 @@ runHook() {
     local hookName="$1"
     local var="_${hookName}_hooks"
     eval "local -a dummy=(\"\${_${hookName}_hooks[@]}\")"
-    for hook in "runSingleHook $hookName" "${dummy[@]}"; do
+    for hook in "_callImplicitHook 0 $hookName" "${dummy[@]}"; do
         if ! _eval "$hook"; then return 1; fi
     done
     return 0
 }
 
 
+# Run all hooks with the specified name, until one succeeds (returns a
+# zero exit code). If none succeed, return a non-zero exit code.
+runOneHook() {
+    local hookName="$1"
+    local var="_${hookName}_hooks"
+    eval "local -a dummy=(\"\${_${hookName}_hooks[@]}\")"
+    for hook in "_callImplicitHook 1 $hookName" "${dummy[@]}"; do
+        if _eval "$hook"; then
+            return 0
+        fi
+    done
+    return 1
+}
+
+
 # Run the named hook, either by calling the function with that name or
 # by evaluating the variable with that name. This allows convenient
 # setting of hooks both from Nix expressions (as attributes /
 # environment variables) and from shell scripts (as functions). If you
 # want to allow multiple hooks, use runHook instead.
-runSingleHook() {
-    local hookName="$1"
+_callImplicitHook() {
+    local def="$1"
+    local hookName="$2"
     case "$(type -t $hookName)" in
         (function|alias|builtin) $hookName;;
         (file) source $hookName;;
         (keyword) :;;
-        (*) eval "${!hookName}";;
+        (*) if [ -z "${!hookName}" ]; then return "$def"; else eval "${!hookName}"; fi;;
     esac
 }
 
@@ -469,12 +485,8 @@ stripHash() {
 }
 
 
-unpackFile() {
-    curSrc="$1"
-    local cmd
-
-    header "unpacking source archive $curSrc" 3
-
+addHook unpackCmd _defaultUnpack
+_defaultUnpack() {
     if [ -d "$curSrc" ]; then
 
         stripHash $curSrc
@@ -496,16 +508,21 @@ unpackFile() {
                 unzip -qq $curSrc
                 ;;
             *)
-                if [ -z "$unpackCmd" ]; then
-                    echo "source archive $curSrc has unknown type"
-                    exit 1
-                fi
-                runSingleHook unpackCmd
+                return 1
                 ;;
         esac
 
     fi
+}
+
 
+unpackFile() {
+    curSrc="$1"
+    header "unpacking source archive $curSrc" 3
+    if ! runOneHook unpackCmd; then
+        echo "do not know how to unpack source archive $curSrc"
+        exit 1
+    fi
     stopNest
 }
 
@@ -539,7 +556,7 @@ unpackPhase() {
 
     # Find the source directory.
     if [ -n "$setSourceRoot" ]; then
-        runSingleHook setSourceRoot
+        runOneHook setSourceRoot
     elif [ -z "$sourceRoot" ]; then
         sourceRoot=
         for i in *; do