Posted at

ghq で管理している各リポジトリでコマンドを実行する ghq-foreach 書いた

More than 3 years have passed since last update.

ghq で取得したリポジトリ全部で git pull --ff-only したり git gc したりできたら嬉しいな、ということで嬉しくなるやつを書いた。

ghq-foreach gc --aggressive

ghq-foreach <git-subcmd> で任意のサブコマンドを各リポジトリに対して実行できる。 -e オプションをつけて ghq-foreach -e <shell-cmd> するとシェルコマンドも使える。

複数行のシェルコマンドなら ghq-foreach -e sh -c 'cmd1; cmd2' となる。


ghq-foreach.sh

#!/bin/bash

#
# ghq-foreach - executes git subcmd or shell cmd for each repo managed by ghq
#

EXEC=
QUIET=

say() {
[[ -n "$QUIET" ]] && return
if
[[ -t 1 ]]; then
printf '\e[1;34m%s\e[m\n' "$1"
else
printf '%s\n' "$1"
fi
}

main() {
if [[ "$1" = "-q" ]]; then
QUIET=1
shift
fi
if
[[ "$1" = "-e" ]]; then
EXEC=1
shift
fi

if [[ "$#" -eq 0 ]]; then
echo "usage: ghq-foreach [-q] (<git-cmd> | -e <shell-cmd>) [args...]" >&2
echo " -e Execute shell command" >&2
echo " -q Don't print each repository path" >&2
return 1
fi

ghq list -p | while read -r repo; do
(
cd "$repo"
say "> $repo"
if [[ -n "$EXEC" ]]; then
"$@"
else
git "$@"
fi
)
done
}

main "$@"