summaryrefslogtreecommitdiff
path: root/wrappers/shadow-strip.sh
diff options
context:
space:
mode:
Diffstat (limited to 'wrappers/shadow-strip.sh')
-rwxr-xr-xwrappers/shadow-strip.sh195
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