#! /usr/bin/env bash
# Run git command in each directory that looks like a git repository. By
# default only top-level directoris are considered but the depth can be
# adjusted with -d.
#
# -x
# Exclude .
#
# -n
# Directory depth to consider.
#
#
trap "{ exit 1; }" ERR
set -o errtrace # Trap in functions.
function info () { echo "$*" 1>&2; }
exclude=() # Array of excluded directories.
depth=1
while [ $# -gt 0 ]; do
case $1 in
-x)
shift
exclude+=("${1%/}")
shift
;;
-n)
shift
depth="$1"
shift
;;
*)
break
;;
esac
done
# Find all the top-level directories that looks like git repositories.
#
dirs=()
for d in $(find . -mindepth 1 -maxdepth "$depth" -type d -printf '%P\n' | sort); do
if [ -d "$d/.git" ]; then
dirs+=("$d")
fi
done
# Run the command for each of them.
#
for d in "${dirs[@]}"; do
for e in "${exclude[@]}"; do
if [[ "$d/" =~ ^"$e/" ]]; then
d=
break
fi
done
if [ -n "$d" ]; then
info "$d/"
git -C "$d" "${@}"
fi
done