finaliser pmer

This commit is contained in:
Jephté Clain 2025-02-26 17:31:59 +04:00
parent 5968b299b7
commit 48e6ff9f08
5 changed files with 233 additions and 356 deletions

View File

@ -81,7 +81,7 @@ function _script_add() {
cat >>"$script" cat >>"$script"
} }
function _push_branches() { function _script_push_branches() {
local origin branch local origin branch
_script_echo "* push branches" _script_echo "* push branches"
for branch in "${push_branches[@]}"; do for branch in "${push_branches[@]}"; do
@ -102,7 +102,7 @@ EOF
done done
} }
function _push_tags() { function _script_push_tags() {
local origin tag local origin tag
_script_echo "* push tags" _script_echo "* push tags"
for tag in "${push_tags[@]}"; do for tag in "${push_tags[@]}"; do
@ -206,6 +206,50 @@ function load_config() {
fi 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 # Merge
@ -248,7 +292,7 @@ EOF
chmod +x "$script" chmod +x "$script"
} }
function _create_release_branch() { function _rscript_create_release_branch() {
local date changelog local date changelog
_init_changelog _init_changelog
@ -287,7 +331,7 @@ $(qvals git commit -m "Init changelog & version $Version")
EOF EOF
} }
function _merge_release_branch() { function _rscript_merge_release_branch() {
local dest="$1" tag="$2" local dest="$1" tag="$2"
# basculer sur la branche # basculer sur la branche
@ -310,7 +354,7 @@ EOF
fi fi
} }
function _delete_release_branch() { function _rscript_delete_release_branch() {
_script_add "* delete branch $ReleaseBranch" <<EOF _script_add "* delete branch $ReleaseBranch" <<EOF
$comment$(qvals git branch -D "$ReleaseBranch")$or_die $comment$(qvals git branch -D "$ReleaseBranch")$or_die
EOF EOF

View File

@ -12,18 +12,20 @@ SHOW_VARS=(
"${CONFIG_VARS[@]}" "${CONFIG_VARS[@]}"
--Paramètres --Paramètres
CurrentBranch CurrentBranch
SrcType SrcBranch CurrentType=SrcType
DestBranch
) )
function show_action() { function show_action() {
local var src
echo_setv ConfigBranch="$ConfigBranch" echo_setv ConfigBranch="$ConfigBranch"
echo_setv ConfigFile="$(ppath "$ConfigFile")" echo_setv ConfigFile="$(ppath "$ConfigFile")"
for var in "${SHOW_VARS[@]}"; do for var in "${SHOW_VARS[@]}"; do
if [ "${var#--}" != "$var" ]; then if [ "${var#--}" != "$var" ]; then
estep "${var#--}" estep "${var#--}"
else else
echo_setv "$var=${!var}" splitfsep "$var" = var src
[ -n "$src" ] || src="$var"
echo_setv "$var=${!src}"
fi fi
done done
} }
@ -32,37 +34,6 @@ function show_action() {
# Initialisation # Initialisation
################################################################################ ################################################################################
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
setx remote=git_get_branch_remote "$branch"
if [ "$remote" == "$Origin" ]; then
setx rbranch=git_get_branch_merge "$branch"
if [ -n "$rbranch" ]; then
cmds+=("$(qvals git push "$Origin" "$branch:$rbranch")")
else
cmds+=("$(qvals git push -u "$Origin" "$branch:$branch")")
fi
else
cmds+=("$(qvals git push -u "$Origin" "$branch:$branch")")
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
}
function init_repo_action() { function init_repo_action() {
[ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé" [ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé"
@ -107,13 +78,13 @@ function init_develop_action() {
[ -n "$MAIN" ] || die "La branche MAIN n'a pas été définie" [ -n "$MAIN" ] || die "La branche MAIN n'a pas été définie"
[ -n "$MainBranch" ] || die "$MAIN: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" [ -n "$MainBranch" ] || die "$MAIN: cette branche n'existe pas (le dépôt a-t-il été initialisé?)"
local -a push_branches
enote "Vous allez créer la branche ${COULEUR_VERTE}$DEVELOP${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" enote "Vous allez créer la branche ${COULEUR_VERTE}$DEVELOP${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die ask_yesno "Voulez-vous continuer?" O || die
local -a push_branches
einfo "Création de la branche $DEVELOP" einfo "Création de la branche $DEVELOP"
git checkout -b "$DEVELOP" "$MAIN" git checkout -b "$DEVELOP" "$MAIN" || die
push_branches+=("$DEVELOP") push_branches+=("$DEVELOP")
_push_branches _push_branches
@ -127,11 +98,11 @@ function init_upstream_action() {
[ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie"
[ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" [ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)"
local -a push_branches; local config
enote "Vous allez créer la branche ${COULEUR_VERTE}$UPSTREAM${COULEUR_NORMALE}" enote "Vous allez créer la branche ${COULEUR_VERTE}$UPSTREAM${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die ask_yesno "Voulez-vous continuer?" O || die
local -a push_branches; local config
# faire une copie de la configuration actuelle # faire une copie de la configuration actuelle
ac_set_tmpfile config ac_set_tmpfile config
cp "$ConfigFile" "$config" cp "$ConfigFile" "$config"
@ -163,11 +134,11 @@ function init_dist_action() {
[ -n "$MAIN" ] || die "La branche MAIN n'a pas été définie" [ -n "$MAIN" ] || die "La branche MAIN n'a pas été définie"
[ -n "$MainBranch" ] || die "$MAIN: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" [ -n "$MainBranch" ] || die "$MAIN: cette branche n'existe pas (le dépôt a-t-il été initialisé?)"
local -a push_branches
enote "Vous allez créer la branche ${COULEUR_VERTE}$DIST${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" enote "Vous allez créer la branche ${COULEUR_VERTE}$DIST${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die ask_yesno "Voulez-vous continuer?" O || die
local -a push_branches
einfo "Création de la branche $DIST" einfo "Création de la branche $DIST"
git checkout -b "$DIST" "$MAIN" || die git checkout -b "$DIST" "$MAIN" || die
push_branches+=("$DIST") push_branches+=("$DIST")
@ -185,11 +156,11 @@ function init_feature_action() {
[ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie"
[ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" [ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)"
local -a push_branches
enote "Vous allez créer la branche ${COULEUR_VERTE}$branch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$DEVELOP${COULEUR_NORMALE}" enote "Vous allez créer la branche ${COULEUR_VERTE}$branch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$DEVELOP${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die ask_yesno "Voulez-vous continuer?" O || die
local -a push_branches
einfo "Création de la branche $branch" einfo "Création de la branche $branch"
git checkout -b "$branch" "$DEVELOP" || die git checkout -b "$branch" "$DEVELOP" || die
push_branches+=("$branch") push_branches+=("$branch")
@ -241,18 +212,18 @@ configurer certaines branches du dépôt si elles n'existent pas déjà
anything anything
créer la branche ${FEATURE}anything à partir de la branche $DEVELOP" créer la branche ${FEATURE}anything à partir de la branche $DEVELOP"
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations" -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
-b:,--config-branch ConfigBranch= "++\ -B:,--config-branch ConfigBranch= "++\
branche à partir de laquelle charger la configuration" branche à partir de laquelle charger la configuration"
-c:,--config-file:CONFIG ConfigFile= "++\ -c:,--config-file:CONFIG ConfigFile= "++\
fichier de configuration des branches. cette option est prioritaire sur --config-branch 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" par défaut, utiliser le fichier .pman.conf dans le répertoire du dépôt s'il existe"
-s,--show-config action=show "++\ -w,--show-config action=show "++\
afficher la configuration chargée" afficher la configuration chargée"
-o:,--origin Origin= "++\ -O:,--origin Origin= "++\
origine vers laquelle pousser les branches" origine vers laquelle pousser les branches"
-n,--no-push Push= "\ -n,--no-push Push= "\
ne pas pousser les branches vers leur origine après leur création" ne pas pousser les branches vers leur origine après leur création"
-p,--push Push=1 "++\ --push Push=1 "++\
pousser les branches vers leur origine après leur création. pousser les branches vers leur origine après leur création.
c'est l'option par défaut" c'est l'option par défaut"
) )

133
wip/pmer Executable file
View File

@ -0,0 +1,133 @@
#!/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() {
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

View File

@ -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 <<EOF
################################################################################
# merge
if [ -n "\$merge" ]; then
EOF
_merge_any_branch "$DestBranch"
_script_add <<EOF
fi
EOF
_script_add <<EOF
################################################################################
# push
if [ -n "\$push" ]; then
EOF
_push_branches
_script_add <<EOF
fi
EOF
if ! "$script" ${Merge:+merge} ${Push:+push}; then
eimportant "Veuillez consulter le script $script pour le détail des opérations qui n'ont pas pu êtres effectuées"
elif [ -z "$_KeepScript" ]; then
rm "$script"
fi
}
function release_upstream_action() {
merge_action "$@"
}
function release_feature_action() {
merge_action "$@"
}
function release_main_action() {
merge_action "$@"
}
function release_dist_action() {
merge_action "$@"
}
################################################################################
# Création et gestion des releases
################################################################################
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 release_develop_action() {
local script=".git/rel-release.sh"
local -a push_branches push_tags
if [ -n "$ReleaseBranch" ]; then
Version="${ReleaseBranch#$RELEASE}"
release_release_action "$@"; return $?
elif [ -n "$HotfixBranch" ]; then
Version="${HotfixBranch#$HOTFIX}"
release_hotfix_action "$@"; return $?
fi
[ -n "$Version" ] || die "Vous devez spécifier la version de la release"
ReleaseBranch="${RELEASE}$Version"
if [ -n "$Merge" ]; then
enote "\
Ce script va:
- créer la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE}
- la provisionner avec une description des changements
- la fusionner dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}${Push:+
- pousser les branches modifiées}"
else
enote "\
Ce script va:
- créer la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE}
- la provisionner avec une description des changements
Vous devrez:
- mettre à jour les informations de release puis relancer ce script"
fi
ask_yesno "Voulez-vous continuer?" O || die
local comment=
local or_die=" || exit 1"
_rscript_start
_script_add <<EOF
################################################################################
# create
if [ -n "\$create" ]; then
EOF
_create_release_branch
_script_add <<EOF
fi
EOF
_script_add <<EOF
################################################################################
# merge
if [ -n "\$merge" ]; then
EOF
_merge_release_branch "$DestBranch" "$TAG_PREFIX$Version$TAG_SUFFIX"
_merge_release_branch "$SrcBranch"
_delete_release_branch
_script_add <<EOF
fi
EOF
_script_add <<EOF
################################################################################
# push
if [ -n "\$push" ]; then
EOF
_push_branches
_push_tags
_script_add <<EOF
fi
EOF
if ! "$script" create ${Merge:+merge} ${Push:+push}; then
eimportant "Veuillez consulter le script $script pour le détail des opérations qui n'ont pas pu êtres effectuées"
elif [ -z "$_KeepScript" ]; then
rm "$script"
fi
}
function release_release_action() {
enote "\
Vous allez:
- fusionner la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE}
dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
}
function release_hotfix_action() {
enote "\
Vous allez intégrer la branche de hotfix ${COULEUR_JAUNE}$HotfixBranch${COULEUR_NORMALE}
dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
}
################################################################################
# Programme principal
################################################################################
chdir=
Origin=
ConfigBranch=
ConfigFile=
Action=release
Merge=1
Push=1
Version=
_KeepScript=
args=(
"faire une nouvelle release à partir de la branche source"
" -gv VERSION [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"
--keep-script _KeepScript=1 "++option non documentée"
--init Action=init "++\
initialiser les branches $DEVELOP et $MAIN
le nom des branches peut différer si un fichier de configuration est fourni"
--dump-config Action=dump "++\
afficher la configuration chargée"
-s,--show Action=show "\
lister les modifications qui seraient intégrées dans la release"
--release Action=release "créer la release. c'est l'action par défaut"
-k,--no-merge Merge= "\
ne pas fusionner la branche de release après l'avoir créée. implique --no-push"
-m,--merge Merge=1 "++\
fusionner la branche de release après l'avoir créée.
c'est l'option par défaut"
-n,--no-push Push= "\
ne pas pousser les branches vers leur origine après la création de la release"
-p,--push Push=1 "++\
pousser les branches vers leur origine après la création de la release.
c'est l'option par défaut"
-v:,--version Version= "\
spécifier la version de la release à créer"
)
parse_args "$@"; set -- "${args[@]}"
# charger la configuration
ensure_gitdir "$chdir"
load_branches all
load_config
load_branches current "$1"
if [ -n "$Merge" -a -n "$NOAUTO" ]; then
ewarn "L'option --no-merge a été forcée puisque ce dépôt ne supporte pas les releases automatiques"
Merge=
fi
[ -z "$Merge" ] && Push=
# puis faire l'action que l'on nous demande
case "$Action" in
init) init_action "$@";;
dump) dump_action "$@";;
show)
git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY"
ensure_branches
show_action "$@"
;;
release)
git_ensure_cleancheckout
ensure_branches
"release_${SrcType}_action" "$@"
;;
esac

View File

@ -24,16 +24,16 @@ function ensure_branches() {
array_contains LocalBranches "$DestBranch" || die "$DestBranch: branche destination introuvable" array_contains LocalBranches "$DestBranch" || die "$DestBranch: branche destination introuvable"
} }
function release_develop_action() { function create_release_action() {
local script=".git/rel-release.sh" local script=".git/rel-release.sh"
local -a push_branches push_tags local -a push_branches push_tags
if [ -n "$ReleaseBranch" ]; then if [ -n "$ReleaseBranch" ]; then
Version="${ReleaseBranch#$RELEASE}" Version="${ReleaseBranch#$RELEASE}"
release_release_action "$@"; return $? merge_release_action "$@"; return $?
elif [ -n "$HotfixBranch" ]; then elif [ -n "$HotfixBranch" ]; then
Version="${HotfixBranch#$HOTFIX}" Version="${HotfixBranch#$HOTFIX}"
release_hotfix_action "$@"; return $? merge_hotfix_action "$@"; return $?
fi fi
[ -n "$Version" ] || die "Vous devez spécifier la version de la release" [ -n "$Version" ] || die "Vous devez spécifier la version de la release"
@ -64,7 +64,7 @@ Vous devrez:
if [ -n "\$create" ]; then if [ -n "\$create" ]; then
echo "== Création de la release" echo "== Création de la release"
EOF EOF
_create_release_branch _rscript_create_release_branch
_script_add <<EOF _script_add <<EOF
fi fi
EOF EOF
@ -75,9 +75,9 @@ EOF
if [ -n "\$merge" ]; then if [ -n "\$merge" ]; then
echo "== Fusionner la release" echo "== Fusionner la release"
EOF EOF
_merge_release_branch "$DestBranch" "$TAG_PREFIX$Version$TAG_SUFFIX" _rscript_merge_release_branch "$DestBranch" "$TAG_PREFIX$Version$TAG_SUFFIX"
_merge_release_branch "$SrcBranch" _rscript_merge_release_branch "$SrcBranch"
_delete_release_branch _rscript_delete_release_branch
_script_add <<EOF _script_add <<EOF
fi fi
EOF EOF
@ -88,8 +88,8 @@ EOF
if [ -n "\$push" ]; then if [ -n "\$push" ]; then
echo "== Pousser branches et tags" echo "== Pousser branches et tags"
EOF EOF
_push_branches _script_push_branches
_push_tags _script_push_tags
_script_add <<EOF _script_add <<EOF
fi fi
EOF EOF
@ -102,7 +102,7 @@ EOF
fi fi
} }
function merge_release_main_action() { function merge_release_action() {
enote "\ enote "\
Vous allez: Vous allez:
- fusionner la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE} - fusionner la branche de release ${COULEUR_VERTE}$ReleaseBranch${COULEUR_NORMALE}
@ -110,7 +110,7 @@ Vous allez:
ask_yesno "Voulez-vous continuer?" O || die ask_yesno "Voulez-vous continuer?" O || die
} }
function merge_hotfix_main_action() { function merge_hotfix_action() {
enote "\ enote "\
Vous allez intégrer la branche de hotfix ${COULEUR_JAUNE}$HotfixBranch${COULEUR_NORMALE} Vous allez intégrer la branche de hotfix ${COULEUR_JAUNE}$HotfixBranch${COULEUR_NORMALE}
dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}" dans la branche destination ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}"
@ -125,34 +125,36 @@ chdir=
Origin= Origin=
ConfigBranch= ConfigBranch=
ConfigFile= ConfigFile=
Action=release action=release
Merge=1 Merge=1
Push=1 Push=1
Version= Version=
_KeepScript= _KeepScript=
args=( args=(
"faire une nouvelle release à partir de la branche source" "faire une nouvelle release à partir de la branche source"
" -gv VERSION [source]" " -v VERSION [source]"
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations" -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
-o:,--origin Origin= "++\ -O:,--origin Origin= "++\
origine à partir de laquelle les branches distantes sont considérées" origine à partir de laquelle les branches distantes sont considérées"
-b:,--config-branch ConfigBranch= "++\ -B:,--config-branch ConfigBranch= "++\
branche à partir de laquelle charger la configuration" branche à partir de laquelle charger la configuration"
-c:,--config-file:CONFIG ConfigFile= "++\ -c:,--config-file:CONFIG ConfigFile= "++\
fichier de configuration des branches. cette option est prioritaire sur --config-branch 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" 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" --keep-script _KeepScript=1 "++option non documentée"
-s,--show Action=show "\ -w,--show action=show "\
lister les modifications qui seraient intégrées dans la release" lister les modifications qui seraient intégrées dans la release"
--release Action=release "créer la release. c'est l'action par défaut" --release action=release "++\
créer la release.
c'est l'action par défaut"
-k,--no-merge Merge= "\ -k,--no-merge Merge= "\
ne pas fusionner la branche de release après l'avoir créée. implique --no-push" ne pas fusionner la branche de release après l'avoir créée. implique --no-push"
-m,--merge Merge=1 "++\ --merge Merge=1 "++\
fusionner la branche de release après l'avoir créée. fusionner la branche de release après l'avoir créée.
c'est l'option par défaut" c'est l'option par défaut"
-n,--no-push Push= "\ -n,--no-push Push= "\
ne pas pousser les branches vers leur origine après la création de la release" ne pas pousser les branches vers leur origine après la création de la release"
-p,--push Push=1 "++\ --push Push=1 "++\
pousser les branches vers leur origine après la création de la release. pousser les branches vers leur origine après la création de la release.
c'est l'option par défaut" c'est l'option par défaut"
-v:,--version Version= "\ -v:,--version Version= "\
@ -163,16 +165,23 @@ parse_args "$@"; set -- "${args[@]}"
# charger la configuration # charger la configuration
ensure_gitdir "$chdir" ensure_gitdir "$chdir"
load_branches all load_branches all
load_config load_config "$MYNAME"
load_branches current "$1"; shift load_branches current "$1"; shift
if [ -n "$Merge" -a -n "$NOAUTO" ]; then if [ -n "$Merge" -a -n "$NOAUTO" ]; then
ewarn "L'option --no-merge a été forcée puisque ce dépôt ne supporte pas les releases automatiques" ewarn "L'option --no-merge a été forcée puisque ce dépôt ne supporte pas les releases automatiques"
Merge= Merge=
fi fi
[ -z "$Merge" ] && Push= [ -z "$Merge" ] && Push=
[ -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 # puis faire l'action que l'on nous demande
case "$Action" in case "$action" in
show) show)
git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY" git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY"
ensure_branches ensure_branches
@ -182,9 +191,9 @@ release)
git_ensure_cleancheckout git_ensure_cleancheckout
ensure_branches ensure_branches
case "$SrcType" in case "$SrcType" in
release) merge_release_main_action "$@";; release) merge_release_action "$@";;
hotfix) merge_hotfix_main_action "$@";; hotfix) merge_hotfix_action "$@";;
*) release_develop_action "$@";; *) create_release_action "$@";;
esac esac
;; ;;
esac esac