786 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			786 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| ## Fonctions pour la gestion des projets
 | |
| ##@cooked nocomments
 | |
| ##@include vcs
 | |
| ##@include semver
 | |
| ##@include xmlsupport
 | |
| uprovide ptools
 | |
| urequire vcs semver xmlsupport
 | |
| 
 | |
| function is_any_branch() {
 | |
|     local branch="$1"; shift
 | |
|     if [ -z "$branch" ]; then
 | |
|         branch="$(git_get_branch)" || return 2
 | |
|     fi
 | |
|     local annex; git_have_annex && annex=1
 | |
|     local spec r
 | |
|     for spec in "$@"; do
 | |
|         case "$spec" in
 | |
|         m|master)
 | |
|             [ -n "$r" ] || r=1
 | |
|             [ "$branch" == "master" ] && return 0
 | |
|             ;;
 | |
|         d|develop)
 | |
|             [ -n "$r" ] || r=1
 | |
|             [ "$branch" == "develop" ] && return 0
 | |
|             ;;
 | |
|         r|release)
 | |
|             [ -n "$r" ] || r=1
 | |
|             [[ "$branch" == release-* ]] && return 0
 | |
|             ;;
 | |
|         h|hotfix)
 | |
|             [ -n "$r" ] || r=1
 | |
|             [[ "$branch" == hotfix-* ]] && return 0
 | |
|             ;;
 | |
|         f|feature|t|topic)
 | |
|             [ -n "$r" ] || r=1
 | |
|             [ "$branch" == "master" ] && continue
 | |
|             [ "$branch" == "develop" ] && continue
 | |
|             [[ "$branch" == release-* ]] && continue
 | |
|             [[ "$branch" == hotfix-* ]] && continue
 | |
|             [ -n "$annex" -a "$branch" == "git-annex" ] && continue
 | |
|             [[ "$branch" == */* ]] && continue
 | |
|             return 0
 | |
|             ;;
 | |
|         -m|-master)
 | |
|             [ -n "$r" ] || r=0
 | |
|             [ "$branch" == "master" ] && return 1;;
 | |
|         -d|-develop)
 | |
|             [ -n "$r" ] || r=0
 | |
|             [ "$branch" == "develop" ] && return 1;;
 | |
|         -r|-release)
 | |
|             [ -n "$r" ] || r=0
 | |
|             [[ "$branch" == release-* ]] && return 1;;
 | |
|         -h|-hotfix)
 | |
|             [ -n "$r" ] || r=0
 | |
|             [[ "$branch" == hotfix-* ]] && return 1;;
 | |
|         -f|-feature|-t|-topic)
 | |
|             [ -n "$r" ] || r=0
 | |
|             [ "$branch" == "master" ] && continue
 | |
|             [ "$branch" == "develop" ] && continue
 | |
|             [[ "$branch" == release-* ]] && continue
 | |
|             [[ "$branch" == hotfix-* ]] && continue
 | |
|             [ -n "$annex" -a "$branch" == "git-annex" ] && continue
 | |
|             [[ "$branch" == */* ]] && continue
 | |
|             return 1
 | |
|             ;;
 | |
|         esac
 | |
|     done
 | |
|     return ${r:-1}
 | |
| }
 | |
| function is_master_branch() { is_any_branch "$1" master; }
 | |
| function is_develop_branch() { is_any_branch "$1" develop; }
 | |
| function is_release_branch() { is_any_branch "$1" release; }
 | |
| function is_hotfix_branch() { is_any_branch "$1" hotfix; }
 | |
| function is_feature_branch() { is_any_branch "$1" feature; }
 | |
| 
 | |
| function list_release_branches() {
 | |
|     local origin="$1"
 | |
|     git_list_${origin:+p}branches "$origin" | grep '^release-'
 | |
| }
 | |
| function list_hotfix_branches() {
 | |
|     local origin="$1"
 | |
|     git_list_${origin:+p}branches "$origin" | grep '^hotfix-'
 | |
| }
 | |
| function list_feature_branches() {
 | |
|     local origin="$1"
 | |
|     git_list_${origin:+p}branches "$origin" |
 | |
|     grep -vF master |
 | |
|     grep -vF develop |
 | |
|     grep -v '^release-' |
 | |
|     grep -v '^hotfix-' |
 | |
|     grep -v '/' |
 | |
|     if git_have_annex; then
 | |
|         grep -vF git-annex
 | |
|     else
 | |
|         cat
 | |
|     fi
 | |
| }
 | |
| 
 | |
| ################################################################################
 | |
| # Outils de haut niveau
 | |
| 
 | |
