nulib/bin/pdev

248 lines
7.6 KiB
Plaintext
Raw Normal View History

2025-02-28 20:08:17 +04:00
#!/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() {
2025-03-03 06:07:52 +04:00
[ -z "$ShouldPush" ] && enote "\
L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine"
2025-02-28 20:08:17 +04:00
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
2025-03-01 06:14:00 +04:00
local script=".git/pman-merge.sh"
2025-02-28 20:08:17 +04:00
local -a push_branches delete_branches
2025-03-03 12:54:10 +04:00
local hook
2025-02-28 20:08:17 +04:00
local comment=
local or_die=" || exit 1"
_mscript_start
_scripta <<EOF
################################################################################
# merge
if [ -n "\$merge" ]; then
esection "Fusionner la branche"
2025-03-03 12:54:10 +04:00
EOF
hook="BEFORE_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF
(
2025-03-03 12:54:10 +04:00
${!hook}
)$or_die
2025-02-28 20:08:17 +04:00
EOF
_mscript_merge_branch
2025-03-03 12:54:10 +04:00
hook="AFTER_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF
(
2025-03-03 12:54:10 +04:00
${!hook}
2025-03-01 06:14:00 +04:00
)$or_die
EOF
2025-02-28 20:08:17 +04:00
_scripta <<EOF
fi
EOF
2025-03-03 06:07:52 +04:00
if [ -n "$ShouldDelete" ]; then
_scripta <<EOF
2025-02-28 20:08:17 +04:00
################################################################################
# delete
if [ -n "\$delete" ]; then
esection "Supprimer la branche"
EOF
_mscript_delete_branch
2025-03-03 12:54:10 +04:00
hook="AFTER_DELETE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF
(
2025-03-03 12:54:10 +04:00
${!hook}
2025-03-01 06:14:00 +04:00
)$or_die
EOF
_scripta <<EOF
2025-02-28 20:08:17 +04:00
fi
EOF
fi
2025-02-28 20:08:17 +04:00
_scripta <<EOF
################################################################################
# push
if [ -n "\$push" ]; then
esection "Pousser les branches"
2025-03-03 12:54:10 +04:00
EOF
hook="BEFORE_PUSH_${DestType^^}"; [ -n "${!hook}" ] && _scripta <<EOF
(
2025-03-03 12:54:10 +04:00
${!hook}
)$or_die
2025-02-28 20:08:17 +04:00
EOF
_script_push_branches
if [ ${#delete_branches[*]} -gt 0 ]; then
_scripta <<<"if [ -n \"\$delete\" ]; then"
push_branches=("${delete_branches[@]}")
_script_push_branches
_scripta <<<fi
fi
2025-03-03 12:54:10 +04:00
hook="AFTER_PUSH_${DestType^^}"; [ -n "${!hook}" ] && _scripta <<EOF
(
2025-03-03 12:54:10 +04:00
${!hook}
2025-03-01 06:14:00 +04:00
)$or_die
EOF
2025-02-28 20:08:17 +04:00
_scripta <<EOF
fi
EOF
2025-03-03 13:09:04 +04:00
[ -n "$Delete" -o -z "$ShouldDelete" ] && Deleted=1 || Deleted=
2025-03-03 06:07:52 +04:00
[ -n "$ShouldDelete" -a -n "$Delete" ] && ShouldDelete=
[ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush=
2025-03-03 13:01:45 +04:00
if [ -n "$_Fake" ]; then
cat "$script"
2025-02-28 20:08:17 +04:00
elif ! "$script" merge ${Delete:+delete} ${Push:+push}; then
eimportant "\
Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}'
2025-03-03 06:07:52 +04:00
En cas d'erreur de merge, veuillez corriger les erreurs puis continuer avec
git merge --continue
Sinon, veuillez consulter le script et/ou le relancer
./$script${Delete:+ delete}${Push:+ push}"
2025-02-28 20:08:17 +04:00
die
2025-03-03 13:09:04 +04:00
elif [ -n "$Deleted" -a -n "$Push" ]; then
2025-02-28 20:08:17 +04:00
[ -n "$_KeepScript" ] || rm "$script"
2025-03-04 12:46:44 +04:00
[ -n "$AfterMerge" ] && eval "$AfterMerge"
2025-02-28 20:08:17 +04:00
else
2025-03-04 12:46:44 +04:00
local msg="\
Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}'
2025-03-03 06:07:52 +04:00
Vous pouvez consulter le script et/ou le relancer
./$script${ShouldDelete:+ delete}${ShouldPush:+ push}"
2025-03-04 12:46:44 +04:00
[ -n "$AfterMerge" ] && msg="$msg
Il y a aussi les commandes supplémentaires suivantes:
${AfterMerge//
/
}"
einfo "$msg"
2025-02-28 20:08:17 +04:00
fi
}
################################################################################
# Programme principal
################################################################################
chdir=
Origin=
ConfigBranch=
ConfigFile=
2025-03-03 13:01:45 +04:00
_Fake=
2025-02-28 20:08:17 +04:00
_KeepScript=
action=merge
TechMerge=
SquashMsg=
[ -z "$PMAN_NO_PUSH" ] && Push=1 || Push=
[ -z "$PMAN_NO_DELETE" ] && Delete=1 || Delete=
2025-03-04 12:46:44 +04:00
AfterMerge=
2025-02-28 20:08:17 +04:00
args=(
"fusionner la branche source dans la branche destination correspondante"
2025-03-01 19:45:00 +04:00
" [source]
CONFIGURATION
2025-03-03 06:42:24 +04:00
Le fichier .pman.conf contient la configuration des branches. Les variables
2025-03-01 19:45:00 +04:00
supplémentaires suivantes peuvent être définies:
2025-03-03 12:54:10 +04:00
BEFORE_MERGE_<srcType>
2025-03-01 19:45:00 +04:00
AFTER_MERGE_<srcType>
AFTER_DELETE_<srcType>
2025-03-03 12:54:10 +04:00
BEFORE_PUSH_<destType>
2025-03-01 19:45:00 +04:00
AFTER_PUSH_<destType>
2025-03-03 12:54:10 +04:00
srcType et destType pouvant valoir UPSTREAM, DEVELOP, FEATURE, RELEASE, MAIN, HOTFIX, DIST"
2025-02-28 20:08:17 +04:00
-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"
2025-03-03 13:01:45 +04:00
--fake _Fake=1 "++option non documentée"
2025-02-28 20:08:17 +04:00
--keep-script _KeepScript=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"
2025-03-04 12:46:44 +04:00
-a:,--after-merge AfterMerge= "\
évaluer le script spécifié après une fusion *réussie*"
2025-02-28 20:08:17 +04:00
)
parse_args "$@"; set -- "${args[@]}"
# charger la configuration
ensure_gitdir "$chdir"
load_branches all
load_config "$MYNAME"
load_branches current "$1"
2025-03-03 06:42:24 +04:00
resolve_should_push quiet
2025-02-28 20:08:17 +04:00
# 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)
2025-03-03 06:07:52 +04:00
ShouldDelete=1
2025-02-28 20:08:17 +04:00
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
2025-03-03 06:07:52 +04:00
[ "$SrcType" == feature ] || ShouldDelete=
2025-02-28 20:08:17 +04:00
;;
esac
2025-03-03 06:07:52 +04:00
[ -z "$ShouldDelete" ] && Delete=
2025-03-03 13:01:45 +04:00
[ -z "$_Fake" ] && git_ensure_cleancheckout
2025-03-03 06:42:24 +04:00
if array_contains LocalBranches "$SrcBranch"; then
2025-02-28 20:08:17 +04:00
ensure_branches
merge_action "$@"
2025-03-03 06:42:24 +04:00
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"
2025-02-28 20:08:17 +04:00
fi
;;
*)
die "$action: action non implémentée"
;;
esac