phase1: add support for per-slave cleanup
[buildbot.git] / phase1 / cleanup.sh
diff --git a/phase1/cleanup.sh b/phase1/cleanup.sh
new file mode 100755 (executable)
index 0000000..f2d0bcc
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+export LC_ALL=C
+
+master_url="$1"
+current_slave="$2"
+current_builder="$3"
+current_mode="$4"
+
+running_builders="$(wget -qO- "${master_url%/}/json/slaves/$current_slave?as_text=1" | sed -ne 's,^.*"builderName": "\(.*\)".*$,\1,p')"
+
+is_running() {
+       local running_builder
+       for running_builder in $running_builders; do
+               if [ "${running_builder//\//_}" = "${1//\//_}" ]; then
+                               return 0
+               fi
+       done
+       return 1
+}
+
+do_cleanup() {
+       printf "Cleaning up '$current_builder' work directory"
+
+       if [ -d .git ]; then
+               echo " using git"
+               git reset --hard HEAD
+               git clean -f -d -x
+       else
+               find . -mindepth 1 -maxdepth 1 | while read entry; do
+                       rm -vrf "$entry" | while read entry2; do
+                               case "$entry2" in *directory:*)
+                                       printf "."
+                               esac
+                       done
+               done
+       fi
+
+       echo ""
+}
+
+#
+# Sanity check, current builder should be in running builders list
+#
+
+if ! is_running "$current_builder"; then
+       echo "Current builder '$current_builder' not found in current builders list, aborting cleanup."
+       exit 1
+fi
+
+
+#
+# Clean up leftovers
+#
+
+if [ "$current_mode" = full ]; then
+(
+       if ! flock -x -w 2700 200; then
+               echo "Unable to obtain exclusive lock, aborting cleanup."
+               exit 1
+       fi
+
+       for build_dir in ../../*; do
+
+               build_dir="$(readlink -f "$build_dir")"
+
+               if [ -z "$build_dir" ] || [ ! -d "$build_dir/build/build_dir" ]; then
+                       continue
+               fi
+
+               current_builder="${build_dir##*/}"
+
+               if is_running "$current_builder"; then
+                       echo "Skipping currently active '$current_builder' work directory."
+                       continue
+               fi
+
+               (
+                       cd "$build_dir/build"
+
+                       if [ -d build_dir ]; then
+                               do_cleanup
+                       else
+                               echo "Skipping clean '$current_builder' work directory."
+                       fi
+               )
+       done
+
+) 200>../../cleanup.lock
+
+#
+# Clean up current build
+#
+
+else
+       do_cleanup
+fi
+
+exit 0