| __pver_perror() {
 | |
|     local r="$1"; shift
 | |
|     [ $# -gt 0 ] || set "Une erreur s'est produite"
 | |
|     local m=$r
 | |
|     [ $m -gt $# ] && m=$#
 | |
|     [ $m -gt 0 ] && eerror "${!m}"
 | |
|     return $r
 | |
| }
 | |
| 
 | |
| __pver_unless() {
 | |
|     local r m
 | |
|     if [[ "$1" == -* ]]; then
 | |
|         [ "${@:1:2}" ] 2>/dev/null; r=$?
 | |
|         shift; shift
 | |
|     else
 | |
|         [ "${@:1:3}" ] 2>/dev/null; r=$?
 | |
|         shift; shift; shift
 | |
|     fi
 | |
|     __pver_perror $r "$@"
 | |
| }
 | |
| 
 | |
| function __pver_get_prel_version() {
 | |
|     # retourner la version correspondant à la branche courante si c'est une
 | |
|     # branche de release. retourner 1 si la branche courante n'est pas une
 | |
|     # branche de release, 2 si on n'est pas dans un dépôt git
 | |
|     local branch
 | |
|     branch="$(git_get_branch)" || return 2
 | |
|     if [[ "$branch" == release-* ]]; then
 | |
|         echo "${branch#release-}"
 | |
|         return 0
 | |
|     else
 | |
|         return 1
 | |
|     fi
 | |
| }
 | |
| function __pver_pom_get_vpath() {
 | |
|     # pour le fichier $1(=pom.xml), retourner le chemin dans lequel se trouve la
 | |
|     # version du projet
 | |
|     local pom="${1:-pom.xml}"
 | |
|     if xpathtool -tf "$pom" /project/version 2>/dev/null; then
 | |
|         echo /project/version
 | |
|     elif xpathtool -tf "$pom" /project/parent/version 2>/dev/null; then
 | |
|         echo /project/parent/version
 | |
|     else
 | |
|         echo /project/version
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function __pver_pom_get_version() {
 | |
|     # obtenir la version dans le pom $1(=pom.xml) à partir du chemin $2, qui est
 | |
|     # déterminé automatiquement s'il n'est pas spécifié.
 | |
|     local pom="${1:-pom.xml}"
 | |
|     local vpath="$2"
 | |
|     local version
 | |
|     if [ -n "$vpath" ]; then
 | |
|         xpathtool -f "$pom" -g "$vpath"
 | |
|         return
 | |
|     fi
 | |
|     version="$(xpathtool -f "$pom" -g /project/version 2>/dev/null)"
 | |
|     if [ -n "$version" ]; then
 | |
|         echo "$version"
 | |
|         return
 | |
|     fi
 | |
|     version="$(xpathtool -f "$pom" -g /project/parent/version 2>/dev/null)"
 | |
|     if [ -n "$version" ]; then
 | |
|         echo "$version"
 | |
|         return
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function __pver_pom_set_version() {
 | |
|     # modifier la version dans le pom $1(=pom.xml) à la valeur
 | |
|     # $2(=1.0.0-SNAPSHOT) en utilisant le chemin xpath $3, qui est déterminé
 | |
|     # automatiquement s'il n'est pas spécifié.
 | |
|     # retourner 0 si la version a été mise à jour dans le chemin /project/version
 | |
|     # retourner 1 si la version a été mise à jour dans le chemin /project/parent/version
 | |
|     # retourner 2 si la version a été mise à jour dans un autre chemin
 | |
|     # retourner 3 si une erreur s'est produite
 | |
|     local pom="${1:-pom.xml}"
 | |
|     local version="${2:-1.0.0-SNAPSHOT}"
 | |
|     local vpath="$3"
 | |
|     case "$vpath" in
 | |
|     D) vpath=/project/version;;
 | |
|     P) vpath=/project/parent/version;;
 | |
|     esac
 | |
|     [ -n "$vpath" ] || vpath="$(__pver_pom_get_vpath "$pom")"
 | |
|     xpathtool -f "$pom" -s "$vpath" "$version" || return 3
 | |
|     case "$vpath" in
 | |
|     /project/version) return 0;;
 | |
|     /project/parent/version) return 1;;
 | |
|     *) return 2;;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function pver() {
 | |
|     local DEFAULT_FILE=VERSION.txt
 | |
|     local DEFAULT_POM=pom.xml
 | |
| 
 | |
|     local -a args
 | |
|     local action=auto
 | |
|     local source=auto
 | |
|     local file git version operator oversion
 | |
|     local setversion incversion
 | |
|     local setpr setprelease setsnapshot setalpha setbeta setrc setrelease
 | |
|     local setmd resetmetadata setmetadata addmetadata vcsmetadata
 | |
|     local vpath setmapfile mapfile allow_empty convert=auto maven_update
 | |
|     parse_opts "${PRETTYOPTS[@]}" \
 | |
|         --help '$exit_with pver_display_help' \
 | |
|         -w:,--w:,--fw:,--auto-file: '$set@ file; source=auto-file' \
 | |
|         --sw:,--auto-string: '$set@ file; source=auto-string' \
 | |
|         --gw:,--auto-git-string: '$set@ git; source=auto-git-string' \
 | |
|         -e:,--e:,--pom:,--maven: '$set@ file; source=pom' \
 | |
|         -E:,--E:,--pom-string:,--maven-string: '$set@ file; source=pom-string' \
 | |
|         -f:,--f:,--file: '$set@ file; source=file' \
 | |
|         -F:,--F:,--file-string: '$set@ file; source=file-string' \
 | |
|         -g:,--g:,--git-file-string:,--git-string: '$set@ git; source=git-file-string' \
 | |
|         -G:,--G:,--git-pom-string: '$set@ git; source=git-pom-string' \
 | |
|         --git-prel-string source=git-prel-string \
 | |
|         -s:,--s:,--string: '$set@ version; source=string' \
 | |
|         --show action=show \
 | |
|         --show-source action=show-source \
 | |
|         --check action=check \
 | |
|         --eq: '$action=compare; operator=eq; set@ oversion' \
 | |
|         --ne: '$action=compare; operator=ne; set@ oversion' \
 | |
|         --lt: '$action=compare; operator=lt; set@ oversion' \
 | |
|         --le: '$action=compare; operator=le; set@ oversion' \
 | |
|         --gt: '$action=compare; operator=gt; set@ oversion' \
 | |
|         --ge: '$action=compare; operator=ge; set@ oversion' \
 | |
|         -u,--update '$action=update; [ -z "$incversion" ] && incversion=auto' \
 | |
|         --menu '$action=update; incversion=menu' \
 | |
|         -v:,--set-version: '$action=update; set@ setversion; incversion=' \
 | |
|         --prel '$action=update; setversion=prel; incversion=' \
 | |
|         -x,--major '$action=update; incversion=major' \
 | |
|         -z,--minor '$action=update; incversion=minor' \
 | |
|         -p,--patchlevel '$action=update; incversion=patchlevel' \
 | |
|         -k,--keep '$action=update; incversion=' \
 | |
|         -l:,--prelease:,--prerelease: '$action=update; setpr=1; setsnapshot=; setalpha=; setbeta=; setrc=; setrelease=; set@ setprelease; [ -z "$setprelease" ] && setrelease=1' \
 | |
|         -S,--snapshot '$action=update; setpr=1; setsnapshot=1; setalpha=; setbeta=; setrc=; setrelease=' \
 | |
|         -a,--alpha '$action=update; setpr=1; setsnapshot=; setalpha=1; setbeta=; setrc=; setrelease=' \
 | |
|         -b,--beta '$action=update; setpr=1; setsnapshot=; setalpha=; setbeta=1; setrc=; setrelease=' \
 | |
|         -r,--rc '$action=update; setpr=1; setsnapshot=; setalpha=; setbeta=; setrc=1; setrelease=' \
 | |
|         -R,--release,--final '$action=update; setpr=1; setsnapshot=; setalpha=; setbeta=; setrc=; setrelease=1' \
 | |
|         -m:,--metadata:,--set-metadata: '$action=update; setmd=1; resetmetadata=1; set@ setmetadata' \
 | |
|         --add-metadata: '$action=update; setmd=1; set@ addmetadata' \
 | |
|         -M,--vcs-metadata '$action=update; setmd=1; vcsmetadata=1' \
 | |
|         --vpath: vpath= \
 | |
|         --map: '$setmapfile=1; set@ mapfile' \
 | |
|         --allow-empty allow_empty=1 \
 | |
|         --convert convert=1 \
 | |
|         --no-convert convert= \
 | |
|         -t,--maven-update maven_update=1 \
 | |
|         @ args -- "$@" && set -- "${args[@]}" || { eerror "$args"; return 1; }
 | |
| 
 | |
|     # Calculer la source
 | |
|     if [ "$source" == auto-file -o "$source" == auto-string ]; then
 | |
|         [ -n "$file" ] || file=.
 | |
|         if [ -d "$file" ]; then
 | |
|             if [ -f "$file/$DEFAULT_POM" ]; then
 | |
|                 file="$file/$DEFAULT_POM"
 | |
|             elif [ -f "$file/$DEFAULT_FILE" ]; then
 | |
|                 file="$file/$DEFAULT_FILE"
 | |
|             elif [ -f "$file/version.txt" ]; then
 | |
|                 file="$file/version.txt"
 | |
|             else
 | |
|                 file="$file/$DEFAULT_FILE"
 | |
|             fi
 | |
|         fi
 | |
|         if [ "$source" == auto-file ]; then
 | |
|             if [[ "$file" == *.xml ]]; then source=pom
 | |
|             else source=file
 | |
|             fi
 | |
|         elif [ "$source" == auto-string ]; then
 | |
|             if [[ "$file" == *.xml ]]; then source=pom-string
 | |
|             else source=file-string
 | |
|             fi
 | |
|         fi
 | |
|         edebug "Auto-sélection de $(ppath "$file")"
 | |
| 
 | |
|     elif [ "$source" == auto-git-string ]; then
 | |
|         git_check_gitvcs || return 2
 | |
|         splitfsep2 "$git" : branch name
 | |
|         [ -n "$branch" ] || branch=master
 | |
|         if [ "$(git cat-file -t "$branch:$name" 2>/dev/null)" == tree ]; then
 | |
|             if git rev-parse --verify --quiet "$branch:${name:+$name/}$DEFAULT_POM" >/dev/null; then
 | |
|                 name="${name:+$name/}$DEFAULT_POM"
 | |
|             elif git rev-parse --verify --quiet "$branch:${name:+$name/}$DEFAULT_FILE" >/dev/null; then
 | |
|                 name="${name:+$name/}$DEFAULT_FILE"
 | |
|             elif git rev-parse --verify --quiet "$branch:${name:+$name/}version.txt" >/dev/null; then
 | |
|                 name="${name:+$name/}version.txt"
 | |
|             fi
 | |
|         fi
 | |
|         if git rev-parse --verify --quiet "$branch:$name" >/dev/null; then
 | |
|             if [[ "$name" == *.xml ]]; then source=git-pom-string
 | |
|             else source=git-file-string
 | |
|             fi
 | |
|             git="$branch:$name"
 | |
|             edebug "Auto-sélection de $git"
 | |
|         else
 | |
|             eerror "$name: fichier introuvable sur la branche $branch"
 | |
|             return 1
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     if [ "$source" == auto ]; then
 | |
|         source=file
 | |
|         for i in "$DEFAULT_POM" "$DEFAULT_FILE" version.txt; do
 | |
|             if [ -f "$i" ]; then
 | |
|                 case "$i" in
 | |
|                 "$DEFAULT_POM") source=pom; file="$i"; break;;
 | |
