diff options
Diffstat (limited to 'wrappers/shadow-strip.sh')
-rwxr-xr-x | wrappers/shadow-strip.sh | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/wrappers/shadow-strip.sh b/wrappers/shadow-strip.sh new file mode 100755 index 00000000..3ff7d831 --- /dev/null +++ b/wrappers/shadow-strip.sh @@ -0,0 +1,195 @@ +#!/bin/bash + +set -euf -o pipefail + +top="#TOP#" +shadow_top="#SHADOW_TOP#" + +orig_strip="#ORIG_TOOL#" +shadow_strip="#SHADOW_TOOL#" + +errors=() +warnings=() +skips=() + +orig_out=() +shadow_out=() +orig_input=() +shadow_input=() +orig_opts=() +shadow_opts=() + +dump_log () +{ + ( + set +u + IFS=";" + cat <<EOF +errors=(${errors[@]}) +warnings=(${warnings[@]}) +skips=(${skips[@]}) +orig_out=(${orig_out[@]}) +shadow_out=(${shadow_out[@]}) +orig_input=(${orig_input[@]}) +shadow_input=(${shadow_input[@]}) +orig_opts=($0 ${orig_opts[@]}) +shadow_opts=(${shadow_opts[@]}) + +EOF + ) +} + +report_errors () { + res=$? + if [ $res != 0 ]; then + errors+=("wrapper failed with $res") + fi + if [ ${#errors[@]} != 0 ] \ + || [ ${#warnings[@]} != 0 ] \ + || [ ${#skips[@]} != 0 ]; then + ( + $HOME/bin/myflock -e 9 + + if [ ${#errors[@]} != 0 ]; then + log=$shadow_top.errors + elif [ ${#warnings[@]} != 0 ]; then + log=$shadow_top.warnings + else + log=$shadow_top.skips + fi + dump_log >>$log + ) 9>>$shadow_top.lock + fi +} + +trap report_errors EXIT + +while [ "$#" -gt 0 ]; do + opt="$1" + shift + + orig_opts+=("$opt") + + case "$opt" in + + "-o") + if [ "$#" -gt 0 ]; then + orig_out=("$1" "${orig_out[@]}") + orig_opts+=("$1") + shift + else + errors+=("$opt with no argument") + fi + ;; + + "-i") + if [ "$#" -gt 0 ]; then + orig_input=("$1" "${orig_input[@]}") + orig_opts+=("$1") + shift + else + errors+=("$opt with no argument") + fi + ;; + + "-d") + if [ "$#" -gt 0 ]; then + orig_opts+=("$1") + shift + else + errors+=("$opt with no argument") + fi + ;; + + "-"*) + ;; + esac +done + +print_shadow_path () +{ + local path="$1" + local prefix="${2-}" + + case "$path" in + "/dev/null") echo "$path"; return ;; + "/"*) errors+=("Absolute path: $path") ;; + esac + + # Check that we are under $top + case "$(pwd -P | sed -e "s#^$top##")" in + "/"*) errors+=("Running outside of $top") ;; + esac + + echo "$(pwd -P)/$path" | sed -e "s#$top#$shadow_top${prefix}#" +} + +make_shadow_opts () +{ + local opt + + while [ "$#" -gt 0 ]; do + opt="$1" + shift + + case "$opt" in + "-o") + shadow_opts+=("$opt") + opt=$(print_shadow_path "$1") + shadow_out+=("$opt") + shift + ;; + + "-i") + shadow_opts+=("$opt") + opt=$(print_shadow_path "$1") + shadow_input+=("$opt") + shift + ;; + + "-d") + shadow_opts+=("$opt") + opt="/dev/null" + shift + ;; + esac + shadow_opts+=("$opt") + done +} + +if [ -e "${shadow_input[*]}" ] \ + && [ ${#errors[@]} = 0 ] && [ ${#skips[@]} = 0 ]; then + make_shadow_opts "${orig_opts[@]}" +fi + +if [ -e "${shadow_input[*]}" ] \ + && [ ${#errors[@]} = 0 ] && [ ${#skips[@]} = 0 ]; then + shadow_log=$(print_shadow_path "${orig_out[*]}" "-logs") + + mkdir -p "$(dirname "${shadow_out[*]}")" + mkdir -p "$(dirname "$shadow_log")" + + dump_log > "$shadow_log" + echo "$shadow_strip" "${shadow_opts[@]}" >> "$shadow_log" + "$shadow_strip" "${shadow_opts[@]}" >> "$shadow_log" 2>&1 & + shadow_res=0 && wait $! || shadow_res=$? + + if [ $shadow_res != 0 ]; then + errors+=("shadow_strip failed with $shadow_res") + elif ! [ -e "${shadow_out[*]}" ]; then + errors+=("shadow_strip failed to generate output") + else + shadow_link=$(IFS=""; print_shadow_path "${orig_out[*]}" "-default-A") + mkdir -p "$(dirname "$shadow_link")" + ln -s -f "${shadow_out[*]}" "$shadow_link" + fi +fi + +"$orig_strip" "${orig_opts[@]}" & +orig_res=0 && wait $! || orig_res=$? + +if [ $orig_res != 0 ]; then + errors+=("orig_strip failed with $orig_res") +fi + +exit $orig_res |