#!/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 fusionner la branche" 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" } function merge_action() { [ -z "$ShouldPush" ] && enote "\ L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine" enote "\ Ce script va - fusionner la branche ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE} dans ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}${Push:+ - pousser les branches modifiées}" ask_yesno "Voulez-vous continuer?" O || die local script=".git/pman-merge.sh" local -a push_branches delete_branches local after local comment= local or_die=" || exit 1" _mscript_start _scripta <<EOF ################################################################################ # merge if [ -n "\$merge" ]; then esection "Fusionner la branche" EOF _mscript_merge_branch after="AFTER_MERGE_${SrcType^^}"; [ -n "${!after}" ] && _scripta <<EOF ( ${!after} )$or_die EOF _scripta <<EOF fi EOF if [ -n "$ShouldDelete" ]; then _scripta <<EOF ################################################################################ # delete if [ -n "\$delete" ]; then esection "Supprimer la branche" EOF _mscript_delete_branch after="AFTER_DELETE_${SrcType^^}"; [ -n "${!after}" ] && _scripta <<EOF ( ${!after} )$or_die EOF _scripta <<EOF fi EOF fi _scripta <<EOF ################################################################################ # push if [ -n "\$push" ]; then esection "Pousser les branches" EOF _script_push_branches if [ ${#delete_branches[*]} -gt 0 ]; then _scripta <<<"if [ -n \"\$delete\" ]; then" push_branches=("${delete_branches[@]}") _script_push_branches _scripta <<<fi fi after="AFTER_PUSH_${DestType^^}"; [ -n "${!after}" ] && _scripta <<EOF ( ${!after} )$or_die EOF _scripta <<EOF fi EOF [ -n "$ShouldDelete" -a -n "$Delete" ] && ShouldDelete= [ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush= if [ -n "$_NoRunScript" ]; then einfo "Veuillez consulter le script $script pour le détail des opérations à effectuer" elif ! "$script" merge ${Delete:+delete} ${Push:+push}; then eimportant "\ Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' En cas d'erreur de merge, veuillez corriger les erreurs puis continuer avec git merge --continue Sinon, veuillez consulter le script et/ou le relancer ./$script${Delete:+ delete}${Push:+ push}" die elif [ -n "$Delete" -a -n "$Push" ]; then [ -n "$_KeepScript" ] || rm "$script" else einfo "\ Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' Vous pouvez consulter le script et/ou le relancer ./$script${ShouldDelete:+ delete}${ShouldPush:+ push}" fi } ################################################################################ # Programme principal ################################################################################ chdir= Origin= ConfigBranch= ConfigFile= _KeepScript= _NoRunScript= action=merge TechMerge= SquashMsg= [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= [ -z "$PMAN_NO_DELETE" ] && Delete=1 || Delete= args=( "fusionner la branche source dans la branche destination correspondante" " [source] CONFIGURATION Le fichier .pman.conf contient la configuration des branches.Les variables supplémentaires suivantes peuvent être définies: AFTER_MERGE_<srcType> AFTER_DELETE_<srcType> AFTER_PUSH_<destType> xxxType valant UPSTREAM, DEVELOP, FEATURE, RELEASE, MAIN, HOTFIX, DIST" -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 fusionnées dans la branche destination" -b,--rebase action=rebase "\ lancer git rebase -i sur la branche source. cela permet de réordonner les commits pour nettoyer l'historique avant la fusion" --merge action=merge "++\ fusionner la branche source dans la branche destination correspondante. c'est l'action par défaut" --tech-merge TechMerge=1 "++option non documentée" -s:,--squash:COMMIT_MSG SquashMsg= "\ fusionner les modifications de la branche comme un seul commit. cette option ne devrait pas être utilisée avec --no-delete" -n,--no-push Push= "\ ne pas pousser les branches vers leur origine après la fusion" --push Push=1 "++\ pousser les branches vers leur origine après la fusion. c'est l'option par défaut" -k,--no-delete Delete= "\ ne pas supprimer la branche après la fusion dans la destination" --delete Delete=1 "++\ supprimer la branche après la fusion dans la destination. c'est l'option par défaut" ) parse_args "$@"; set -- "${args[@]}" # charger la configuration ensure_gitdir "$chdir" load_branches all load_config "$MYNAME" load_branches current "$1" ShouldPush=1 [ -n "$Origin" ] || Origin=origin if ! git_have_remote "$Origin" && [ -n "$Push" ]; then ShouldPush= fi [ -z "$ShouldPush" ] && 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 "$@" ;; merge) ShouldDelete=1 case "$SrcType" in develop|release|hotfix) die "$SrcBranch: cette branche doit être fusionnée dans $DestBranch avec prel" ;; *) # n'autoriser la suppression que pour feature [ "$SrcType" == feature ] || ShouldDelete= ;; esac [ -z "$ShouldDelete" ] && Delete= git_ensure_cleancheckout if ! array_contains LocalBranches "$SrcBranch"; then # si la branche source n'existe pas, la créer args=(--origin "$Origin") if [ -n "$ConfigFile" ]; then args+=(--config-file "$ConfigFile") elif [ -n "$ConfigBranch" ]; then args+=(--config-branch "$ConfigBranch") fi [ -z "$Push" ] && args+=(--no-push) exec "$MYDIR/pman" "${args[@]}" "$FEATURE${SrcBranch#$FEATURE}" else ensure_branches merge_action "$@" fi ;; *) die "$action: action non implémentée" ;; esac