diff --git a/bash/src/pman.sh b/bash/src/pman.sh index d9b799f..e0ba838 100644 --- a/bash/src/pman.sh +++ b/bash/src/pman.sh @@ -81,7 +81,7 @@ function _script_add() { cat >>"$script" } -function _push_branches() { +function _script_push_branches() { local origin branch _script_echo "* push branches" for branch in "${push_branches[@]}"; do @@ -102,7 +102,7 @@ EOF done } -function _push_tags() { +function _script_push_tags() { local origin tag _script_echo "* push tags" for tag in "${push_tags[@]}"; do @@ -206,6 +206,50 @@ function load_config() { fi } +################################################################################ +# Divers + +function _push_branches() { + [ ${#push_branches[*]} -gt 0 ] || return + [ -n "$Origin" ] || Origin=origin + git_have_remote "$Origin" || return + + local -a cmds remote rbranch + for branch in "${push_branches[@]}"; do + if [[ "$branch" == *:* ]]; then + cmds+=("$(qvals git push "$Origin" "$branch")") + else + setx remote=git_get_branch_remote "$branch" + if [ "$remote" == "$Origin" ]; then + setx rbranch=git_get_branch_merge "$branch" + if [ -n "$rbranch" ]; then + # pousser vers la branche distante existante + cmds+=("$(qvals git push "$Origin" "$branch:${rbranch#refs/heads/}")") + else + # pas de branche distante: pousser et traquer + cmds+=("$(qvals git push -u "$Origin" "$branch:$branch")") + fi + elif [ -n "$remote" ]; then + # pousser vers un remote différent + cmds+=("$(qvals git push "$Origin" "$branch:$branch")") + else + # pas de remote: pousser et traquer + cmds+=("$(qvals git push -u "$Origin" "$branch:$branch")") + fi + fi + done + [ -n "$Push" ] || enote "L'option --no-push étant utilisée, les opérations à effectuer sont simplement affichées" + for cmd in "${cmds[@]}"; do + einfo "$cmd" + if [ -n "$Push" ]; then + if ! eval "$cmd"; then + ewarn "Une erreur s'est produite, les opérations seront simplement affichées" + Push= + fi + fi + done +} + ################################################################################ # Merge @@ -248,7 +292,7 @@ EOF chmod +x "$script" } -function _create_release_branch() { +function _rscript_create_release_branch() { local date changelog _init_changelog @@ -287,7 +331,7 @@ $(qvals git commit -m "Init changelog & version $Version") EOF } -function _merge_release_branch() { +function _rscript_merge_release_branch() { local dest="$1" tag="$2" # basculer sur la branche @@ -310,7 +354,7 @@ EOF fi } -function _delete_release_branch() { +function _rscript_delete_release_branch() { _script_add "* delete branch $ReleaseBranch" < $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" + ;; + esac + git_ensure_cleancheckout + ensure_branches + merge_action "$@" + ;; +esac diff --git a/wip/pmerge b/wip/pmerge deleted file mode 100755 index f8d6ad7..0000000 --- a/wip/pmerge +++ /dev/null @@ -1,280 +0,0 @@ -#!/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" - -################################################################################ -# Informations -################################################################################ - -DUMP_VARS=( - ConfigBranch - ConfigFile - --Configuration - "${CONFIG_VARS[@]}" - --Paramètres - CurrentBranch - SrcType SrcBranch - DestBranch -) - -function dump_action() { - for var in "${DUMP_VARS[@]}"; do - if [ "${var#--}" != "$var" ]; then - estep "${var#--}" - else - echo_setv "$var=${!var}" - fi - done -} - -function show_action() { - local commits - setx commits=_list_commits - if [ -n "$commits" ]; then - einfo "Commits à fusionner $SrcBranch --> $DestBranch" - eecho "$commits" - fi -} - -################################################################################ -# Fusion de branche -################################################################################ - -function merge_action() { - local script=".git/rel-merge.sh" - local -a push_branches - - [ -n "$Merge" ] || exit_with edebug "La fusion est désactivée. Ce script va s'arrêter" - - 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 comment= - local or_die=" || exit 1" - _mscript_start - _script_add <