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