#!/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 ptools xmlsupport

function pver_display_help() {
    uecho "$scriptname: gérer des numéros de version selon les règles du versionage sémantique v2.0.0 (http://semver.org/)

USAGE
    $scriptname [options]

OPTIONS
    -w, --auto-file DIR
        Gérer le numéro de version du répertoire spécifié. Si un fichier pom.xml
        existe dans ce répertoire, alors c'est l'option '-e DIR/pom.xml' qui est
        activé. Si un fichier VERSION.txt existe dans ce répertoire, alors c'est
        l'option '-f DIR/VERSION.txt' qui est activée. Sinon, un nouveau fichier
        VERSION.txt est créé dans ce répertoire. C'est l'option par défaut.
    --sw, --auto-string DIR
        Prendre pour valeur de départ la version du répertoire spécifié. Si un
        fichier pom.xml existe dans ce répertoire, alors c'est l'option -E qui
        est activé. Si un fichier VERSION.txt existe dans ce répertoire, alors
        c'est l'option -F qui est activée.
    --gw, --auto-git-string [BRANCH:]DIR
        Prendre pour valeur de départ la version du répertoire spécifié dans la
        branche BRANCH (qui vaut par défaut master) du dépôt git. Si un fichier
        pom.xml existe dans ce répertoire, alors c'est l'option -g qui est
        activé. Si un fichier VERSION.txt existe dans ce répertoire, alors c'est
        l'option -G qui est activée.
    -e, --pom POMFILE
        Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié.
        Le fichier DOIT exister. Implique --maven-update
    -E, --pom-string POMFILE
        Prendre pour valeur de départ la version contenue dans le fichier
        pom.xml spécifié. Le fichier DOIT exister. Implique --maven-update
    -f, --file VERSIONFILE
        Gérer le numéro de version se trouvant dans le fichier spécifié. Le
        fichier est créé si nécessaire.
    -F, --file-string VERSIONFILE
        Prendre pour valeur de départ le contenu du fichier VERSIONFILE.
    -g, --git-file-string [BRANCH:]VERSIONFILE
        Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui
        vaut par défaut VERSION.txt) dans la branche BRANCH (qui vaut par défaut
        master) du dépôt git. Retourner 2 si on n'est pas situé dans un dépôt
        git.
    -G, --git-pom-string [BRANCH:]POMFILE
        Prendre pour valeur de départ la version du fichier POMFILE (qui vaut
        par défaut pom.xml) dans la branche BRANCH (qui vaut par défaut master)
        du dépôt git. Retourner 2 si on n'est pas situé dans un dépôt git.
    --git-prel-string
        Prendre pour valeur de départ le numéro de version correspondant à la
        branche de release courante. Retourner 1 si la branche courante n'est
        pas une branche de release, 2 si on n'est pas situé dans un dépôt git.
    -s, --string VERSION
        Prendre pour valeur de départ le numéro de version spécifié

    --show
        Afficher le numéro de version. C'est l'action par défaut
    --check
        Vérifier que le numéro de version est conforme aux règles du versionage
        sémantique
    --eq VERSION
    --ne VERSION
    --lt VERSION
    --le VERSION
    --gt VERSION
    --ge VERSION
    --same VERSION
    --diff VERSION
        Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt,
        --le, --gt, et --ge ignorent l'identifiant de build (comme le demande la
        règle du versionage sémantique). Les opérateurs --same et --diff
        comparent aussi les identifiants de build.
    -u, --update
        Mettre à jour le numéro de version.

Les options suivantes impliquent --update:
    -v, --set-version VERSION
        Spécifier un nouveau numéro de version qui écrase la valeur actuelle.
        Cette option ne devrait pas être utilisée en temps normal parce que cela
        va contre les règles du versionage sémantique.
    --prel
        Spécifier un nouveau numéro de version qui écrase la valeur actuelle. Le
        numéro de version est obtenu à partir du nom de la branche git courante,
        qui doit être de la forme release-VERSION
    --menu
        Afficher un menu permettant de choisir le composant de la version à
        incrémenter.
    -x, --major
        Augmenter le numéro de version majeure.
    -z, --minor
        Augmenter le numéro de version mineure. C'est la valeur par défaut, sauf
        avec --maven-update où c'est l'option -p qui est sélectionnée par
        défaut.
    -p, --patchlevel
        Augmenter le numéro de patch.
    -k, --keep
        Ne pas augmenter le numéro de version. Cette option est surtout utile
        pour *convertir* un numéro de version existant et mettre à jour le
        fichier correspondant. Elle est assumée si aucune option -[xzp] n'est
        spécifiée et qu'une des options -[labrSRmM] est utilisée.

    -l, --prelease ID
        Spécifier un identifiant de pré-release, à ajouter au numéro de version.
    -a, --alpha
    -b, --beta
    -r, --rc
        Spécifier une pré-release de type alpha, beta, ou rc. Si la version est
        déjà dans ce type, augmenter la dernière valeur numérique des composants
        de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3,
        rc1 devient rc2
        XXX ces fonctions ne sont pas encore implémentées
    -S, --snapshot
        Ajouter l'identifiant SNAPSHOT, utilisé par Maven
    -R, --final, --release
        Supprimer l'identifiant de prérelease, utilisé par Maven

    -m, --metadata ID
        Spécifier un identifiant de build, à ajouter au numéro de version.
    -M, --vcs-metadata
        Calculer l'identifiant de build à partir de la révision actuelle dans le
        gestionnaire de version. Note: pour le moment, seul git est supporté.
    --add-metadata ID
        Ajouter l'identifiant spécifié à la valeur actuelle, au lieu de la
        remplacer. Séparer l'identifiant de la valeur précédente avec un '.'

