update-source-version: escape special characters when replacing url

URLs can contain characters that sed would consider special in the context of the regex pattern.

Let’s switch the URL replacement `sed` command to use POSIX Basic Regular Expression syntax to reduce the number of characters that need to be escaped:
https://www.gnu.org/software/sed/manual/html_node/BRE-syntax.html

Then, let’s escape all BRE special characters, plus the separator character `|` of the `s` command in the old URL pattern.

Similarly, the replacement part of the `s` command (new URL) can also contain special characters (e.g. the `&` character would be replaced with the whole matched expression), so we need to escape it as well:
https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html

Co-Authored-By: Jan Tojnar <jtojnar@gmail.com>
This commit is contained in:
Ulysses Zhan 2025-05-17 04:33:36 -07:00 committed by GitHub
parent 49b6072f10
commit dfb8bf17cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -229,10 +229,11 @@ if [[ -n "$newUrl" ]]; then
die "Couldn't evaluate source url from '$attr.$sourceKey'!"
fi
# Escape regex metacharacter that are allowed in store path names
oldUrlEscaped=$(echo "$oldUrl" | sed -re 's|[${}.+?]|\\&|g')
# Escape regex metacharacter that may appear in URLs
oldUrlEscaped=$(echo "$oldUrl" | sed -e 's|[*.^$[\|]|\\&|g')
newUrlEscaped=$(echo "$newUrl" | sed -e 's|[&\|]|\\&|g')
sed -i.cmp "$nixFile" -re "s|\"$oldUrlEscaped\"|\"$newUrl\"|"
sed -i.cmp "$nixFile" -e "s|\"$oldUrlEscaped\"|\"$newUrlEscaped\"|"
if cmp -s "$nixFile" "$nixFile.cmp"; then
die "Failed to replace source URL '$oldUrl' to '$newUrl' in '$attr'!"
fi