|                 *) source=file; file="$i"; break;;
 | |
|                 esac
 | |
|             fi
 | |
|         done
 | |
|     elif [ "$source" == file -o "$source" == pom ]; then
 | |
|         [ "$action" == auto ] && action=update
 | |
|     fi
 | |
|     [ "$source" == file -a -z "$file" ] && file="$DEFAULT_FILE"
 | |
|     [ "$source" == pom -a -z "$file" ] && file="$DEFAULT_POM"
 | |
|     [ "$action" == auto ] && action=show
 | |
| 
 | |
|     if [[ "$source" == auto* ]]; then
 | |
|         eerror "bug: impossible de déterminer la source"
 | |
|         return 1
 | |
|     fi
 | |
| 
 | |
|     if [ "$action" == show-source ]; then
 | |
|         echo "$source"
 | |
|         return 0
 | |
|     fi
 | |
| 
 | |
|     # Lire la version
 | |
|     local -a maprules
 | |
|     if [ "$source" == file -o "$source" == pom ]; then
 | |
|         local mapdir="$(dirname -- "$file")"
 | |
|         if [ -z "$setmapfile" ]; then
 | |
|             local tmpfile
 | |
|             tmpfile="$mapdir/.pver-map"
 | |
|             [ -f "$tmpfile" ] && mapfile="$tmpfile"
 | |
