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

function display_help() {
    uecho "$scriptname: lancer une commande pour un ensemble d'arguments

USAGE
    $scriptname [options] [VAR=]expr cmd...

La commande est lancée avec la variable 'VAR', qui vaut par défaut 'item',
définie à la valeur courante de l'énumération. De plus, la variable 'index'
reçoit une valeur incrémentale commençant à 0.

Exemple:
    $scriptname '*.c' 'cp $item to/another/dir'

OPTIONS
    -b, --basedir BASEDIR
        Chercher les expressions -d, -g, -f, -a à partir de BASEDIR au lieu du
        répertoire courant.
    -d, --dir
        Faire la correspondance de l'expression sur les répertoires
    -g, --go
        Comme -d, mais pour chaque répertoire, lancer la commande après en avoir
        fait le répertoire courant.
    -f, --file
        Faire la correspondance de l'expression sur les répertoires
    -a, --all
        Faire la correspondance de l'expression sur les répertoires
    -s, --string
        Evaluer la chaine avec le shell
    -t, --title
    --no-title
        Afficher (resp. ne pas afficher) chaque correspondance avant de lancer
        la commande. Par défaut, l'affichage est effectué."
}

basedir=
match=all
changedir=
title=1
args=(+
    --help '$exit_with display_help'
    -b:,--basedir: basedir=
    -d,--dir match=dir
    -g,--go '$match=dir; changedir=1'
    -f,-file match=file
    -a,--all match=all
    -s,--string match=string
    -t,--title title=1
    --no-title title=
)
parse_args "$@"; set -- "${args[@]}"

varexpr="$1"; shift
splitfsep2 "$varexpr" = varname expr
[ -n "$varname" ] || varname=item
[ -n "$expr" ] || expr="*"

cmd=("$@")
[ ${#cmd[*]} -gt 0 ] || cmd=('echo $item')

[ -n "$basedir" ] || basedir=.

case "$match" in
    all) array_lsall items "$basedir" "$expr";;
    dir) array_lsdirs items "$basedir" "$expr";;
    file) array_lsfiles items "$basedir" "$expr";;
    string) eval "items=($expr)";;
esac

[ -n "$title" ] && einfo "${#items[@]} correspondance(s) trouvée(s)"
let index=0
for item in "${items[@]}"; do
    [ -n "$title" ] && etitle "$item"
    (
        [ -n "$changedir" ] && cd "$item"
        eval "export $(echo_setv "$varname" "$item"); ${cmd[*]}"
    )
    [ -n "$title" ] && eend "$item"
    let index=$index+1
done