From bc3358fcfe42479bea12713de6511840e8b7543b Mon Sep 17 00:00:00 2001 From: Oneric Date: Sat, 29 Apr 2023 02:58:20 +0200 Subject: [PATCH] po/make_pot: increase portability across shells MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Base POSIX leaves the handling of backslahes in the operand implementation defined. The XSI extension specifies several escape sequences, like e.g. \n, which shall be transformed upon printing. Current make_pot.sh expects XSI behaviour and indeed e.g. dash’s echo builtin implements this. echo builtins of other common shells such as bash however, do not (by default). Avoid this portability pitfall by just using printf at all relevant places. See: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html This also allows us to stop substituting each backslash with four backslashes before piping to maybe_append. This substituion existed to safely pass backslahes through maybe_append’s two layers of echo. Also improve quoting. For consistency prefer single-quote quoting over shell backslash escapes. QUote the unguarded *.lua to ensure it will continue to work if there happen to be any lua files in the scripts working directory. This supersedes commits from wangqr/Aegisub which adjusted quoting and echo usage to work with different shells. This is more throughout and doesn't introduce semi-broken intermediate states. https://github.com/wangqr/Aegisub/commit/0fbcaea871be75b9dbcb2b9cee19df9a61177717 https://github.com/wangqr/Aegisub/commit/4aee271d034f5f0a47863594f07ef4d172ecc4f4 https://github.com/wangqr/Aegisub/commit/940181c7bc76128a008c15292d9a5dc0cb8c2281 (Note the second commit actually didn't manage to achieve the intended portability, since several echo usages remained and it forgot to adjust the backslash substitution, which was then fixed in the third commit.) --- po/make_pot.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/po/make_pot.sh b/po/make_pot.sh index 8eb7fe9fc..655864750 100755 --- a/po/make_pot.sh +++ b/po/make_pot.sh @@ -3,17 +3,18 @@ set -e maybe_append() { while read -r msg; do - msgfile=$(echo $msg | cut -d'|' -f1) - msgline=$(echo $msg | cut -d'|' -f2) - msgid=$(echo $msg | cut -d'|' -f3-) + msgfile=$(printf '%s' "$msg" | cut -d'|' -f1) + msgline=$(printf '%s' "$msg" | cut -d'|' -f2) + msgid=$(printf '%s' "$msg" | cut -d'|' -f3-) if ! grep -Fq "msgid $msgid" aegisub.pot; then - echo "\n#: $msgfile:$msgline\nmsgid $msgid\nmsgstr \"\"\n" >> aegisub.pot + printf "\n#: %s:%s\nmsgid %s\nmsgstr \"\"\n\n" \ + "$msgfile" "$msgline" "$msgid" >> aegisub.pot fi done } -find ../src ../src/command -name \*.cpp -o -name \*.h \ +find ../src ../src/command -name '*.cpp' -o -name '*.h' \ | xgettext --files-from=- -o - --c++ --sort-by-file \ -k_ -kSTR_MENU -kSTR_DISP -kSTR_HELP -kfmt_tl -kfmt_plural:2,3 -kwxT -kwxPLURAL:1,2 \ | sed 's/SOME DESCRIPTIVE TITLE./Aegisub 3.2/' \ @@ -35,11 +36,10 @@ grep '"[A-Za-z ]\+" : {' -n ../src/libresrc/default_hotkey.json \ | sed 's/^\([0-9]\+:\).*\("[^"]\+"\).*$/default_hotkey.json|\1|\2/' \ | maybe_append -find ../automation -name *.lua \ +find ../automation -name '*.lua' \ | LC_ALL=C sort \ - | xargs grep tr\"[^\"]\*\" -o -n \ + | xargs grep 'tr"[^"]*"' -o -n \ | sed 's/\(.*\):\([0-9]\+\):tr\(".*"\)/\1|\2|\3/' \ - | sed 's/\\/\\\\\\\\/g' \ | maybe_append xgettext ../packages/desktop/aegisub.desktop.in.in \ @@ -50,7 +50,7 @@ xgettext ../packages/desktop/aegisub.appdata.xml.in.in \ grep '^_[A-Za-z0-9]*=.*' ../packages/win_installer/fragment_strings.iss.in | while read line do - echo "$line" \ + printf '%s\n' "$line" \ | sed 's/[^=]*=\(.*\)/packages\/win_installer\/fragment_strings.iss|1|"\1"/' \ | maybe_append done