#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

u"""%(scriptname)s: Plier/déplier des inclusions dans un fichier

USAGE
    %(scriptname)s [[options] dest...]

OPTIONS
    -f  Plier les inclusions
    -u  Déplier les inclusions (par défaut)
    -@  Forcer le caractère '@' pour le pliage/dépliage
    -*  Forcer le caractère '*' pour le pliage/dépliage
    --auto
        Activer la recherche automatique de paramètres (par défaut)
    --noauto
        Désactiver la recherche automatique de paramètres
    -I SPEC
        Spécifier des fichiers à inclure dans les répertoires spécifiés
    -X SPEC
        Spécifier des fichiers à exclure dans les répertoires spécifiés
    --refdir REFDIR
        Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
        dans les arguments. Si un fichier à inclure *n'est pas* un fils du
        répertoire DEST, l'emplacement effectif du fichier est calculé en
        faisant comme si DEST==REFDIR.
        Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
        /dest/path/file inclue le fichier ../inc, alors c'est le fichier
        /refdir/inc qui est considéré.
        Ceci permet de traiter les inclusions dans une copie temporaire d'un
        répertoire, dans le cas où les fichier font référence à d'autres
        fichiers situés relativement à l'emplacement original.

Les spécifications de fichiers sont de types glob: ils peuvent contenir les
wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
tous les fichiers situés dans l'arborescence à partir de dir.

La variable UINCPATH contient une liste de répertoires qui sont consultés pour
trouver les fichiers à inclure."""

import os, sys
from os import path

from ulib.all import *
from ulib.p.uinc import Updater, ConsoleOutput

def display_help():
    uprint(__doc__ % globals())

def run_uinc():
    action, options, args, params = Updater.parse_options(None)
    for option, value in options:
        if option in ('-h', '--help'):
            display_help()
            sys.exit(0)

    uincdirs = os.environ.get('UINCPATH', '').split(os.pathsep)
    uincdirs = filter(None, uincdirs)

    updater = Updater(args, **params)
    updater.out = ConsoleOutput()
    updater.uincdirs = uincdirs

    if updater.auto:
        auto_args = u"\n    ".join([relpath(p) for p in updater.args])
        auto_msg = u"""Les fichiers/répertoires suivants seront traités:
    %s
Cette liste a été calculée automatiquement. Vous pouvez désactiver la
configuration automatique avec --noauto. Voulez-vous continuer?""" % auto_args
        if not ask_yesno(auto_msg, True):
            return False

    should_update, reason = updater.should_update()
    if should_update:
        return updater.update(action)
    else:
        ewarn(u"no update because %s" % reason)

if __name__ == '__main__':
    raise Exit(run_uinc())
