meta: add vsed function

This commit is contained in:
maxice8 2019-01-13 03:25:44 -02:00 committed by maxice8
parent 96dd717aaa
commit 673504e524
2 changed files with 55 additions and 0 deletions

View File

@ -314,6 +314,16 @@ The following functions are defined by `xbps-src` and can be used on any templat
For further information on how to create a new service directory see
[The corresponding section the FAQ](http://smarden.org/runit/faq.html#create).
- *vsed()* `vsed -i <file> -e <regex>`
Wrapper around sed that checks sha256sum of a file before and after running
the sed command to detect cases in which the sed call didn't change anything.
Takes any arbitrary amount of files and regexes by calling `-i file` and
`-e regex` repeatedly, at least one file and one regex must be specified.
Note that vsed will call the sed command for every regex specified against
every file specified, in the order that they are given.
> Shell wildcards must be properly quoted, Example: `vmove "usr/lib/*.a"`.
<a id="global_vars"></a>

View File

@ -0,0 +1,45 @@
# 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
while getopts ":i:e:" opt; do
case $opt in
i) files+=("$OPTARG") ;;
e) regexes+=("$OPTARG") ;;
*) ;;
esac
done
if [ ${#files[@]} -eq 0 ]; then
msg_red "$pkgver: vsed: no files specified with -i.\n"
return 1
fi
if [ ${#regexes[@]} -eq 0 ]; then
msg_red "$pkgver: vsed: no regexes specified with -e.\n"
return 1
fi
for rx in "${regexes[@]}"; do
for f in "${files[@]}"; do
shasums="$(sha256sum "$f" 2>/dev/null | awk '{print $1}')"
sed -i "$f" -e "$rx" || {
msg_red "$pkgver: vsed: sed call failed with regex \"$rx\" on file \"$f\"\n"
return 1
}
sha256sum="$(sha256sum "$f" 2>/dev/null)"
if [ "$shasums" = "${sha256sum%% *}" ]; then
msg_warn "$pkgver: vsed: regex \"$rx\" didn't change file \"$f\"\n"
fi
done
done
}