nulib/wip/prel

191 lines
6.0 KiB
Plaintext
Raw Normal View History

2025-02-20 10:13:53 +04:00
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/../load.sh" || exit 1
2025-02-25 15:51:46 +04:00
require: git pman pman.conf
2025-02-20 10:13:53 +04:00
2025-02-24 21:38:47 +04:00
git_cleancheckout_DIRTY="\
Vous avez des modifications locales.
Enregistrez ces modifications avant de créer une release"
function show_action() {
local commits
setx commits=_list_commits
if [ -n "$commits" ]; then
einfo "Commits à fusionner $SrcBranch --> $DestBranch"
eecho "$commits"
fi
}
2025-02-26 11:43:33 +04:00
function ensure_branches() {
[ -n "$SrcBranch" -a -n "$DestBranch" ] ||
die "$SrcBranch: Aucune configuration de fusion trouvée pour cette branche"
2025-02-25 12:20:16 +04:00
2025-02-26 11:43:33 +04:00
array_contains LocalBranches "$SrcBranch" || die "$SrcBranch: branche source introuvable"
array_contains LocalBranches "$DestBranch" || die "$DestBranch: branche destination introuvable"
2025-02-25 12:20:16 +04:00
}
2025-02-24 21:38:47 +04:00
function release_develop_action() {
local script=".git/rel-release.sh"
local -a push_branches push_tags
if [ -n "$ReleaseBranch" ]; then
2025-02-25 12:20:16 +04:00
Version="${ReleaseBranch#$RELEASE}"
2025-02-24 21:38:47 +04:00
release_release_action "$@"; return $?
2025-02-25 12:20:16 +04:00
elif [ -n "$HotfixBranch" ]; then
Version="${HotfixBranch#$HOTFIX}"
release_hotfix_action "$@"; return $?
2025-02-24 21:38:47 +04:00
fi
2025-02-25 12:20:16 +04:00
[ -n "$Version" ] || die "Vous devez spécifier la version de la release"
2025-02-24 21:38:47 +04:00
ReleaseBranch="${RELEASE}$Version"
if [ -n "$Merge" ]; then
enote "\
Ce script va:
- créer la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE}
- la provisionner avec une description des changements
- la fusionner dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}${Push:+
- pousser les branches modifiées}"
else
enote "\
Ce script va:
- créer la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE}
- la provisionner avec une description des changements
Vous devrez:
- mettre à jour les informations de release puis relancer ce script"
fi
ask_yesno "Voulez-vous continuer?" O || die
2025-02-25 12:20:16 +04:00
local comment=
local or_die=" || exit 1"
_rscript_start
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
################################################################################
# create
if [ -n "\$create" ]; then
2025-02-26 11:43:33 +04:00
echo "== Création de la release"
2025-02-25 12:20:16 +04:00
EOF
2025-02-24 21:38:47 +04:00
_create_release_branch
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
fi
EOF
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
################################################################################
# merge
if [ -n "\$merge" ]; then
2025-02-26 11:43:33 +04:00
echo "== Fusionner la release"
2025-02-25 12:20:16 +04:00
EOF
_merge_release_branch "$DestBranch" "$TAG_PREFIX$Version$TAG_SUFFIX"
2025-02-24 21:38:47 +04:00
_merge_release_branch "$SrcBranch"
_delete_release_branch
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
fi
EOF
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
################################################################################
# push
if [ -n "\$push" ]; then
2025-02-26 11:43:33 +04:00
echo "== Pousser branches et tags"
2025-02-25 12:20:16 +04:00
EOF
2025-02-24 21:38:47 +04:00
_push_branches
_push_tags
2025-02-25 15:51:46 +04:00
_script_add <<EOF
2025-02-25 12:20:16 +04:00
fi
EOF
2025-02-24 21:38:47 +04:00
2025-02-25 12:20:16 +04:00
if ! "$script" create ${Merge:+merge} ${Push:+push}; then
2025-02-24 21:38:47 +04:00
eimportant "Veuillez consulter le script $script pour le détail des opérations qui n'ont pas pu êtres effectuées"
2025-02-26 11:43:33 +04:00
die
2025-02-25 12:20:16 +04:00
elif [ -z "$_KeepScript" ]; then
2025-02-24 21:38:47 +04:00
rm "$script"
fi
}
2025-02-26 11:43:33 +04:00
function merge_release_main_action() {
2025-02-24 21:38:47 +04:00
enote "\
Vous allez:
- fusionner la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE}
dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
}
2025-02-26 11:43:33 +04:00
function merge_hotfix_main_action() {
2025-02-25 12:20:16 +04:00
enote "\
Vous allez intégrer la branche de hotfix ${COULEUR_JAUNE}$HotfixBranch${COULEUR_NORMALE}
dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
2025-02-24 21:38:47 +04:00
}
2025-02-25 12:20:16 +04:00
################################################################################
# Programme principal
################################################################################
2025-02-20 10:13:53 +04:00
chdir=
2025-02-24 21:38:47 +04:00
Origin=
2025-02-25 12:20:16 +04:00
ConfigBranch=
ConfigFile=
2025-02-24 21:38:47 +04:00
Action=release
Merge=1
Push=1
Version=
2025-02-25 12:20:16 +04:00
_KeepScript=
2025-02-20 10:13:53 +04:00
args=(
2025-02-24 21:38:47 +04:00
"faire une nouvelle release à partir de la branche source"
" -gv VERSION [source]"
2025-02-20 10:13:53 +04:00
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
2025-02-24 21:38:47 +04:00
-o:,--origin Origin= "++\
origine à partir de laquelle les branches distantes sont considérées"
2025-02-25 12:20:16 +04:00
-b:,--config-branch ConfigBranch= "++\
branche à partir de laquelle charger la configuration"
-c:,--config-file:CONFIG ConfigFile= "++\
fichier de configuration des branches. cette option est prioritaire sur --config-branch
par défaut, utiliser le fichier .pman.conf dans le répertoire du dépôt s'il existe"
--keep-script _KeepScript=1 "++option non documentée"
2025-02-24 21:38:47 +04:00
-s,--show Action=show "\
lister les modifications qui seraient intégrées dans la release"
--release Action=release "créer la release. c'est l'action par défaut"
-k,--no-merge Merge= "\
ne pas fusionner la branche de release après l'avoir créée. implique --no-push"
-m,--merge Merge=1 "++\
fusionner la branche de release après l'avoir créée.
c'est l'option par défaut"
-n,--no-push Push= "\
ne pas pousser les branches vers leur origine après la création de la release"
-p,--push Push=1 "++\
pousser les branches vers leur origine après la création de la release.
c'est l'option par défaut"
-v:,--version Version= "\
spécifier la version de la release à créer"
2025-02-20 10:13:53 +04:00
)
parse_args "$@"; set -- "${args[@]}"
2025-02-24 21:38:47 +04:00
# charger la configuration
2025-02-26 11:43:33 +04:00
ensure_gitdir "$chdir"
load_branches all
load_config
load_branches current "$1"; shift
2025-02-24 21:38:47 +04:00
if [ -n "$Merge" -a -n "$NOAUTO" ]; then
ewarn "L'option --no-merge a été forcée puisque ce dépôt ne supporte pas les releases automatiques"
Merge=
fi
[ -z "$Merge" ] && Push=
2025-02-20 10:13:53 +04:00
2025-02-24 21:38:47 +04:00
# puis faire l'action que l'on nous demande
case "$Action" in
show)
git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY"
ensure_branches
show_action "$@"
;;
2025-02-20 10:13:53 +04:00
release)
2025-02-24 21:38:47 +04:00
git_ensure_cleancheckout
ensure_branches
2025-02-26 11:43:33 +04:00
case "$SrcType" in
release) merge_release_main_action "$@";;
hotfix) merge_hotfix_main_action "$@";;
*) release_develop_action "$@";;
esac
2025-02-20 10:13:53 +04:00
;;
esac