From 1b28299a42c505f514916459a3ea176abff314b5 Mon Sep 17 00:00:00 2001 From: Panfilov Konstantin Date: Sat, 17 Oct 2026 07:58:57 +0300 Subject: [PATCH] fix: create parent directories during sftp deploy --- .gitea/workflows/deploy.yml | 30 ++++++++++++++++++++++++++---- tests/check-demo-layout.php | 4 ++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 3167052..8bfb1f6 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -117,12 +117,23 @@ jobs: known_hosts=$(mktemp) batch=$(mktemp) files=$(mktemp) - trap 'rm -f "$known_hosts" "$batch" "$files"' EXIT + dirs=$(mktemp) + trap 'rm -f "$known_hosts" "$batch" "$files" "$dirs"' EXIT printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts" git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$)' > "$files" if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch" - sed 's#/[^/]*$##' "$files" | grep -v '^$' | sort -u | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done + while read -r file; do + case "$file" in + */*) dir=${file%/*} ;; + *) continue ;; + esac + while [ -n "$dir" ]; do + printf '%s\n' "$dir" >> "$dirs" + case "$dir" in */*) dir=${dir%/*} ;; *) break ;; esac + done + done < "$files" + sort -u "$dirs" | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done while read -r file; do printf '%s\n' "put -p $file $REMOTE_DIR/$file" >> "$batch"; done < "$files" SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch" echo "залито файлов: $(wc -l < "$files")" @@ -180,12 +191,23 @@ jobs: known_hosts=$(mktemp) batch=$(mktemp) files=$(mktemp) - trap 'rm -f "$known_hosts" "$batch" "$files"' EXIT + dirs=$(mktemp) + trap 'rm -f "$known_hosts" "$batch" "$files" "$dirs"' EXIT printf '%s\n' "$SFTP_KNOWN_HOSTS" > "$known_hosts" git ls-files | grep -vE '^(\.gitea/|README\.md$|AGENTS\.md$|CLAUDE\.md$|\.gitignore$|requisites\.html$)' > "$files" if grep -q '[^A-Za-z0-9._/-]' "$files"; then echo "имена с недопустимыми символами:"; grep '[^A-Za-z0-9._/-]' "$files"; exit 1; fi printf '%s\n' "-mkdir $REMOTE_DIR" > "$batch" - sed 's#/[^/]*$##' "$files" | grep -v '^$' | sort -u | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done + while read -r file; do + case "$file" in + */*) dir=${file%/*} ;; + *) continue ;; + esac + while [ -n "$dir" ]; do + printf '%s\n' "$dir" >> "$dirs" + case "$dir" in */*) dir=${dir%/*} ;; *) break ;; esac + done + done < "$files" + sort -u "$dirs" | while read -r dir; do printf '%s\n' "-mkdir $REMOTE_DIR/$dir" >> "$batch"; done while read -r file; do printf '%s\n' "put -p $file $REMOTE_DIR/$file" >> "$batch"; done < "$files" SSHPASS="$SFTP_PASS" sshpass -e sftp -oBatchMode=no -oStrictHostKeyChecking=yes -oUserKnownHostsFile="$known_hosts" "$SFTP_USER@$SFTP_HOST" < "$batch" echo "залито файлов: $(wc -l < "$files")" diff --git a/tests/check-demo-layout.php b/tests/check-demo-layout.php index d3c8fb6..dd7a2b4 100644 --- a/tests/check-demo-layout.php +++ b/tests/check-demo-layout.php @@ -53,6 +53,10 @@ foreach ([ } } +if (substr_count($workflow, 'while [ -n "$dir" ]; do') < 2) { + $failures[] = 'SFTP-деплой должен создавать все родительские каталоги для новых наборов assets.'; +} + if ($failures !== []) { fwrite(STDERR, "FAILED\n- " . implode("\n- ", $failures) . "\n"); exit(1);