#!/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 require: git pman pman.conf 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 } function ensure_branches() { [ -n "$SrcBranch" -a -n "$DestBranch" ] || die "$SrcBranch: Aucune configuration de fusion trouvée pour cette branche" array_contains LocalBranches "$SrcBranch" || die "$SrcBranch: branche source introuvable" array_contains LocalBranches "$DestBranch" || die "$DestBranch: branche destination introuvable" Tag="$TAG_PREFIX$Version$TAG_SUFFIX" local -a tags setx -a tags=git tag -l "${TAG_PREFIX}*${TAG_SUFFIX}" if [ -z "$ForceCreate" ]; then array_contains tags "$Tag" && die "$Tag: le tag correspondant à la version existe déjà" fi } function create_release_action() { if [ -n "$ReleaseBranch" ]; then Version="${ReleaseBranch#$RELEASE}" Tag="$TAG_PREFIX$Version$TAG_SUFFIX" merge_release_action "$@"; return $? elif [ -n "$HotfixBranch" ]; then Version="${HotfixBranch#$HOTFIX}" Tag="$TAG_PREFIX$Version$TAG_SUFFIX" merge_hotfix_action "$@"; return $? fi if [ -z "$Version" -a -n "$CurrentVersion" -a -f VERSION.txt ]; then Version="$(<VERSION.txt)" Tag="$TAG_PREFIX$Version$TAG_SUFFIX" fi if [ -z "$Version" ]; then [ -f VERSION.txt ] && einfo "La version actuelle est $(<VERSION.txt)" die "Vous devez spécifier la version de la nouvelle release avec l'une des options -v ou -C" fi 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 local script=".git/pman-release.sh" local -a push_branches push_tags local comment= local or_die=" || exit 1" _rscript_start _scripta <<EOF ################################################################################ # create if [ -n "\$create" ]; then esection "Création de la release" EOF _rscript_create_release_branch [ -n "$AFTER_CREATE_RELEASE" ] && _scripta <<EOF ( $AFTER_CREATE_RELEASE )$or_die EOF _scripta <<EOF fi EOF _scripta <<EOF ################################################################################ # merge if [ -n "\$merge" ]; then esection "Fusionner la release" EOF _rscript_merge_release_branch "$DestBranch" "$Tag" _rscript_merge_release_branch "$SrcBranch" _rscript_delete_release_branch [ -n "$AFTER_MERGE_RELEASE" ] && _scripta <<EOF ( $AFTER_MERGE_RELEASE )$or_die EOF _scripta <<EOF fi EOF _scripta <<EOF ################################################################################ # push if [ -n "\$push" ]; then esection "Pousser branches et tags" EOF _script_push_branches _script_push_tags [ -n "$AFTER_PUSH_RELEASE" ] && _scripta <<EOF ( $AFTER_PUSH_RELEASE )$or_die EOF _scripta <<EOF fi EOF [ -n "$Merge" ] && Merged=1 || Merged= [ -n "$Push" -o "$ForbidPush" ] && Pushed=1 || Pushed= if [ -n "$_NoRunScript" ]; then einfo "Veuillez consulter le script $script pour le détail des opérations à effectuer" elif ! "$script" create ${Merge:+merge} ${Push:+push}; then eimportant "Veuillez consulter le script $script pour le détail des opérations qui n'ont pas pu êtres effectuées" die elif [ -n "$Merged" -a -n "$Pushed" ]; then [ -n "$_KeepScript" ] || rm "$script" else local cmd [ -n "$Merged" ] || cmd="$cmd ./$script merge" [ -n "$Pushed" ] || cmd="$cmd ./$script push" einfo "Le script $script a été lancé avec les arguments 'create${Merge:+ merge}${Push:+ push}' Veuillez le consulter pour le détail des autres opérations à effectuer$cmd" fi } function merge_release_action() { 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 } function merge_hotfix_action() { 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 } ################################################################################ # Programme principal ################################################################################ chdir= Origin= ConfigBranch= ConfigFile= _KeepScript= _NoRunScript= action=release [ -z "$PMAN_NO_MERGE" ] && Merge=1 || Merge= [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= Version= CurrentVersion= ForceCreate= args=( "faire une nouvelle release à partir de la branche source" " -v VERSION [source]" -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations" -O:,--origin Origin= "++\ origine à partir de laquelle les branches distantes sont considérées" -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" --no-run-script _NoRunScript=1 "++option non documentée" -w,--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" --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" --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" -C,--current-version CurrentVersion=1 "++\ si aucune version n'est spécifiée, prendre la version présente dans le fichier VERSION.txt" -f:,--force-create ForceCreate= "\ forcer la création de la release même si le tag correspond à la version existe déjà" ) parse_args "$@"; set -- "${args[@]}" # charger la configuration ensure_gitdir "$chdir" load_branches all load_config "$MYNAME" load_branches current "$1"; shift 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= ForbidPush= [ -n "$Origin" ] || Origin=origin if ! git_have_remote "$Origin" && [ -n "$Push" ]; then ewarn "L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine" ForbidPush=1 fi [ -n "$ForbidPush" ] && Push= # puis faire l'action que l'on nous demande case "$action" in show) git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY" ensure_branches show_action "$@" ;; release) git_ensure_cleancheckout ensure_branches case "$SrcType" in release) merge_release_action "$@";; hotfix) merge_hotfix_action "$@";; *) create_release_action "$@";; esac ;; *) die "$action: action non implémentée" ;; esac