| #!/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 |