#!/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 _merge_action() { enote "\ Ce script va - fusionner la branche ${COULEUR_BLEUE}$MergeSrc${COULEUR_NORMALE} dans ${COULEUR_ROUGE}$MergeDest${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 < DEST. DEST est calculé en fonction de REF -t, --merge-to REF spécifier la branche de référence et indiquer que la fusion se fait dans le sens SRC --> REF. SRC est calculé en fonction de REF" fi ref="$1"; shift merge_dir=to [ -n "$ref" ] || die "vous spécifier la branche de référence" case "$ref" in -f|--merge-from) ref="$1"; shift merge_dir=from ;; -f*) ref="${ref#-f}" merge_dir=from ;; -t|--merge-to) ref="$1"; shift merge_dir=to ;; -t*) ref="${ref#-t}" merge_dir=to ;; esac REF_BRANCH="${ref^^}" array_contains PMAN_BRANCHES "$REF_BRANCH" || die "$ref: invalid branch" else REF_BRANCH="PMAN_TOOL_${MYNAME^^}"; REF_BRANCH="${!REF_BRANCH}" fi if check_gitdir; then load_branches all load_config set_pman_vars "$merge_dir" load_branches current loaded_config=1 else set_pman_vars "$merge_dir" fi BranchDesc= MergeSrcDesc= MergeDestDesc= if [ -n "$REF_BRANCH" ]; then BranchDesc="${COULEUR_BLANCHE}<$REF_BRANCH>" [ -n "$RefBranch" -a -n "$REF_UNIQUE" ] && BranchDesc="$BranchDesc ($RefBranch)" BranchDesc="$BranchDesc${COULEUR_NORMALE}" fi if [ -n "$MERGE_SRC" ]; then MergeSrcDesc="${COULEUR_BLEUE}<$MERGE_SRC>" [ -n "$MergeSrc" -a -n "$REF_UNIQUE" ] && MergeSrcDesc="$MergeSrcDesc ($MergeSrc)" MergeSrcDesc="$MergeSrcDesc${COULEUR_NORMALE}" fi if [ -n "$MERGE_DEST" ]; then MergeDestDesc="${COULEUR_ROUGE}<$MERGE_DEST>" [ -n "$MergeDest" -a -n "$REF_UNIQUE" ] && MergeDestDesc="$MergeDestDesc ($MergeDest)" MergeDestDesc="$MergeDestDesc${COULEUR_NORMALE}" fi [ -n "$REF_UNIQUE" ] && purpose="gérer la branche $BranchDesc" || purpose="gérer les branches $BranchDesc" usage="--checkout" variables= args=( -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. le fichier .pman.conf dans le répertoire du dépôt est utilisé par défaut s'il existe. cette option est prioritaire sur --config-branch" --fake _Fake=1 "++option non documentée" --keep-script _KeepScript=1 "++option non documentée" --dump action=dump "++afficher les noms des branches" ) if [ -n "$RefBranch" -a -n "$REF_UNIQUE" ]; then args+=( --checkout action=checkout "++\ créer le cas échéant la branche $BranchDesc et basculer vers elle. c'est l'option par défaut" ) elif [ -z "$REF_UNIQUE" ]; then args+=( --checkout action=checkout "\ créer le cas échéant la branche $BranchDesc et basculer vers elle. c'est l'option par défaut" ) else args+=( --checkout action=checkout "\ créer la branche $MergeDestDesc et basculer vers elle. c'est l'option par défaut" ) fi if [ -n "$MERGE_SRC" -a -n "$MERGE_DEST" ]; then if [ -n "$REF_UNIQUE" ]; then usage="${usage}|--show|--merge" else usage="${usage} $REF_BRANCH --show|--merge" fi [ "$REF_BRANCH" != "$MERGE_DEST" ] && bewareDir=" NB: la fusion se fait dans le sens inverse" || bewareDir= variables="\ Les variables supplémentaires suivantes peuvent être définies: BEFORE_MERGE_${MERGE_SRC} AFTER_MERGE_${MERGE_SRC}" args+=( -w,--show '$action=show; inc@ ShowLevel' "\ lister ce qui serait fusionné dans la branche $MergeDestDesc" # -b,--rebase action=rebase "\ #lancer git rebase -i sur la branche $MergeSrcDesc. cela permet de réordonner #les commits pour nettoyer l'historique avant la fusion" -m,--merge action=merge "\ fusionner la branche $MergeSrcDesc dans la branche $MergeDestDesc$bewareDir" --tech-merge TechMerge=1 "++option non documentée" -s:,--squash:COMMIT_MSG SquashMsg= "\ fusionner les modifications de la branche comme un seul commit" ) if [ -n "$PREL_MERGE" ]; then args+=( -f,--force-merge ForceMerge=1 "++\ forcer la fusion pour une branche qui devrait être traitée par prel" ) fi args+=( -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" ) if [ -n "$DELETE_MERGED" ]; then variables="${variables} AFTER_DELETE_${MERGE_SRC}" args+=( -k,--no-delete Delete= "\ ne pas supprimer la branche $MergeSrcDesc après la fusion dans la branche $MergeDestDesc. cette option ne devrait pas être utilisée avec --squash" --delete Delete=1 "++\ supprimer la branche $MergeSrcDesc après la fusion dans la branche $MergeDestDesc. c'est l'option par défaut" ) fi if [ -n "$MERGE_DEST" ]; then variables="${variables} BEFORE_PUSH_${MERGE_DEST} AFTER_PUSH_${MERGE_DEST}" fi args+=( -a:,--after-merge AfterMerge= "\ évaluer le script spécifié après une fusion *réussie*" ) fi chdir= Origin= ConfigBranch= ConfigFile= _Fake= _KeepScript= action=checkout ShowLevel=0 TechMerge= SquashMsg= Push=1 Delete=1 AfterMerge= args=( "$purpose" "\ $usage CONFIGURATION Le fichier .pman.conf contient la configuration des branches. $variables" "${args[@]}" ) parse_args "$@"; set -- "${args[@]}" if [ -z "$loaded_config" -o -n "$chdir" -o -n "$ConfigFile" -o -n "$ConfigBranch" ]; then # charger la configuration ensure_gitdir "$chdir" load_branches all load_config set_pman_vars "$merge_dir" load_branches current fi resolve_should_push quiet "${action}_action" "$@"