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
|
|
}
|