The common case here is that we don't have to change any permissions, so rewrite it so that (assuming [ is a shell builtin) we don't need to run any additional programs unless we actually need to make a permissions change. I also find this a bit more readable than the previous awk version, and we no longer need to ignore errors from chmod. Link: https://spectrum-os.org/lists/archives/spectrum-devel/87plbj4w9q.fsf@alyssa.... Signed-off-by: Alyssa Ross <hi@alyssa.is> --- scripts/make-erofs.sh | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/scripts/make-erofs.sh b/scripts/make-erofs.sh index be65de8..551ae4a 100755 --- a/scripts/make-erofs.sh +++ b/scripts/make-erofs.sh @@ -1,6 +1,6 @@ #!/bin/sh -eu # -# SPDX-FileCopyrightText: 2023-2024 Alyssa Ross <hi@alyssa.is> +# SPDX-FileCopyrightText: 2023-2025 Alyssa Ross <hi@alyssa.is> # SPDX-FileCopyrightText: 2025 Demi Marie Obenour <demiobenour@gmail.com> # SPDX-License-Identifier: EUPL-1.2+ # @@ -39,15 +39,28 @@ while read -r arg1; do (*) parent=.;; esac - awk -v parent="$parent" -v root="$root" 'BEGIN { - n = split(parent, components, "/") - for (i = 1; i <= n; i++) { - printf "%s/", root - for (j = 1; j <= i; j++) - printf "%s/", components[j] - print - } - }' | xargs -rd '\n' chmod +w -- 2>/dev/null || : + # Ensure any existing directories we want to write into are writable. + ( + set -- + while :; do + abs="$root/$parent" + if [ -e "$abs" ] && ! [ -w "$abs" ]; then + set -- "$abs" "$@" + fi + + # shellcheck disable=SC2030 # shadowed on purpose + case "$parent" in + */*) parent="${parent%/*}" ;; + *) break ;; + esac + done + + if [ "$#" -ne 0 ]; then + chmod +w -- "$@" + fi + ) + + # shellcheck disable=SC2031 # shadowed in subshell on purpose mkdir -p -- "$root/$parent" cp -RT -- "$arg1" "$root/$arg2" -- 2.51.0