fb05a239d2
Introduces __brp_mangle_shebangs_exclude_from and __brp_mangle_shebangs_exclude * the first allows to explude specific paths from the mangling * the second allows to exlude specific shebangs Both are used with `grep -E`. Similar escaping rules as in [1] apply. [1] https://fedoraproject.org/wiki/Packaging:AutoProvidesAndRequiresFiltering
71 lines
1.9 KiB
Bash
Executable File
71 lines
1.9 KiB
Bash
Executable File
#!/bin/sh -eu
|
|
|
|
# If using normal root, avoid changing anything.
|
|
if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
exclude_files="${1:-}"
|
|
exclude_shebangs="${2:-}"
|
|
|
|
cd "$RPM_BUILD_ROOT"
|
|
|
|
trim() {
|
|
printf '%s' "$*"
|
|
}
|
|
|
|
fail=0
|
|
for f in $(find -executable -type f | xargs --no-run-if-empty file -N --mime-type | grep -Po "^\K.+(?=: text/)"); do
|
|
|
|
# Remove the dot
|
|
path="${f#.}"
|
|
|
|
if [ -n "$exclude_files" ]; then
|
|
echo "$path" | grep -q -E "$exclude_files" && continue
|
|
fi
|
|
|
|
ts=$(stat -c %y "$f")
|
|
|
|
read orig_shebang < "$f" || :
|
|
shebang=$(trim $(echo "$orig_shebang" | grep -Po "#!\K.*" || echo))
|
|
if [ -n "$exclude_shebangs" ]; then
|
|
echo "$shebang" | grep -q -E "$exclude_shebangs" && continue
|
|
fi
|
|
|
|
if [ -z "$shebang" ]; then
|
|
echo >&2 "*** WARNING: $f is executable but has empty or no shebang, removing executable bit"
|
|
chmod -x "$f"
|
|
touch -d "$ts" "$f"
|
|
continue
|
|
elif [ -n "${shebang##/*}" ]; then
|
|
echo >&2 "*** ERROR: $f has shebang which doesn't start with '/' ($shebang)"
|
|
fail=1
|
|
continue
|
|
fi
|
|
|
|
if ! { echo "$shebang" | grep -q -P "^/(?:usr/)?(?:bin|sbin)/"; }; then
|
|
continue
|
|
fi
|
|
|
|
# Replace "special" env shebang:
|
|
# /whatsoever/env /whatever/foo → /whatever/foo
|
|
shebang=$(echo "$shebang" | sed -r -e 's@^(.+)/env /(.+)$@/\2@')
|
|
# /whatsoever/env foo → /whatsoever/foo
|
|
shebang=$(echo "$shebang" | sed -r -e 's@^(.+/)env (.+)$@\1\2@')
|
|
|
|
# Replace ambiguous python with python2
|
|
py_shebang=$(echo "$shebang" | sed -r -e 's@/usr/bin/python(\s|$)@/usr/bin/python2\1@')
|
|
|
|
if [ "$shebang" != "$py_shebang" ]; then
|
|
sed -i -e "1c #!$py_shebang" "$f"
|
|
echo >&2 "*** WARNING: mangling shebang in $path from $orig_shebang to #!$py_shebang. This will become an ERROR, fix it manually!"
|
|
elif [ "#!$shebang" != "$orig_shebang" ]; then
|
|
sed -i -e "1c #!$shebang" "$f"
|
|
echo "mangling shebang in $path from $orig_shebang to #!$shebang"
|
|
fi
|
|
|
|
touch -d "$ts" "$f"
|
|
done
|
|
|
|
exit $fail
|