|         fi
 | |
|         if [ -n "$mapfile" ]; then
 | |
|             __pver_unless -f "$mapfile" "$mapfile: fichier introuvable" || return
 | |
| 
 | |
|             mapdir="$(dirname -- "$mapfile")"
 | |
|             array_from_lines maprules "$(<"$mapfile" filter_conf)"
 | |
|             local maprule filespec filevpath filename
 | |
|             local -a filenames
 | |
|             for maprule in "${maprules[@]}"; do
 | |
|                 splitpair "$maprule" filespec filevpath
 | |
|                 [ "$filevpath" != - ] || continue
 | |
|                 array_lsfiles filenames "$mapdir" "$filespec"
 | |
|                 [ ${#filenames[*]} -gt 0 ] || continue
 | |
|                 file="${filenames[0]}"
 | |
|                 if [[ "$file" == *.xml ]]; then source=pom
 | |
|                 else source=file
 | |
|                 fi
 | |
|                 edebug "Sélection de $file comme fichier de référence"
 | |
|                 break
 | |
|             done
 | |
|         fi
 | |
|     fi
 | |
|     [ "$source" == pom ] && maven_update=1
 | |
| 
 | |
|     if [ "$source" == file ]; then
 | |
|         [ -f "$file" ] && version="$(<"$file")"
 | |
| 
 | |
|     elif [ "$source" == file-string ]; then
 | |
|         if [ -z "$file" ]; then
 | |
|             file="$DEFAULT_FILE"
 | |
|         elif [ -d "$file" ]; then
 | |
|             file="$file/$DEFAULT_FILE"
 | |
|         fi
 | |
|         [ -f "$file" ] && version="$(<"$file")"
 | |
|         file=
 | |
| 
 | |
|     elif [ "$source" == git-file-string ]; then
 | |
|         git_check_gitvcs || return 2
 | |
|         splitfsep2 "$git" : branch name
 | |
|         [ -n "$branch" ] || branch=master
 | |
|         [ -n "$name" ] || name="$DEFAULT_FILE"
 | |
|         if git rev-parse --verify --quiet "$branch:$name" >/dev/null; then
 | |
|             version="$(git cat-file blob "$branch:$name" 2>/dev/null)"
 | |
|         fi
 | |
| 
 | |
|     elif [ "$source" == pom ]; then
 | |
|         __pver_unless -f "$file" "$file: fichier introuvable" || return
 | |
|         [ -n "$vpath" ] || vpath="$(__pver_pom_get_vpath "$file")"
 | |
|         version="$(__pver_pom_get_version "$file" "$vpath")"
 | |
| 
 | |
|     elif [ "$source" == pom-string ]; then
 | |
|         if [ -z "$file" ]; then file="$DEFAULT_POM"
 | |
|         elif [ -d "$file" ]; then file="$file/$DEFAULT_POM"
 | |
|         fi
 | |
|         __pver_unless -f "$file" "$file: fichier introuvable" || return
 | |
| 
 | |
|         [ -n "$vpath" ] || vpath="$(__pver_pom_get_vpath "$file")"
 | |
|         version="$(__pver_pom_get_version "$file" "$vpath")"
 | |
|         file=
 | |
| 
 | |
|     elif [ "$source" == git-pom-string ]; then
 | |
|         git_check_gitvcs || return 2
 | |
|         splitfsep2 "$git" : branch name
 | |
|         [ -n "$branch" ] || branch=master
 | |
|         [ -n "$name" ] || name="$DEFAULT_POM"
 | |
|         if git rev-parse --verify --quiet "$branch:$name" >/dev/null; then
 | |
|             local tmpfile; ac_set_tmpfile tmpfile
 | |
|             git cat-file blob "$branch:$name" >"$tmpfile" 2>/dev/null
 | |
|             [ -n "$vpath" ] || vpath="$(__pver_pom_get_vpath "$tmpfile")"
 | |
|             version="$(__pver_pom_get_version "$tmpfile" "$vpath")"
 | |
|             ac_clean "$tmpfile"
 | |
|         else
 | |
|             eerror "$name: fichier introuvable sur la branche $branch"
 | |
|             return 1
 | |
|         fi
 | |
| 
 | |
|     elif [ "$source" == git-prel-string ]; then
 | |
|         version="$(__pver_get_prel_version)" || return
 | |
|     fi
 | |
| 
 | |
|     [ -n "$version" -o -n "$allow_empty" ] || version=0.0.0
 | |
| 
 | |
|     # Conversion éventuelle du numéro de version
 | |
|     psemver_parse "$version"
 | |
|     [ -n "$valid" ] && convert=
 | |
|     if [ "$convert" == auto ]; then
 | |
|         [ -z "$valid" ] && convert=1
 | |
|     fi
 | |
|     if [ -n "$convert" -a -n "$version" ]; then
 | |
|         mversion="$(awkrun version="$version" '
 | |
| function nbdot(s) {
 | |
|   gsub(/[^.]/, "", s)
 | |
|   return length(s)
 | |
| }
 | |
| BEGIN {
 | |
|   ### utools, legacy
 | |
|   if (version ~ /[0-9]+(\.[0-9]+)*(-r[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9])?$/) {
 | |
|     metadata = ""
 | |
|     # traiter release date
 | |
|     pos = length(version) - 12
 | |
|     if (pos > 0) {
 | |
|       rdate = substr(version, pos + 3)
 | |
|       metadata = substr(rdate, 7, 4) substr(rdate, 4, 2) substr(rdate, 1, 2)
 | |
|       version = substr(version, 1, pos)
 | |
|     }
 | |
|     # traiter metadata
 | |
|     match(version, /[0-9]+(\.[0-9]+(\.[0-9]+)?)?/)
 | |
|     pos = RLENGTH
 | |
|     if (pos < length(version)) {
 | |
|       if (metadata != "") metadata = metadata "."
 | |
|       metadata = metadata substr(version, pos + 2)
 | |
|     }
 | |
|     version = substr(version, 1, pos)
 | |
|     # ajouter les éléments manquants
 | |
|     while (nbdot(version) < 2) {
 | |
|       version = version ".0"
 | |
|     }
 | |
|     # afficher la version migrée au format semver
 | |
|     if (metadata != "") print version "+r" metadata
 | |
|     else print version
 | |
| 
 | |
|   ### maven, pom.xml
 | |
|   } else if (version ~ /[0-9]+(\.[0-9]+)*(-[sS][nN][aA][pP][sS][hH][oO][tT])?$/) {
 | |
| 
 | |
|     prerelease = ""
 | |
|     # traiter prerelease
 | |
|     pos = length(version) - 9
 | |
|     if (pos > 0) {
 | |
|       prerelease = substr(version, pos + 2)
 | |
|       version = substr(version, 1, pos)
 | |
|     }
 | |
|     # traiter prerelease
 | |
|     match(version, /[0-9]+(\.[0-9]+(\.[0-9]+)?)?/)
 | |
|     pos = RLENGTH
 | |
|     if (pos < length(version)) {
 | |
|       if (prerelease != "") prerelease = prerelease "."
 | |
|       prerelease = prerelease substr(version, pos + 2)
 | |
|     }
 | |
|     version = substr(version, 1, pos)
 | |
|     # ajouter les éléments manquants
 | |
|     while (nbdot(version) < 2) {
 | |
|       version = version ".0"
 | |
|     }
 | |
|     # afficher la version migrée au format semver
 | |
|     if (prerelease != "") print version "-" prerelease
 | |
|     else print version
 | |
|   }
 | |
| }')"
 | |
|         if [ -n "$mversion" ]; then
 | |
|             version="$mversion"
 | |
|             psemver_parse "$version"
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     # Actions
 | |
|     if [ "$action" == show ]; then
 | |
|         if [ -n "$version" ]; then
 | |
|             if isatty; then
 | |
|                 estepi "La version actuelle est $version"
 | |
|             else
 | |
|                 echo "$version"
 | |
|             fi
 | |
|             return 0
 | |
|         else
 | |
|             if isatty; then
 | |
|                 estepi "Il n'y a pas de version définie"
 | |
|             fi
 | |
|             return 1
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     if [ "$action" == check ]; then
 | |
|         __pver_unless -n "$valid" "Numéro de version invalide: $version" || return
 | |
| 
 | |
|     elif [ "$action" == compare ]; then
 | |
|         psemver_parse "$oversion" o
 | |
| 
 | |
|         case "$operator" in
 | |
|         eq|same)
 | |
|             for var in valid major minor patchlevel; do
 | |
|                 ovar="o$var"
 | |
|                 [ "${!var}" == "${!ovar}" ] || return 1
 | |
|             done
 | |
|             array_eq prelease oprelease || return 1
 | |
|             if [ "$operator" == same ]; then
 | |
|                 array_eq metadata ometadata || return 1
 | |
|             fi
 | |
|             return 0
 | |
|             ;;
 | |
|         ne|diff)
 | |
