241 lines
9.2 KiB
Bash
Executable File
241 lines
9.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
|
|
if [ $# -eq 1 -a "$1" == --nutools-completion ]; then
|
|
echo '
|
|
function __prel_completion() {
|
|
local cur
|
|
_get_comp_words_by_ref cur
|
|
COMPREPLY=($(compgen -W "$(__prel_branches)" "$cur"))
|
|
}
|
|
complete -F __prel_completion prel
|
|
'
|
|
exit 0
|
|
fi
|
|
|
|
source "$(dirname "$0")/../lib/ulib/ulib" || exit 1
|
|
#source "$(dirname "$0")/lib/ulib/ulib" || exit 1
|
|
urequire DEFAULTS ptools
|
|
|
|
# XXX ajouter la possibilité de faire des pré-releases, --alpha, --beta, --rc
|
|
# les pré-releases restent dans la branche de release, et vivent leur vie,
|
|
# jusqu'à la release finale qui est mergée dans master. Il faudrait aussi une
|
|
# option pour merger les modifications de la branche de release dans develop
|
|
|
|
function display_help() {
|
|
uecho "$scriptname: basculer sur une branche de release
|
|
|
|
USAGE
|
|
$scriptname -u [SOURCE]
|
|
$scriptname -c [RELEASE [SOURCE]]
|
|
$scriptname -m|-l|-d [RELEASE]
|
|
|
|
- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
|
|
commit ou un stash.
|
|
- Avec l'option -c, s'il existe une branche de release, proposer de basculer
|
|
vers elle ou sur la branche master. Sinon, basculer sur la branche master.
|
|
- Avec l'option -u, proposer ou fixer une branche de release à créer. Si elle
|
|
existe déjà, basculer vers elle. Sinon, la créer en la basant sur SOURCE, qui
|
|
vaut par défaut develop
|
|
|
|
OPTIONS
|
|
-C, --projdir PROJDIR
|
|
Spécifier le répertoire de base du projet qui est dans git. Par défaut,
|
|
on travaille dans le répertoire courant et on laisse git trouver le
|
|
répertoire de base du projet. Avec cette option, le répertoire courant
|
|
est modifié avant de lancer les commandes git.
|
|
-O, --origin ORIGIN
|
|
Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
|
|
-o, --offline
|
|
En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
|
|
tenter le cas échéant de traquer la branche dans l'origine; ne pas
|
|
supprimer une branche dans l'origine. Cette option est automatiquement
|
|
activée si la variable UTOOLS_VCS_OFFLINE est définie.
|
|
--online
|
|
Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
|
|
|
|
-c, --checkout
|
|
Basculer vers une branche de release existante. C'est l'option par
|
|
défaut. Si aucune branche de release n'existe, basculer vers master
|
|
-u, --update
|
|
Préparer une nouvelle release. Utiliser une des options -x, -z ou -p
|
|
pour spécifier le type de release à préparer. Si la branche qui serait
|
|
créée pour le type de release existe déjà, basculer vers cette branche.
|
|
S'il faut la créer, la baser sur la branche SOURCE, qui vaut par défaut
|
|
develop
|
|
--menu
|
|
-x, --major
|
|
-z, --minor
|
|
-p, --patchlevel
|
|
Utilisé avec l'option -u, soit afficher un menu pour choisir la version
|
|
de la nouvelle release (par défaut), soit préparer respectivement une
|
|
release majeure, mineure, ou pour correction de bug.
|
|
-v-OPT
|
|
Avec l'option -u, spécifier une option de pver permettant de choisir la
|
|
version de la nouvelle release. Les options supportées sont -v, -l, -a,
|
|
-b, -r et -R. Par exemple, si la version actuelle sur la branche master
|
|
est 0.2.3, les options '-uz -v-lbeta' permettent de préparer la release
|
|
0.3.0-beta
|
|
En principe, cette option n'a pas à être utilisée, puisque dans une
|
|
branche de release, on peut faire vivre les versions de pré-release
|
|
jusqu'à la release finale. Ainsi, la branche de release est nommée
|
|
d'après la version finale, mais le projet peut recevoir une version de
|
|
pré-release incrémentale.
|
|
|
|
-m, --merge
|
|
Si la branche actuelle est une branche de release, ou s'il existe une
|
|
branche de release, la merger dans master, puis dans develop, puis la
|
|
supprimer. Puis basculer sur la branche master.
|
|
S'il n'existe pas de branche de release, proposer de fusionner les
|
|
modifications de la branche develop dans la branche master, sans
|
|
préparer de branche de release au préalable.
|
|
-l, --log
|
|
Afficher les modifications actuellement effectuée dans la branche de
|
|
release par rapport à develop.
|
|
-d, --diff
|
|
Afficher les modifications actuellement effectuée dans la branche de
|
|
release par rapport à develop, sous forme de diff."
|
|
}
|
|
|
|
projdir=
|
|
origin=origin
|
|
action=checkout
|
|
incversion=
|
|
pver_opts=()
|
|
log=
|
|
diff=
|
|
parse_opts "${PRETTYOPTS[@]}" \
|
|
--help '$exit_with display_help' \
|
|
-C:,--projdir: projdir= \
|
|
-O:,--origin: origin= \
|
|
-o,--offline UTOOLS_VCS_OFFLINE=1 \
|
|
--online UTOOLS_VCS_OFFLINE= \
|
|
-c,--checkout '$action=checkout' \
|
|
-u,--update '$action=update; [ -z "$incversion" ] && incversion=auto' \
|
|
--menu '$action=update; incversion=menu' \
|
|
-x,--major '$action=update; incversion=major' \
|
|
-z,--minor '$action=update; incversion=minor' \
|
|
-p,--patchlevel '$action=update; incversion=patchlevel' \
|
|
-v: '$action=update; add@ pver_opts' \
|
|
-m,--merge action=merge \
|
|
-l,--log '$action=diff; log=1' \
|
|
-d,--diff '$action=diff; diff=1' \
|
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
|
|
|
if [ -n "$projdir" ]; then
|
|
cd "$projdir" || die
|
|
fi
|
|
|
|
git_ensure_gitvcs
|
|
|
|
setx branch=git_get_branch
|
|
|
|
if [ "$action" == update ]; then
|
|
setx version=pver -g ""
|
|
|
|
if [ "$incversion" == auto ]; then
|
|
if [ ${#pver_opts[*]} -gt 0 ]; then
|
|
# des options ont été spécifiées, les honorer
|
|
setx specv=pver -s "$version" "${pver_opts[@]}"
|
|
release="release-$specv"
|
|
else
|
|
# sinon, prendre une décision en fonction des branches de release
|
|
# qui existent déjà
|
|
setx -a branches=list_release_branches
|
|
if [ ${#branches[*]} -eq 0 ]; then
|
|
# en l'absence de branche de release, proposer d'en créer une
|
|
incversion=menu
|
|
elif [ ${#branches[*]} -eq 1 ]; then
|
|
# s'il n'y en a qu'une, la prendre
|
|
release="${branches[0]}"
|
|
else
|
|
# sinon, donner le choix dans un menu
|
|
array_add branches master
|
|
default_branch="$branch"
|
|
array_contains branches "$default_branch" || default_branch="${branches[0]}"
|
|
simple_menu release branches -d "$default_branch" \
|
|
-t "Basculer vers une release branch" \
|
|
-m "Veuillez choisir la branche vers laquelle basculer"
|
|
fi
|
|
fi
|
|
fi
|
|
case "$incversion" in
|
|
menu)
|
|
setx majorv=pver -s "$version" -ux "${pver_opts[@]}"
|
|
setx minorv=pver -s "$version" -uz "${pver_opts[@]}"
|
|
setx patchlevelv=pver -g "$version" -up "${pver_opts[@]}"
|
|
release="release-$minorv"
|
|
branches=("release-$majorv" "release-$minorv" "release-$patchlevelv" master)
|
|
simple_menu release branches \
|
|
-t "Basculer vers une nouvelle release branch" \
|
|
-m "Veuillez choisir la branche à créer"
|
|
;;
|
|
major)
|
|
setx majorv=pver -s "$version" -ux "${pver_opts[@]}"
|
|
release="release-$majorv"
|
|
;;
|
|
minor)
|
|
setx minorv=pver -s "$version" -uz "${pver_opts[@]}"
|
|
release="release-$minorv"
|
|
;;
|
|
patchlevel)
|
|
setx patchlevelv=pver -g "$version" -up "${pver_opts[@]}"
|
|
release="release-$patchlevelv"
|
|
;;
|
|
esac
|
|
|
|
set -- "$release" "$1"
|
|
action=checkout
|
|
fi
|
|
|
|
if [ "$action" == checkout ]; then
|
|
release="$1"
|
|
source="${2:-develop}"
|
|
|
|
if [ -z "$release" ]; then
|
|
setx -a branches=list_release_branches
|
|
|
|
if [ ${#branches[*]} -eq 0 ]; then
|
|
# en l'absence de branche de release, basculer sur master
|
|
release=master
|
|
elif [ ${#branches[*]} -eq 1 ]; then
|
|
# s'il n'y en a qu'une, la prendre
|
|
release="${branches[0]}"
|
|
else
|
|
# sinon, donner le choix dans un menu
|
|
array_add branches master
|
|
default_branch="$branch"
|
|
array_contains branches "$default_branch" || default_branch="${branches[0]}"
|
|
simple_menu release branches -d "$default_branch" \
|
|
-t "Basculer vers une release branch" \
|
|
-m "Veuillez choisir la branche vers laquelle basculer"
|
|
fi
|
|
fi
|
|
|
|
# On est peut-être déjà sur la bonne branche
|
|
if git_is_branch "$release"; then
|
|
if [ -z "$UTOOLS_VCS_OFFLINE" ]; then
|
|
git_track_branch "$release" "$origin"
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
# Créer/basculer vers une release branch
|
|
git_ensure_cleancheckout
|
|
is_any_branch "$release" master release || die "$release: ce n'est pas une release branch"
|
|
if git_have_branch "$release"; then
|
|
git checkout "$release"
|
|
else
|
|
estepn "\
|
|
Vous allez créer la nouvelle release branch ${COULEUR_VERTE}$release${COULEUR_NORMALE}
|
|
à partir de la branche source ${COULEUR_BLEUE}$source${COULEUR_NORMALE}"
|
|
ask_yesno "Voulez-vous continuer?" O || die
|
|
|
|
git_ensure_branch "$release" "$source" "$origin"
|
|
[ $? -eq 2 ] && die "Impossible de créer la branche $release. Veuillez vérifier que la branche $source existe"
|
|
git checkout "$release"
|
|
fi
|
|
|
|
exit $?
|
|
fi
|