git-sed: discover a separator when the / character is used in arguments

Prevents sed from returning an error for arguments containing filenames:

$ git sed src/foo.c src/bar.c
sed: -e expression #1, char 13: unknown option to `s'
This commit is contained in:
Paul Wise 2018-04-20 12:13:21 +08:00
parent c27a3505dc
commit 9785199036
No known key found for this signature in database
GPG key ID: 3116BA5E9FFA69A3

View file

@ -66,7 +66,22 @@ actual command:
shift
done
all="$search$replacement$flags"
case "$all" in
*/*)
ascii="$(for((i=32;i<=127;i++)) do printf '%b' "\\$(printf '%03o' "$i")"; done)"
sep="$(printf '%s' "$ascii" | tr -d "$all")"
sep="$(printf %.1s "$sep")"
if [ "X$sep" = "X" ] ; then
echo 'could not find an unused character for sed separator character'
exit 1
fi
;;
*)
sep=/
;;
esac
r=$(xargs -r false < /dev/null > /dev/null 2>&1 && echo r)
command="git grep -lz '$search' | xargs -0$r sed -i 's/$search/$replacement/$flags'"
git grep -lz "$search" | xargs -0"$r" sed -i "s/$search/$replacement/$flags"
command="git grep -lz '$search' | xargs -0$r sed -i 's$sep$search$sep$replacement$sep$flags'"
git grep -lz "$search" | xargs -0"$r" sed -i "s$sep$search$sep$replacement$sep$flags"
do_commit