|             for var in valid major minor patchlevel; do
 | |
|                 ovar="o$var"
 | |
|                 [ "${!var}" != "${!ovar}" ] && return 0
 | |
|             done
 | |
|             ! array_eq prelease oprelease && return 0
 | |
|             if [ "$operator" == diff ]; then
 | |
|                 ! array_eq metadata ometadata && return 0
 | |
|             fi
 | |
|             return 1
 | |
|             ;;
 | |
|         lt)
 | |
|             [ -z "$valid" -a -z "$ovalid" ] && return 1
 | |
|             [ "$major" -lt "$omajor" ] && return 0
 | |
|             [ "$major" -gt "$omajor" ] && return 1
 | |
|             [ "$minor" -lt "$ominor" ] && return 0
 | |
|             [ "$minor" -gt "$ominor" ] && return 1
 | |
|             [ "$patchlevel" -lt "$opatchlevel" ] && return 0
 | |
|             [ "$patchlevel" -gt "$opatchlevel" ] && return 1
 | |
|             case "$(psemver_compare_prelease "" o)" in
 | |
|             lt) return 0;;
 | |
|             esac
 | |
|             return 1
 | |
|             ;;
 | |
|         le)
 | |
|             [ -z "$valid" -a -z "$ovalid" ] && return 1
 | |
