#!/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() { local -a push_branches 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 -a push_branches einfo "Fusion ${SquashMsg:+squash }dans $DestBranch" git checkout "$DestBranch" || die if [ -n "$SquashMsg" ]; then git merge "$SrcBranch" --squash git commit -m "$SquashMsg" else git merge "$SrcBranch" --no-ff -m "Intégration de la branche $SrcBranch" fi push_branches+=("$DestBranch") if [ -n "$Delete" ]; then einfo "Supprimer la branche $SrcBranch" git branch -D "$SrcBranch" push_branches+=(":$SrcBranch") fi _push_branches } ################################################################################ # Programme principal ################################################################################ chdir= Origin= ConfigBranch= ConfigFile= action=merge SquashMsg= Push=1 Delete=1 args=( "fusionner la branche source dans la branche destination correspondante" " [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" -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" -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" [ -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" Push= fi # 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) 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 ] || Delete= ;; esac git_ensure_cleancheckout ensure_branches merge_action "$@" ;; *) die "$action: action non implémentée" ;; esac