diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2019-07-30 20:05:49 -0400 |
---|---|---|
committer | Levente Polyak <anthraxx@archlinux.org> | 2019-08-09 19:41:53 +0200 |
commit | 93dbb14ab9f99e0ac6077637e444e1662ff09bd5 (patch) | |
tree | 2a33405fc6aab162119a6c712544ecd039c2ea5e | |
parent | 10c6efc440c732b70c1f11302777987cdf7e31de (diff) | |
download | devtools-93dbb14ab9f99e0ac6077637e444e1662ff09bd5.tar.xz |
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 <eschwartz@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
-rw-r--r-- | archrelease.in | 15 |
1 files 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" |