|             [ "$major" -lt "$omajor" ] && return 0
 | |
|             [ "$major" -gt "$omajor" ] && return 1
 | |
|             [ "$minor" -lt "$ominor" ] && return 0
 | |
|             [ "$minor" -gt "$ominor" ] && return 1
 | |
|             [ "$patchlevel" -lt "$opatchlevel" ] && return 0
 | |
|             [ "$patchlevel" -gt "$opatchlevel" ] && return 1
 | |
|             case "$(psemver_compare_prelease "" o)" in
 | |
|             lt|eq) return 0;;
 | |
|             esac
 | |
|             return 1
 | |
|             ;;
 | |
|         gt)
 | |
|             [ -z "$valid" -a -z "$ovalid" ] && return 1
 | |
|             [ "$major" -lt "$omajor" ] && return 1
 | |
|             [ "$major" -gt "$omajor" ] && return 0
 | |
|             [ "$minor" -lt "$ominor" ] && return 1
 | |
|             [ "$minor" -gt "$ominor" ] && return 0
 | |
|             [ "$patchlevel" -lt "$opatchlevel" ] && return 1
 | |
|             [ "$patchlevel" -gt "$opatchlevel" ] && return 0
 | |
|             case "$(psemver_compare_prelease "" o)" in
 | |
|             gt) return 0;;
 | |
|             esac
 | |
|             return 1
 | |
|             ;;
 | |
|         ge)
 | |
|             [ -z "$valid" -a -z "$ovalid" ] && return 1
 | |
|             [ "$major" -lt "$omajor" ] && return 1
 | |
|             [ "$major" -gt "$omajor" ] && return 0
 | |
|             [ "$minor" -lt "$ominor" ] && return 1
 | |
|             [ "$minor" -gt "$ominor" ] && return 0
 | |
|             [ "$patchlevel" -lt "$opatchlevel" ] && return 1
 | |
|             [ "$patchlevel" -gt "$opatchlevel" ] && return 0
 | |
