blob: a41d41ebe4729105af180ae5315ffb04150e41dd [file] [log] [blame]
#!/usr/bin/env bash
shopt -s nullglob
usage() {
echo "Usage: $(basename "$0") [ -x <exclude> ]*"
exit 1
}
word_in_list() {
local a word=$1
shift
for a in "$@"; do
[ "$word" = "$a" ] && return 0
done
return 1
}
remove_empty_directories() {
find . -depth -type d |
sed 's|^\./||' |
grep -Ev '^\.$|^\.svn/|/\.svn/|/\.svn$|^\.hg/|^\.hg$|^\.git/|^\.git$' |
while read -r d; do
for f in "$d"/{*,.*}; do
if ! [ -e "$f" ]; then
rmdir "$d"
fi
break
done
done
}
exclude=("TAGS")
git_options=(-e TAGS)
while [ "${1#-}" != "$1" ]; do
case "$1" in
-x)
exclude+=("$2")
git_options+=(-e "$2")
shift; shift;;
*)
usage;;
esac
done
for d in "${@-.}"; do
(
if cd "$d"; then
if [ -e .svn ]; then
if ! type -p svn >&/dev/null; then
echo "$0: svn: not found."
exit 0
fi
"$(dirname "$0")"/list-non-source-files |
while read -r f; do
if ! word_in_list "$f" "${exclude[@]}"; then rm -rf -- "$f"; fi;
done
elif [ -e .git ] || [ -e ../.git ]; then
if ! type -p git >&/dev/null; then
echo "$0: git: not found."
exit 0
fi
git clean -f -d -x "${git_options[@]}" >/dev/null
remove_empty_directories
elif [ -e .hg ] || [ -e ../.hg ]; then
if ! type -p hg >&/dev/null; then
echo "$0: hg: not found."
exit 0
fi
hg purge --all
else
echo "$0: $d: not administered by Subversion, Git or Mercurial."
fi
fi
)
done