--- alpm_hook.orig 2017-04-14 17:55:07.046086325 +0200 +++ alpm-hook 2017-04-14 18:05:45.313148820 +0200 @@ -41,44 +41,46 @@ # handle actions on module addition/upgrade/removal # $1: module name # $2: module version -# $3: dkms action parse_module() { pushd "$install_tree" >/dev/null local path for path in */build/; do local kver="${path%%/*}" - dkms_register "$1" "$2" "$kver" "$3" + dkms_register "$1" "$2" "$kver" done popd >/dev/null } # handle actions on kernel addition/upgrade/removal # $1: kernel version -# $2: dkms action parse_kernel() { local path for path in "$source_tree"/*-*/dkms.conf; do if [[ -f "$path" && "$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then - dkms_register "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "$1" "$2" + dkms_register "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "$1" fi done } # register a dkms call # this function suppress echo call for a module -# $1: module name, $2: module version, $3: kernel version, $4: action +# $1: module name, $2: module version, $3: kernel version dkms_register() { - DKMS_ACTION["$1/$2/$3"]="$4" + DKMS_ACTION+=("$1/$2/$3") } # run registered dkms commands dkms_run() { - local nvk mod kver - for nvk in "${!DKMS_ACTION[@]}"; do + local actions nvk mod kver + set -f + IFS=$'\n' actions=($(sort <<<"${DKMS_ACTION[*]}")) + unset IFS + set +f + for nvk in "${actions[@]}"; do mod=${nvk%/*} kver=${nvk##*/} check_kernel "$kver" || continue - run dkms "${DKMS_ACTION[$nvk]}" "$mod" -k "$kver" + run dkms "$ACTION" "$mod" -k "$kver" done } @@ -113,15 +115,18 @@ fi done + # Store action to perform + ACTION="$1" + # Storage for DKMS action to run - declare -A DKMS_ACTION + declare -a DKMS_ACTION # parse stdin paths to guess what do do while read -r path; do if [[ "/$path" =~ ^$source_tree/([^/]+)-([^/]+)/dkms\.conf$ ]]; then - parse_module "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "$@" + parse_module "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" elif [[ "/$path" =~ ^$install_tree/([^/]+)/ ]]; then - parse_kernel "${BASH_REMATCH[1]}" "$@" + parse_kernel "${BASH_REMATCH[1]}" fi done