|             case "$(psemver_compare_prelease "" o)" in
 | |
|             gt|eq) return 0;;
 | |
|             esac
 | |
|             return 1
 | |
|             ;;
 | |
|         esac
 | |
| 
 | |
|     elif  [ "$action" == update ]; then
 | |
|         [ -z "$version" -a -n "$allow_empty" ] && return 1
 | |
|         __pver_unless -n "$valid" "Numéro de version invalide: $version" || return
 | |
| 
 | |
|         if [ -n "$file" ]; then
 | |
|             if [ -f "$file" ]; then
 | |
|                 isatty && estepi "La version actuelle est $version"
 | |
|             elif [ "$source" == pom ]; then
 | |
|                 eerror "$file: fichier introuvable"
 | |
|                 return 1
 | |
|             elif isatty; then
 | |
|                 ask_yesno "Le fichier $(ppath "$file") n'existe pas. Faut-il le créer?" O || return 1
 | |
|             fi
 | |
|         fi
 | |
| 
 | |
|         # forcer le numéro de version
 | |
|         if [ -n "$setversion" ]; then
 | |
|             if [ "$setversion" == prel ]; then
 | |
|                 setversion="$(__pver_get_prel_version)"
 | |
|                 __pver_perror $? \
 | |
|                               "$(git_get_branch): n'est pas une release branch" \
 | |
|                               "Dépôt git introuvable" || return
 | |
|             fi
 | |
|             psemver_setversion "$setversion" "" || {
 | |
|                 eerror "Numéro de version invalide: $setversion"
 | |
|                 return 1
 | |
|             }
 | |
|         fi
 | |
| 
 | |
|         # Calculer metadata
 | |
|         if [ -n "$vcsmetadata" ]; then
 | |
|             resetmetadata=1
 | |
|             setmetadata="$(git rev-parse --short HEAD)" || return 1
 | |
|         fi
 | |
| 
 | |
|         # incrémenter les numéros de version
 | |
|         if [ -n "$maven_update" -a -n "$incversion" ]; then
 | |
|             # il y a des règles particulières pour maven
 | |
|             if [ -n "$setrelease" -a -z "$prelease" ]; then
 | |
|                 # on est déjà en release, faire le traitement normal
 | |
|                 maven_update=
 | |
|             elif [ -n "$setsnapshot" -a "$prelease" == SNAPSHOT ]; then
 | |
|                 # on est déjà en snapshot, faire le traitement normal, mais garder le préfixe SNAPSHOT
 | |
|                 maven_update=
 | |
|                 if [ "$incversion" == auto ]; then
 | |
|                     [ -n "$setmd" ] && incversion= || incversion=menu
 | |
|                 fi
 | |
|             elif [ -z "$prelease" ]; then
 | |
|                 # on est en release, passer en snapshot
 | |
|                 setsnapshot=1
 | |
|                 setrelease=
 | |
|                 if [ "$incversion" == auto ]; then
 | |
|                     [ -n "$setmd" ] && incversion= || incversion=menu
 | |
|                 fi
 | |
|             elif [ "$prelease" == SNAPSHOT ]; then
 | |
|                 # on est en snapshot, passer en release
 | |
|                 setsnapshot=
 | |
|                 setrelease=1
 | |
|                 if [ "$incversion" == auto ]; then
 | |
|                     [ -n "$setmd" ] && incversion= || incversion=menu
 | |
|                 fi
 | |
|             fi
 | |
|         fi
 | |
|         if [ "$incversion" == auto ]; then
 | |
|             [ -n "$setpr" -o -n "$setmd" ] && incversion= || incversion=menu
 | |
|         fi
 | |
|         if [ -z "$incversion" -a -n "$maven_update" ]; then
 | |
|             # on doit incrémenter avec les règles maven, mais aucune des options
 | |
|             # -[xzp] n'est spécifiée
 | |
|             if [ -n "$setrelease" ]; then
 | |
|                 incversion=patchlevel
 | |
|             elif [ -n "$setsnapshot" ]; then
 | |
|                 incversion=patchlevel
 | |
|             fi
 | |
|         fi
 | |
| 
 | |
|         if [ -n "$setrelease" ]; then setprelease=
 | |
|         elif [ -n "$setsnapshot" ]; then setprelease=SNAPSHOT
 | |
|         fi
 | |
|         if [ "$incversion" == menu ]; then
 | |
|             psemver_copy x
 | |
|             psemver_incsetprmd major x "$setprelease" 1 "$setmetadata" "$addmetadata" "$maven_update"
 | |
|             psemver_setvar versionx x
 | |
|             psemver_copy z
 | |
|             psemver_incsetprmd minor z "$setprelease" 1 "$setmetadata" "$addmetadata" "$maven_update"
 | |
|             psemver_setvar versionz z
 | |
|             psemver_copy p
 | |
|             psemver_incsetprmd patchlevel p "$setprelease" 1 "$setmetadata" "$addmetadata" "$maven_update"
 | |
|             psemver_setvar versionp p
 | |
