From 93dbb14ab9f99e0ac6077637e444e1662ff09bd5 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Tue, 30 Jul 2019 20:05:49 -0400 Subject: [PATCH] archrelease: actually fail in failure conditions When svn ls fails due to network timeouts, this currently results in archrelease deleting all files, then committing this as the changeset. This causes data loss... With bash 4.4 and using wait $! we can get return the return code of the last backgrounded command -- which process substitution qualifies as. Key off of this to make sure that `svn ls` actually succeeded. Signed-off-by: Eli Schwartz Signed-off-by: Levente Polyak --- archrelease.in | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/archrelease.in b/archrelease.in index 25379a7..491e68f 100644 --- a/archrelease.in +++ b/archrelease.in @@ -48,7 +48,8 @@ if [[ $(svn status -q) ]]; then fi pushd .. >/dev/null -IFS=$'\n' read -r -d '' -a known_files < <(svn ls -r HEAD "$trunk") +mapfile -t known_files < <(svn ls -r HEAD "$trunk") +wait $! || die "failed to discover committed files" for file in "${known_files[@]}"; do if [[ ${file:(-1)} = '/' ]]; then die "archrelease: subdirectories are not supported in package directories!" @@ -65,12 +66,12 @@ for tag in "$@"; do stat_busy "Copying %s to %s" "${trunk}" "${tag}" if [[ -d repos/$tag ]]; then - declare -a trash - trash=() - while read -r file; do - trash+=("repos/$tag/$file") - done < <(svn ls "repos/$tag") - [[ ${#trash[@]} == 0 ]] || svn rm -q "${trash[@]/%/@}" + mapfile -t trash < <(svn ls "repos/$tag") + wait $! || die "failed to discover existing files" + if (( ${#trash[@]} )); then + trash=("${trash[@]/#/repos/$tag/}") + svn rm -q "${trash[@]/%/@}" + fi else mkdir -p "repos/$tag" svn add --parents -q "repos/$tag"