#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/../load.sh" || exit 1
require: git

function git_status() {
    local status r cwd
    status="$(git -c color.status=always status "$@" 2>&1)"; r=$?
    if [ -n "$status" ]; then
        cwd="$Cwd"
        [ -n "$cwd" ] || cwd="$(pwd)"
        setx cwd=ppath2 "$cwd" "$OrigCwd"
        etitle "$cwd"
        if [ $r -eq 0 ]; then
            echo "$status"
        else
            eerror "$status"
        fi
        eend
    fi
}

function git_statuses() {
    local cwd="$(pwd)" dir
    for dir in "$@"; do
        cd "$dir" || die
        git_status --porcelain
        cd "$cwd"
    done
}

chdir=
all=
composer=
args=(
    "afficher l'état du dépôt"
    "[-d chdir] [-a patterns...]

Si l'option -a est utilisée, ce script accepte comme arguments une liste de patterns permettant de filtrer les répertoires concernés"
    -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
    -a,--all all=1 "faire l'opération sur tous les sous-répertoires de BASEDIR qui sont des dépôts git"
    -r,--composer composer=1 "faire l'opération sur tous les projets composer dépendants"
)
parse_args "$@"; set -- "${args[@]}"

setx OrigCwd=pwd
if [ -n "$chdir" ]; then
    cd "$chdir" || die
fi

Cwd=
if [ -n "$all" ]; then
    # liste de sous répertoires
    if [ $# -gt 0 ]; then
        # si on a une liste de patterns, l'utiliser
        setx -a dirs=ls_dirs . "$@"
    else
        dirs=()
        for dir in */.git; do
            [ -d "$dir" ] || continue
            dirs+=("${dir%/.git}")
        done
    fi
    git_statuses "${dirs[@]}"

elif [ -n "$composer" ]; then
    # projets dépendants
    git_ensure_gitvcs
    setx toplevel=git_get_toplevel
    cd "$toplevel" || die
    setx cwd=ppath2 . "$OrigCwd"
    [ -f composer.json ] || die "$cwd: ce n'est pas un projet composer"

    setx -a dirs="$MYDIR/_pman-composer_local_deps.php"
    git_statuses "${dirs[@]}"

else
    # répertoire courant uniquement
    git_ensure_gitvcs
    Cwd="$(git_get_toplevel)"

    args=()
    isatty || args+=(--porcelain)
    git_status "${args[@]}"
fi