|             psemver_copy k
 | |
|             psemver_incsetprmd "" k "$setprelease" "$resetmetadata" "$setmetadata" "$addmetadata" "$maven_update"
 | |
|             psemver_setvar versionk k
 | |
|             nextvs=(
 | |
|                 "$versionx : maj incompatibles de l'API (-x)"
 | |
|                 "$versionz : maj compatibles de l'API (-z)"
 | |
|                 "$versionp : correction de bugs (-p)"
 | |
|                 "$versionk : ne pas incrémenter la version"
 | |
|             )
 | |
|             if [ -z "$maven_update" ]; then
 | |
|                 nextv="${nextvs[1]}"
 | |
|             else
 | |
|                 nextv="${nextvs[2]}"
 | |
|             fi
 | |
|             simple_menu nextv nextvs \
 | |
|                 -t "Incrémenter le numéro de version" \
 | |
|                 -m "Veuillez choisir la prochaine version"
 | |
|             case "${nextv%)}" in
 | |
|             *-x) incversion=major;;
 | |
|             *-z) incversion=minor;;
 | |
|             *-p) incversion=patchlevel;;
 | |
|             *) incversion=;;
 | |
|             esac
 | |
|         fi
 | |
| 
 | |
|         local r
 | |
|         if [ -n "$incversion" ]; then
 | |
|             psemver_incsetprmd "$incversion" "" "$setprelease" 1 "$setmetadata" "$addmetadata" "$maven_update"
 | |
|             r=$?
 | |
|         else
 | |
|             psemver_setprmd "" "$setprelease" "$resetmetadata" "$setmetadata" "$addmetadata"
 | |
|             r=$?
 | |
|         fi
 | |
|         case $r in
 | |
|         2) eerror "Identifiant de pre-release invalide: $setprelease"; return 1;;
 | |
|         3) eerror "Identifiant de build invalide: $setmetadata"; return 1;;
 | |
|         4) eerror "Identifiant de build invalide: $addmetadata"; return 1;;
 | |
|         esac
 | |
| 
 | |
|         # afficher le résultat final
 | |
|         local -a depfiles regfiles
 | |
|         psemver_setvar version
 | |
|         if [ -n "$file" ]; then
 | |
|             if [ "$source" == file ]; then
 | |
|                 echo "$version" >"$file"
 | |
|             elif [ "$source" == pom ]; then
 | |
|                 __pver_pom_set_version "$file" "$version"
 | |
|                 [ $? -eq 3 ] && return 1
 | |
|             fi
 | |
|             if [ ${#maprules[*]} -gt 0 ]; then
 | |
|                 # mettre à jour les fichiers mentionnés dans mapfile
 | |
|                 local -a donefiles
 | |
|                 for maprule in "${maprules[@]}"; do
 | |
|                     splitpair "$maprule" filespec filevpath
 | |
|                     array_lsfiles filenames "$mapdir" "$filespec"
 | |
|                     for file in "${filenames[@]}"; do
 | |
|                         file="$(abspath "$file")"
 | |
|                         edebug "Examen de $file"
 | |
|                         # si c'est un wildcard, ne traiter que si le fichier n'a
 | |
|                         # pas encore été traité
 | |
|                         case "$filespec" in *\**|*\?*) array_contains donefiles "$file" && break;; esac
 | |
|                         if [ "$filevpath" != - ]; then
 | |
|                             if [[ "$file" == *.xml ]]; then
 | |
|                                 edebug "Maj version de $file au chemin XPATH ${filevpath:-par défaut}"
 | |
|                                 __pver_pom_set_version "$file" "$version" "$filevpath"
 | |
|                                 case $? in
 | |
|                                 0|1) array_addu regfiles "$file";;
 | |
|                                 2) array_addu depfiles "$file";;
 | |
|                                 *) return 1;;
 | |
|                                 esac
 | |
|                             else
 | |
|                                 edebug "Maj version de $file"
 | |
|                                 echo "$version" >"$file"
 | |
|                             fi
 | |
|                         else
 | |
|                             edebug "Fichier $file ignoré"
 | |
|                         fi
 | |
|                         array_addu donefiles "$file"
 | |
|                     done
 | |
|                 done
 | |
|             fi
 | |
|         fi
 | |
|         if isatty; then
 | |
|             estepn "La nouvelle version est $version"
 | |
|             if [ ${#depfiles[*]} -gt 0 ]; then
 | |
|                 local msg
 | |
|                 for file in "${depfiles[@]}"; do
 | |
|                     array_contains regfiles "$file" && continue
 | |
|                     if [ -z "$msg" ]; then
 | |
|                         msg="Les fichiers suivants ont été modifiés, et leur version doit être mise à jour:"
 | |
|                     fi
 | |
|                     msg="$msg
 | |
|     $(qvals pver -uw "$file" -R -p)"
 | |
|                 done
 | |
|                 [ -n "$msg" ] && eimportant "$msg"
 | |
|             fi
 | |
|         else
 | |
|             echo "$version"
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     return 0
 | |
| }
 |