bbce69f036
For a vsed call to `nf' files and `nr' regex, the old code will make `2 * nf * nr' digest calls. the new code will make `nf * (nr + 1)' digest calls. Refereance: https://github.com/void-linux/void-packages/issues/11238
66 lines
1.4 KiB
Bash
66 lines
1.4 KiB
Bash
# 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=
|
|
|
|
eval set -- $(getopt -s bash "$OPTSTRING" "$@");
|
|
|
|
while getopts "$OPTSTRING" opt; do
|
|
case $opt in
|
|
i) has_inline=1 ;;
|
|
e) regexes+=("$OPTARG") ;;
|
|
*) ;;
|
|
esac
|
|
done
|
|
|
|
if ! [ "$has_inline" ]; then
|
|
msg_red "$pkgver: vsed: you must specify -i.\n"
|
|
return 1
|
|
fi
|
|
|
|
shift $(($OPTIND - 1))
|
|
|
|
if [ ${#regexes[@]} -eq 0 ] && [ $# -ge 2 ]; then
|
|
regexes+=("$1")
|
|
shift
|
|
fi
|
|
|
|
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"
|
|
return 1
|
|
fi
|
|
|
|
for f in "${files[@]}"; do
|
|
olddigest="$($XBPS_DIGEST_CMD "$f")"
|
|
olddigest="${olddigest%% *}"
|
|
|
|
for rx in "${regexes[@]}"; do
|
|
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%% *}"
|
|
|
|
if [ "$olddigest" = "$newdigest" ]; then
|
|
msg_warn "$pkgver: vsed: regex \"$rx\" didn't change file \"$f\"\n"
|
|
fi
|
|
olddigest="${newdigest}"
|
|
done
|
|
done
|
|
}
|