##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des fichiers de ~/etc/{profile.d,bashrc.d,default}
##@cooked nocomments
uprovide uenv

function __uenv_check_file() {
    # Vérifier si le fichier $2 du répertoire $1 doit être sourcé.
    # note: pour utiliser cette fonction, les variables __uname_system et
    # __myhostname doivent être définies.
    local dir="$1" file="$2"

    [ -f "$dir/$file" ] || return

    # ignorer les fichiers qui ont l'extension .ignore
    [ "${file%%.ignore}" != "$file" ] && return 1
    
    # tester si le fichier est spécifique à une plateforme
    local system
    system="$(expr "$file" : ".*\\.\\[\\([^.]*\\)\\]")"
    [ -n "$system" -a "$system" != "$__uname_system" ] && return 1
    system="$(expr "$file" : ".*\\.\\[-\\([^.]*\\)\\]")"
    [ -n "$system" -a "$system" == "$__uname_system" ] && return 1
    
    # tester si le fichier est spécifique à une machine
    local host
    host="$(expr "$file" : ".*\\.on_\\([^.]*\\)")"
    [ -n "$host" -a "$host" != "$__myhostname" ] && return 1
    host="$(expr "$file" : ".*\\.noton_\\([^.]*\\)")"
    [ -n "$host" -a "$host" == "$__myhostname" ] && return 1
    
    # tester si le fichier est spécifique à un utilisateur
    local user
    user="$(expr "$file" : ".*\\.for_\\([^.]*\\)")"
    [ -n "$user" -a "$user" != "$USER" ] && return 1
    user="$(expr "$file" : ".*\\.notfor_\\([^.]*\\)")"
    [ -n "$user" -a "$user" == "$USER" ] && return 1
    
    return 0
}

function __uenv_source_dirs() {
    # charger les fichiers qui sont dans le répertoire $1. Si un fichier
    # .source_in_order existe dans ce répertoire, il fixe l'ordre dans lesquel
    # les fichiers sont chargés. Sinon, les fichiers sont sourcé par ordre
    # alphabétique.
    local __uname_system __myhostname
    __uname_system=`uname -s`
    [ "${__uname_system#CYGWIN}" != "$__uname_system" ] && __uname_system=Cygwin
    [ "${__uname_system#MINGW32}" != "$__uname_system" ] && __uname_system=Mingw
    __myhostname="${HOSTNAME%%.*}"

    local dir file sio
    for dir in "$@"; do
        [ -d "$dir" ] || continue
        sio="$dir/.source_in_order"
        if [ -f "$sio" ]; then
            source "$sio"
        else
            for file in "$dir/"*; do
                if __uenv_check_file "$(dirname "$file")" "$(basename "$file")"; then
                    source "$file"
                fi
            done
        fi
    done
}

function __uenv_cleanup() {
    unset -f __uenv_check_file
    unset -f __uenv_source_dirs
    unset -f __uenv_cleanup
}