#!/bin/bash -e

DESCRIPTION="List probable cruft files (from older versions or bugs)"

case "${1}" in
	"--help"|"-h")
		cat <<EOF
Usage: $(basename "${0}") [--interactive-remove] (as user mini-buildd)

${DESCRIPTION}

--interactive-remove: Prompt to actually remove found cruft

EOF
	exit 0
esac

[ "$(id -u -n)" = "mini-buildd" ] || { printf "E: Run this as user mini-buildd.\nTry 'mini-buildd-cruft --help'.\n" >&2; exit 1; }

# Gather (desc & solution) in two symmetric arrays
declare -a DESCRIPTION=()
declare -a SOLUTION=()

_add_path()
{
	local path="${1}"
	if [[ "${1}" != /* ]]; then
		path="${HOME}/${1}"
	fi
	if [ -e "${path}" ]; then
		DESCRIPTION+=("$(printf "%-50s (%5s): %s\n" "${path}" "$(du --summarize --human-readable "${path}" | cut -f1)" "${2:-Possible cruft file}")")
		SOLUTION+=("rm --verbose --recursive ${path}")
	fi
}

_add_path ".mini-buildd.pid"   "No longer used, even in sysv mode"
_add_path "var/chroots-libdir" "Old libdir location"
_add_path "var/spool"          "Old spool directory"

for P in $(find "${HOME}/var/log/" -maxdepth 1 -mindepth 1 -not -regex '.*\(access.log.*\|daemon.log.*\|inspect.json.*\)'); do
	_add_path "${P}" "Old per-repo log dir"
done

for P in $(find "${HOME}/var/log/" -maxdepth 1 -mindepth 1 -name "daemon.log*"); do
	_add_path "${P}" "Old daemon.log file no longer used since 2.1.5"
done

for P in $(find "${HOME}/var/tmp/" -maxdepth 1 -mindepth 1 -mtime +30); do
	_add_path "${P}" "Tempfile not changed for one month or longer, most likely stale"
done

for P in $(find "${HOME}/var/shared/debug/" -maxdepth 1 -mindepth 1 -mtime +30); do
	_add_path "${P}" "Debug copies (from ``mini-buildd-debug-build``) not changed for one month or longer"
done

for S in $(schroot --all-sessions --list | grep mini-buildd); do
	DESCRIPTION+=("${S}: Stale schroot session")
	SOLUTION+=("schroot --verbose --chroot=${S} --end-session")
done

if command -v lvdisplay >/dev/null 2>&1; then
	for S in $(lvdisplay 2>/dev/null | grep 'LV Name.*/dev/mini-buildd-loop-.\+/mini-buildd-.\+-.\+-.\+-.\+-.\+-.\+' | rev | cut -d' ' -f1 | rev); do
		DESCRIPTION+=("${S}: Stale LVM snapshot")
		SOLUTION+=("lvremove --verbose --force ${S}")
	done
fi

for ((N=0; N < ${#DESCRIPTION[@]}; N++ )); do
	printf "%s\n" "${DESCRIPTION[${N}]}"
	if [ "${1}" == "--interactive-remove" ]; then
		read -e -p "Solve using '${SOLUTION[${N}]}' ('Y' to actually do it)? " ANSWER
		if [ "${ANSWER}" = "Y" ]; then
			${SOLUTION[${N}]} || true
		fi
	fi
done