OPTIONS AVANCEES
    --show-source
        Afficher le type de source qui sera traité, i.e. pom, file, pom-string,
        file-string, git-pom-string, git-file-string
    --vpath VPATH
        Pour les options -e et -E, spécifier le chemin XPATH du tag qui contient
        le numéro de version.
    --map MAPFILE
        Cette option permet de spécifier un fichier de règles qui indique les
        fichiers pom.xml et VERSION.txt qui doivent être mis à jour dans un
        projet multi-modules pour lequel les versions doivent être mises à jour
        en même temps.
        Par défaut, si un fichier nommé .pver-map existe dans le répertoire de
        {POM,VERSION}FILE, cette option est automatiquement activée. Ainsi, on
        n'aura besoin d'utiliser cette option que si l'on désire charger un
        fichier alternatif ou ignorer le fichier par défaut.
        Si une valeur vide est fournie, seul le fichier {POM,VERSION}FILE est
        traité. Sinon, {POM,VERSION}FILE est utilisé uniquement pour chercher le
        fichier .pver-map et seuls les fichiers mentionnés dans MAPFILE sont
        traités.
        Le fichier MAPFILE est constitué d'un ensemble de lignes de la forme
            FILESPEC:VPATH
        FILESPEC est requis et prend la forme d'une spécification de chemin
        relatif au répertoire de MAPFILE et identifiant un ensemble de fichiers
        de version. Si FILESPEC contient des wildcards, alors les fichiers
        identifiés par ce chemin sont ignorés s'ils ont déjà été traités par une
        règle précédente. Si FILESPEC ne contient pas de wildcards, alors le
        fichier est systématiquement traité.
        VPATH désigne le chemin XPATH vers le numéro de version qu'il faut
        mettre à jour dans les fichiers pom.xml. Certaines valeurs spéciales
        pour VPATH sont supportées:
            (vide)  le chemin par défaut est utilisé pour ce fichier, c'est à
                    dire /project/version ou /project/parent/version en fonction
                    du contenu du fichier
            -       le fichier pom.xml n'est pas modifié (il est ignoré)
            D       alias pour le chemin XPATH /project/version
            P       alias pour le chemin XPATH /project/parent/version
        Pour les fichiers VERSION.txt, VPATH doit être vide
        Le fichier de version correspondant au premier fichier de la première
        ligne de MAPFILE contient la version de référence, qui est dupliquée
        dans tous les autres fichiers.
    --allow-empty
        Supporter que la version puisse ne pas être spécifiée ni trouvée. Sans
        cette option, on assume que la version effective est 0.0.0 si elle n'est
        pas spécifiée ni trouvée.
        Avec --show et --update, ne rien afficher si la version est vide.
    --convert
    --no-convert
        Activer (resp. désactiver) la conversion automatique.  Par défaut, si la
        version est au format classique 'x.z[.p]-rDD/MM/YYYY', elle est
        convertie automatiquement au format sémantique x.z.p+rYYYYMMDD
    -t, --maven-update
        Mettre à jour le numéro de version selons les règles de Maven. Cette
        option est automatiquement activée si -e est sélectionné. Elle n'est
        prise en compte qu'avec l'option -u
        Si les options -R et -S ne sont pas spécifiée, alors une release est
        transformée en snapshot et une snapshot en release. Avec -R, une
        snapshot est transformée en release, et une release est traitée /
        incrémentée normalement. Avec -S une release est transformée en
        snapshot, et un snapshot est traité / incrémentée normalement.
        Si l'une des options -x, -z, -p est utilisée, alors la partie spécifiée
        est incrémentée selon les règles suivantes. Dans les exemples suivants,
        A est un nombre quelconque, B = A + 1, et x, y et z sont des nombres
        quelconques.
        Avec l'option -x:
            A.0.0-SNAPSHOT --> A.0.0
            A.x.y-SNAPSHOT --> B.0.0
            x.A.y          --> x.B.0-SNAPSHOT
        Avec l'option -z:
            x.A.0-SNAPSHOT --> x.A.0
            x.A.y-SNAPSHOT --> x.B.0
            x.A.y          --> x.B.0-SNAPSHOT
        Avec l'option -p, qui est celle sélectionnée par défaut:
            x.y.z-SNAPSHOT --> x.y.z
            x.y.A          --> x.y.B-SNAPSHOT"
}

pver "$@"
