#!/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 hook local comment= local or_die=" || exit 1" _mscript_start _scripta < AFTER_MERGE_ AFTER_DELETE_ BEFORE_PUSH_ AFTER_PUSH_ srcType et destType pouvant valoir 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" resolve_should_push quiet # 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 ensure_branches merge_action "$@" elif array_contains AllBranches "$SrcBranch"; then enote "$SrcBranch: une branche du même nom existe dans l'origine" die "$SrcBranch: branche locale introuvable" else die "$SrcBranch: branche introuvable" fi ;; *) die "$action: action non implémentée" ;; esac