#!/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 ### description des variables ### # * PMAN_TOOL -- nom de l'outil, e.g pdev, pmain, pdist # * PMAN_BRANCH -- code de la branche de référence basé sur le nom de l'outil # * PMAN_UNIQUE -- si cette branche est unique # * PMAN_CREATE_BASE -- branche de base à partir de laquelle créer la branche # * PMAN_MERGE_FROM -- code de la branche source à partir de laquelle la fusion # est faite dans PMAN_BRANCH. vide si la branche n'a pas de source # * PMAN_MERGE_TO -- code de la branche destination dans laquelle la fusion est # faite depuis PMAN_BRANCH. vide si la branche n'a pas de destination # * PMAN_DIR -- direction de la fusion: # "from" si on fait PMAN_MERGE_FROM --> PMAN_BRANCH # "to" si on fait PMAN_BRANCH --> PMAN_MERGE_TO # * PMAN_PREL_MERGE -- si la fusion devrait se faire avec prel # * PMAN_DELETE_MERGED -- s'il faut supprimer la branche source après la fusion # * PMAN_MERGE_SRC -- code de la branche source pour la fusion, ou vide si la # fusion n'est pas possible # * PMAN_MERGE_DEST -- code de la branche destination pour la fusion, ou vide si # la fusion n'est pas possible # * PMAN_CAN_MERGE -- indique si la fusion est possible # * ${!PMAN_BRANCH} -- nom effectif de la branche si elle est définie dans # .pman.conf # * $PmanBranch -- nom effectif de la branche *si elle existe*, vide sinon # * ${!PMAN_MERGE_SRC} -- nom effectif de la branche source si elle est définie # dans .pman.conf # * $PmanMergeSrc -- nom effectif de la branche source *si elle existe*, vide # sinon # * ${!PMAN_MERGE_DEST} -- nom effectif de la branche destination si elle est # définie dans .pman.conf # * $PmanMergeDest -- nom effectif de la branche source *si elle existe*, vide # sinon [ -n "$PMAN_TOOL" ] || PMAN_TOOL="$MYNAME" PMAN_BRANCH="PMAN_TOOL_${PMAN_TOOL^^}"; PMAN_BRANCH="${!PMAN_BRANCH}" function set_pman_vars() { case "$PMAN_BRANCH" in FEATURE|RELEASE|HOTFIX) PMAN_UNIQUE=;; *) PMAN_UNIQUE=1;; esac PMAN_CREATE_BASE=$(get_create_base "$PMAN_BRANCH") PMAN_MERGE_FROM=$(get_merge_from "$PMAN_BRANCH") PMAN_MERGE_TO=$(get_merge_to "$PMAN_BRANCH") if [ -n "$1" ]; then PMAN_DIR="$1" else PMAN_DIR=to #elif [ -n "$PMAN_MERGE_TO" ]; then PMAN_DIR=to #else PMAN_DIR=from fi PMAN_PREL_MERGE=$(should_prel_merge "$PMAN_BRANCH" "$PMAN_DIR" && echo 1) PMAN_DELETE_MERGED=$(should_delete_merged "$PMAN_BRANCH" "$PMAN_DIR" && echo 1) case "$PMAN_DIR" in to) PMAN_MERGE_SRC="$PMAN_BRANCH" PMAN_MERGE_DEST="$PMAN_MERGE_TO" ;; from) PMAN_MERGE_SRC="$PMAN_MERGE_FROM" PMAN_MERGE_DEST="$PMAN_BRANCH" ;; esac [ -n "$PMAN_MERGE_SRC" -a -n "$PMAN_MERGE_DEST" ] && PMAN_CAN_MERGE=1 || PMAN_CAN_MERGE= } git_cleancheckout_DIRTY="\ Vous avez des modifications locales. Enregistrez ces modifications avant de fusionner la branche" function dump_action() { enote "Valeurs des variables: PMAN_TOOL=$PMAN_TOOL PMAN_BRANCH=$PMAN_BRANCH${PMAN_BRANCH:+ !PMAN_BRANCH=${!PMAN_BRANCH} PmanBranch=$PmanBranch} PMAN_CREATE_BASE=$PMAN_CREATE_BASE${PMAN_CREATE_BASE:+ !PMAN_CREATE_BASE=${!PMAN_CREATE_BASE} PmanCreateBase=$PmanCreateBase} PMAN_MERGE_FROM=$PMAN_MERGE_FROM PMAN_MERGE_TO=$PMAN_MERGE_TO PMAN_DIR=$PMAN_DIR PMAN_PREL_MERGE=$PMAN_PREL_MERGE PMAN_DELETE_MERGED=$PMAN_DELETE_MERGED PMAN_MERGE_SRC=$PMAN_MERGE_SRC${PMAN_MERGE_SRC:+ !PMAN_MERGE_SRC=${!PMAN_MERGE_SRC} PmanMergeSrc=$PmanMergeSrc} PMAN_MERGE_DEST=$PMAN_MERGE_DEST${PMAN_MERGE_DEST:+ !PMAN_MERGE_DEST=${!PMAN_MERGE_DEST} PmanMergeDest=$PmanMergeDest} PMAN_CAN_MERGE=$PMAN_CAN_MERGE CurrentBranch=$CurrentBranch LocalBranches=${LocalBranches[*]} RemoteBranches=${RemoteBranches[*]} AllBranches=${AllBranches[*]} UpstreamBranch=$UpstreamBranch FeatureBranches=${FeatureBranches[*]} DevelopBranch=$DevelopBranch ReleaseBranch=$ReleaseBranch HotfixBranch=$HotfixBranch MainBranch=$MainBranch DistBranch=$DistBranch " } #XXXX #[ -n "${!PMAN_MERGE_SRC}" ] || # die "Aucune branche définie pour $PMAN_MERGE_SRC. Veuillez éditer le fichier .pman.conf" function _ensure_branch() { [ -n "${!PMAN_BRANCH}" ] || die "\ La branche $PMAN_BRANCH n'a pas été définie. Veuillez éditer le fichier .pman.conf" [ "$1" == init -o -n "$PmanBranch" ] || die "${!PMAN_BRANCH}: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" } function _ensure_create_base() { [ -n "${!PMAN_CREATE_BASE}" ] || die "\ La branche $PMAN_CREATE_BASE n'a pas été définie. Veuillez éditer le fichier .pman.conf" [ "$1" == init -o -n "$PmanCreateBase" ] || die "${!PMAN_CREATE_BASE}: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" } function _ensure_merge_src() { [ -n "${!PMAN_MERGE_SRC}" ] || die "\ La branche $PMAN_MERGE_SRC n'a pas été définie. Veuillez éditer le fichier .pman.conf" [ "$1" == init -o -n "$PmanMergeSrc" ] || die "${!PMAN_MERGE_SRC}: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" } function _ensure_merge_dest() { [ -n "${!PMAN_MERGE_DEST}" ] || die "\ La branche $PMAN_MERGE_DEST n'a pas été définie. Veuillez éditer le fichier .pman.conf" [ "$1" == init -o -n "$PmanMergeDest" ] || die "${!PMAN_MERGE_DEST}: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" } function checkout_action() { local -a push_branches _ensure_branch init if [ -n "$PmanBranch" ]; then git checkout "$PmanBranch" elif array_contains AllBranches "${!PMAN_BRANCH}"; then enote "${!PMAN_BRANCH}: une branche du même nom existe dans l'origine" ask_yesno "Voulez-vous basculer sur cette branche?" O || die git checkout "${!PMAN_BRANCH}" elif [ -n "$PMAN_CREATE_BASE" ]; then _ensure_create_base resolve_should_push local SrcBranch="${!PMAN_CREATE_BASE}" DestBranch="${!PMAN_BRANCH}" enote "Vous allez créer la branche ${COULEUR_BLEUE}$DestBranch${COULEUR_NORMALE} <-- ${COULEUR_ROUGE}$SrcBranch${COULEUR_NORMALE}" ask_yesno "Voulez-vous continuer?" O || die einfo "Création de la branche $DestBranch" git checkout -b "$DestBranch" "$SrcBranch" || die push_branches+=("$DestBranch") _push_branches fi } function ensure_branches() { [ -n "$PMAN_CAN_MERGE" ] || die "${!PMAN_BRANCH}: Aucune configuration de fusion trouvée pour cette branche" local branches [ "$1" == -a ] && branches=AllBranches || branches=LocalBranches SrcBranch="${!PMAN_MERGE_SRC}" array_contains "$branches" "$SrcBranch" || die "$SrcBranch: branche source introuvable" DestBranch="${!PMAN_MERGE_DEST}" array_contains "$branches" "$DestBranch" || die "$DestBranch: branche destination introuvable" } function _show_action() { local commits setx commits=_list_commits if [ -n "$commits" ]; then if [ $ShowLevel -ge 2 ]; then { echo "\ # Commits à fusionner $SrcBranch --> $DestBranch $commits " _sd_COLOR=always _show_diff } | less -eRF else einfo "Commits à fusionner $SrcBranch --> $DestBranch" eecho "$commits" fi fi } function show_action() { git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY" ensure_branches _show_action "$@" } function _merge_action() { 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 <