Antidote/local_pod_repo/objcTox/run-uncrustify.sh
2024-02-22 21:43:11 +02:00

90 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# set uncrustify path or executable
# UNCRUSTIFY="/usr/bin/uncrustify"
UNCRUSTIFY="uncrustify"
while [[ $# > 0 ]]
do
key="$1"
case $key in
--check)
CHECK=true
;;
--apply)
APPLY=true
;;
--create-patch)
CREATEPATCH=true
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
if [ "$CHECK" = true ] ; then
OPTIONS="--check"
elif [ "$APPLY" = true ] ; then
OPTIONS="--no-backup"
elif [ "$CREATEPATCH" = true ] ; then
OPTIONS=""
else
>&2 echo "Please specify either --check, --apply or --create-patch"
exit 1
fi
if ! command -v "$UNCRUSTIFY" > /dev/null ; then
>&2 echo "Error: uncrustify executable not found.\n"
>&2 echo "Set the correct path in $UNCRUSTIFY.\n"
exit 1
fi
FILES="$(find {Classes,Tests,iOSDemo,iOSDemoTests,OSXDemo,OSXDemoTests} -name '*.h' -or -name '*.m')"
if [ "$CHECK" = true ] || [ "$APPLY" = true ]; then
$UNCRUSTIFY -c uncrustify.cfg -l OC $OPTIONS $FILES
exit $?
fi
# Create patch
prefix="run-uncrustify"
suffix="$(date +%C%y-%m-%d_%Hh%Mm%Ss)"
patch="/tmp/$prefix-$suffix.patch"
for file in $FILES; do
# escape special characters in the source filename:
# - '\': backslash needs to be escaped
# - '*': used as matching string => '*' would mean expansion
# (curiously, '?' must not be escaped)
# - '[': used as matching string => '[' would mean start of set
# - '|': used as sed split char instead of '/', so it needs to be escaped
# in the filename
# printf %s particularly important if the filename contains the % character
file_escaped_source=$(printf "%s" "$file" | sed -e 's/[\*[|]/\\&/g')
# escape special characters in the target filename:
# phase 1 (characters escaped in the output diff):
# - '\': backslash needs to be escaped in the output diff
# - '"': quote needs to be escaped in the output diff if present inside
# of the filename, as it used to bracket the entire filename part
# phase 2 (characters escaped in the match replacement):
# - '\': backslash needs to be escaped again for sed itself
# (i.e. double escaping after phase 1)
# - '&': would expand to matched string
# - '|': used as sed split char instead of '/'
# printf %s particularly important if the filename contains the % character
file_escaped_target=$(printf "%s" "$file" | sed -e 's/[\"]/\\&/g' -e 's/[\&|]/\\&/g')
$UNCRUSTIFY -q -c uncrustify.cfg -l OC $OPTIONS -f "$file" | \
diff -u -- "$file" - | \
sed -e "1s|--- $file_escaped_source|--- \"a/$file_escaped_target\"|" -e "2s|+++ -|+++ \"b/$file_escaped_target\"|" >> "$patch"
done
echo "$patch"