From 0b01946090b02ca1aa0d63c1afd60755b0567ac8 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 17 Oct 2025 17:20:15 +0400 Subject: [PATCH] suite pwip --- bash/src/pman.sh | 90 ++++++++-- bash/src/pman.tool.pdev.sh | 10 -- bash/src/pman.tool.pdist.sh | 10 -- bash/src/pman.tool.pmain.sh | 10 -- wip/_pman.tool | 340 ++++++++++++++++++++++++++---------- wip/pwip | 61 +------ 6 files changed, 321 insertions(+), 200 deletions(-) delete mode 100644 bash/src/pman.tool.pdev.sh delete mode 100644 bash/src/pman.tool.pdist.sh delete mode 100644 bash/src/pman.tool.pmain.sh mode change 100755 => 120000 wip/pwip diff --git a/bash/src/pman.sh b/bash/src/pman.sh index 917969c..e9d7acd 100644 --- a/bash/src/pman.sh +++ b/bash/src/pman.sh @@ -28,6 +28,62 @@ CONFIG_VARS=( UPSTREAM DEVELOP FEATURE RELEASE MAIN TAG_PREFIX TAG_SUFFIX HOTFIX DIST NOAUTO ) +PMAN_TOOL_PUPS=UPSTREAM +PMAN_TOOL_PDEV=DEVELOP +PMAN_TOOL_PWIP=FEATURE +PMAN_TOOL_PMAIN=MAIN +PMAN_TOOL_PDIST=DIST +UPSTREAM_CREATE_BASE= ; UPSTREAM_MERGE_FROM= ; UPSTREAM_MERGE_TO=DEVELOP ; UPSTREAM_PREL= ; UPSTREAM_DELETE= +DEVELOP_CREATE_BASE=MAIN ; DEVELOP_MERGE_FROM=FEATURE ; DEVELOP_MERGE_TO=MAIN ; DEVELOP_PREL=to ; DEVELOP_DELETE=from +MAIN_CREATE_BASE= ; MAIN_MERGE_FROM=DEVELOP ; MAIN_MERGE_TO=DIST ; MAIN_PREL=from ; MAIN_DELETE= +DIST_CREATE_BASE=MAIN ; DIST_MERGE_FROM=MAIN ; DIST_MERGE_TO= ; DIST_PREL= ; DIST_DELETE= +FEATURE_CREATE_BASE=DEVELOP ; FEATURE_MERGE_FROM= ; FEATURE_MERGE_TO=DEVELOP ; FEATURE_PREL= ; FEATURE_DELETE=to + +function get_create_base() { + # afficher la branche depuis laquelle créer la branche $1 + # retourner 1 en cas d'erreur (pas de branche source) + local branch="$1" infos + [ -n "$branch" ] || return 1 + infos="${branch^^}_CREATE_BASE"; branch="${!infos}" + [ -n "$branch" ] && echo "$branch" || return 1 +} + +function get_merge_from() { + # afficher la branche depuis laquelle la branche $1 doit merger + # retourner 1 en cas d'erreur (pas de branche source) + local branch="$1" infos + [ -n "$branch" ] || return 1 + infos="${branch^^}_MERGE_FROM"; branch="${!infos}" + [ -n "$branch" ] && echo "$branch" || return 1 +} + +function get_merge_to() { + # afficher la branche dans laquelle la branche $1 doit merger + # retourner 1 en cas d'erreur (pas de branche destination) + local branch="$1" infos + [ -n "$branch" ] || return 1 + infos="${branch^^}_MERGE_TO"; branch="${!infos}" + [ -n "$branch" ] && echo "$branch" || return 1 +} + +function should_prel_merge() { + # tester si la branche $1 doit être mergée avec prel dans la direction + # $2(=to) + local branch="$1" dir="${2:-to}" infos + [ -n "$branch" ] || return 1 + infos="${branch^^}_PREL" + [ "${!infos}" == "$dir" ] +} + +function should_delete_merged() { + # tester si la branche $1 doit être supprimée après avoir été mergée dans la + # direction $2(=to) + local branch="$1" dir="${2:-to}" infos + [ -n "$branch" ] || return 1 + infos="${branch^^}_DELETE" + [ "${!infos}" == "$dir" ] +} + function _init_changelog() { setx date=date +%d/%m/%Y-%H:%M ac_set_tmpfile changelog @@ -156,14 +212,14 @@ function check_gitdir() { # se mettre à la racine du dépôt git local gitdir - git_ensure_gitvcs + git_check_gitvcs || return 1 setx gitdir=git_get_toplevel cd "$gitdir" || return 1 } function ensure_gitdir() { # commencer dans le répertoire indiqué - check_gitdir "$@" || die || return + check_gitdir "$@" || die || return 1 } function load_branches() { @@ -201,6 +257,10 @@ function load_branches() { esac local branch + PmanBranch= + PmanCreateBase= + PmanMergeSrc= + PmanMergeDest= UpstreamBranch= FeatureBranches=() DevelopBranch= @@ -209,19 +269,27 @@ function load_branches() { MainBranch= DistBranch= for branch in "${LocalBranches[@]}"; do + [ -n "$PMAN_BRANCH" ] && [ "$branch" == "${!PMAN_BRANCH}" ] && + PmanBranch="$branch" + [ -n "$PMAN_CREATE_BASE" ] && [ "$branch" == "${!PMAN_CREATE_BASE}" ] && + PmanCreateBase="$branch" + [ -n "$PMAN_MERGE_SRC" ] && [ "$branch" == "${!PMAN_MERGE_SRC}" ] && + PmanMergeSrc="$branch" + [ -n "$PMAN_MERGE_DEST" ] && [ "$branch" == "${!PMAN_MERGE_DEST}" ] && + PmanMergeDest="$branch" if [ "$branch" == "$UPSTREAM" ]; then UpstreamBranch="$branch" - elif [[ "$branch" == "$FEATURE"* ]]; then + elif [ -n "$FEATURE" ] && [[ "$branch" == "$FEATURE"* ]]; then FeatureBranches+=("$branch") - elif [ "$branch" == "$DEVELOP" ]; then + elif [ -n "$DEVELOP" -a "$branch" == "$DEVELOP" ]; then DevelopBranch="$branch" - elif [[ "$branch" == "$RELEASE"* ]]; then + elif [ -n "$RELEASE" ] && [[ "$branch" == "$RELEASE"* ]]; then ReleaseBranch="$branch" - elif [[ "$branch" == "$HOTFIX"* ]]; then + elif [ -n "$HOTFIX" ] && [[ "$branch" == "$HOTFIX"* ]]; then HotfixBranch="$branch" - elif [ "$branch" == "$MAIN" ]; then + elif [ -n "$MAIN" -a "$branch" == "$MAIN" ]; then MainBranch="$branch" - elif [ "$branch" == "$DIST" ]; then + elif [ -n "$DIST" -a "$branch" == "$DIST" ]; then DistBranch="$branch" fi done @@ -249,12 +317,6 @@ function load_config() { elif [ -f .pman.conf ]; then ConfigFile="$(pwd)/.pman.conf" source "$ConfigFile" - elif [ -n "$1" -a -n "${MYNAME#$1}" ]; then - # $1 est le nom de base de l'outil e.g "pdev", et le suffixe est la - # configuration à charger par défaut. i.e pdev74 chargera par défaut la - # configuration pman74.conf - ConfigFile="$NULIBDIR/bash/src/pman${MYNAME#$1}.conf.sh" - source "$ConfigFile" else ConfigFile="$NULIBDIR/bash/src/pman.conf.sh" fi diff --git a/bash/src/pman.tool.pdev.sh b/bash/src/pman.tool.pdev.sh deleted file mode 100644 index a913374..0000000 --- a/bash/src/pman.tool.pdev.sh +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 - -PMAN_TOOLS=pdev -SRC_TYPE=DEVELOP -SRC_BRANCH="${SRC_TYPE,,}"; SRC_BRANCH="${SRC_BRANCH^}Branch" -DEST_TYPE=MAIN -DEST_BRANCH="${DEST_TYPE,,}"; DEST_BRANCH="${DEST_BRANCH^}Branch" -ALLOW_MERGE=1 -MERGE_PREL=1 -ALLOW_DELETE= diff --git a/bash/src/pman.tool.pdist.sh b/bash/src/pman.tool.pdist.sh deleted file mode 100644 index 433e3bc..0000000 --- a/bash/src/pman.tool.pdist.sh +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 - -PMAN_TOOL=pdist -SRC_TYPE=DIST -SRC_BRANCH="${SRC_TYPE,,}"; SRC_BRANCH="${SRC_BRANCH^}Branch" -DEST_TYPE= -DEST_BRANCH= -ALLOW_MERGE= -MERGE_PREL= -ALLOW_DELETE= diff --git a/bash/src/pman.tool.pmain.sh b/bash/src/pman.tool.pmain.sh deleted file mode 100644 index 3e6a4a0..0000000 --- a/bash/src/pman.tool.pmain.sh +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 - -PMAN_TOOL=pmain -SRC_TYPE=MAIN -SRC_BRANCH="${SRC_TYPE,,}"; SRC_BRANCH="${SRC_BRANCH^}Branch" -DEST_TYPE=DIST -DEST_BRANCH="${DEST_TYPE,,}"; DEST_BRANCH="${DEST_BRANCH^}Branch" -ALLOW_MERGE=1 -MERGE_PREL= -ALLOW_DELETE= diff --git a/wip/_pman.tool b/wip/_pman.tool index 3781dd6..a2d3047 100755 --- a/wip/_pman.tool +++ b/wip/_pman.tool @@ -1,29 +1,92 @@ #!/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 "pman.tool.$MYNAME" +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() { - echo -n "\ -SRC_TYPE=$SRC_TYPE -SRC_BRANCH=$SRC_BRANCH -DEST_TYPE=$DEST_TYPE -DEST_BRANCH=$DEST_BRANCH + 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[*]} -SrcType=$SrcType -SrcBranch=$SrcBranch -DestType=$DestType -DestBranch=$DestBranch - UpstreamBranch=$UpstreamBranch FeatureBranches=${FeatureBranches[*]} DevelopBranch=$DevelopBranch @@ -34,46 +97,76 @@ DistBranch=$DistBranch " } -function _ensure_src_branch() { - [ -n "$SrcBranch" ] || die "La branche $SRC_TYPE n'a pas été définie" - [ "$1" == init -o -n "${!SRC_BRANCH}" ] || die "$SrcBranch: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" +#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_dest_branch() { - [ -n "$DestBranch" ] || die "La branche $DEST_TYPE n'a pas été définie" - [ "$1" == init -o -n "${!DEST_BRANCH}" ] || die "$DestBranch: 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 - if [ -z "${!SRC_BRANCH}" ]; then - array_contains AllBranches "$SrcBranch" && exit_with enote "\ -$SrcBranch: une branche du même nom existe dans l'origine - git checkout $SrcBranch" - _ensure_dest_branch - _ensure_src_branch init + _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 - enote "Vous allez créer la branche ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE} <-- ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}" + 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 $SrcBranch" - git checkout -b "$SrcBranch" "$DestBranch" || die - push_branches+=("$SrcBranch") + einfo "Création de la branche $DestBranch" + git checkout -b "$DestBranch" "$SrcBranch" || die + push_branches+=("$DestBranch") _push_branches fi - git checkout "$SrcBranch" } function ensure_branches() { - [ -n "${!SRC_BRANCH}" -a -n "${!DEST_BRANCH}" ] || - die "${!SRC_BRANCH}: Aucune configuration de fusion trouvée pour cette branche" + [ -n "$PMAN_CAN_MERGE" ] || + die "${!PMAN_BRANCH}: Aucune configuration de fusion trouvée pour cette branche" - array_contains LocalBranches "${!SRC_BRANCH}" || die "${!SRC_BRANCH}: branche source introuvable" - array_contains LocalBranches "${!DEST_BRANCH}" || die "${!DEST_BRANCH}: branche destination introuvable" + 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() { @@ -83,14 +176,14 @@ function _show_action() { if [ $ShowLevel -ge 2 ]; then { echo "\ -# Commits à fusionner ${!SRC_BRANCH} --> ${!DEST_BRANCH} +# Commits à fusionner $SrcBranch --> $DestBranch $commits " _sd_COLOR=always _show_diff } | less -eRF else - einfo "Commits à fusionner ${!SRC_BRANCH} --> ${!DEST_BRANCH}" + einfo "Commits à fusionner $SrcBranch --> $DestBranch" eecho "$commits" fi fi @@ -104,7 +197,7 @@ function show_action() { function _merge_action() { enote "\ Ce script va -- fusionner la branche ${COULEUR_BLEUE}${!SRC_BRANCH}${COULEUR_NORMALE} dans ${COULEUR_ROUGE}${!DEST_BRANCH}${COULEUR_NORMALE}${Push:+ +- 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 @@ -121,13 +214,13 @@ Ce script va if [ -n "\$merge" ]; then esection "Fusionner la branche" EOF - hook="BEFORE_MERGE_$SRC_TYPE"; [ -n "${!hook}" ] && _scripta <" - -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" - -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" -) -parse_args "$@"; set -- "${args[@]}" - -# charger la configuration -ensure_gitdir "$chdir" -load_branches all -load_config "$MYNAME" -load_branches current - -branch="$1" -if [ -z "$branch" -a ${#FeatureBranches[*]} -eq 1 ]; then - branch="${FeatureBranches[0]}" -fi -[ -n "$branch" ] || die "Vous devez spécifier la branche à créer" -branch="$FEATURE${branch#$FEATURE}" - -resolve_should_push -git_ensure_cleancheckout - -if array_contains AllBranches "$branch"; then - git checkout -q "$branch" -else - # si la branche source n'existe pas, la créer - args=(--origin "$Origin") - if [ -n "$ConfigFile" ]; then args+=(--config-file "$ConfigFile") - elif [ -n "$ConfigBranch" ]; then args+=(--config-branch "$ConfigBranch") - fi - [ -z "$Push" ] && args+=(--no-push) - exec "$MYDIR/pman" "${args[@]}" "$branch" -fi diff --git a/wip/pwip b/wip/pwip new file mode 120000 index 0000000..065a97c --- /dev/null +++ b/wip/pwip @@ -0,0 +1 @@ +_pman.tool \ No newline at end of file