void-packages/common/environment/setup/vsed.sh

72 lines
1.5 KiB
Bash
Raw Normal View History

2019-01-13 06:25:44 +01:00
# Helper function for calling sed on files and checking if the
# file is actually changed
#
# NOTE: this will not check if the input is valid, you can problably
# make it execute arbirtrary commands via passing '; cmd' to a vsed
# call.
vsed() {
local files=() regexes=() OPTIND OPTSTRING="ie:" has_inline=
2019-01-13 06:25:44 +01:00
eval set -- "$(getopt -s bash "$OPTSTRING" "$@")";
while getopts "$OPTSTRING" opt; do
2019-01-13 06:25:44 +01:00
case $opt in
i) has_inline=1 ;;
2019-01-13 06:25:44 +01:00
e) regexes+=("$OPTARG") ;;
*) ;;
esac
done
if ! [ "$has_inline" ]; then
msg_red "$pkgver: vsed: you must specify -i.\n"
2019-01-13 06:25:44 +01:00
return 1
fi
shift $(($OPTIND - 1))
if [ ${#regexes[@]} -eq 0 ] && [ $# -ge 2 ]; then
regexes+=("$1")
shift
fi
2019-01-13 06:25:44 +01:00
if [ ${#regexes[@]} -eq 0 ]; then
msg_red "$pkgver: vsed: no regexes specified.\n"
return 1
fi
for i; do
files+=("$i")
done
if [ ${#files[@]} -eq 0 ]; then
msg_red "$pkgver: vsed: no files specified.\n"
2019-01-13 06:25:44 +01:00
return 1
fi
for f in "${files[@]}"; do
olddigest="$($XBPS_DIGEST_CMD "$f")"
olddigest="${olddigest%% *}"
2019-01-13 06:25:44 +01:00
for rx in "${regexes[@]}"; do
2019-01-13 06:25:44 +01:00
sed -i "$f" -e "$rx" || {
msg_red "$pkgver: vsed: sed call failed with regex \"$rx\" on file \"$f\"\n"
return 1
}
newdigest="$($XBPS_DIGEST_CMD "$f")"
newdigest="${newdigest%% *}"
2019-01-13 06:25:44 +01:00
2022-03-09 22:12:40 +01:00
msgfunc=msg_warn
if [ -n "$XBPS_STRICT" ]; then
msgfunc=msg_error
fi
if [ "$olddigest" = "$newdigest" ]; then
2022-03-09 22:12:40 +01:00
$msgfunc "$pkgver: vsed: regex \"$rx\" didn't change file \"$f\"\n"
2019-01-13 06:25:44 +01:00
fi
olddigest="${newdigest}"
2019-01-13 06:25:44 +01:00
done
done
}