diff --git a/bash/src/pman.conf.sh b/bash/src/pman.conf.sh index d174850..b1aec42 100644 --- a/bash/src/pman.conf.sh +++ b/bash/src/pman.conf.sh @@ -11,6 +11,7 @@ FEATURE=wip/ RELEASE=release- # branche de release MAIN=master +TAG_PREFIX= TAG_SUFFIX= # branche de hotfix HOTFIX=hotfix- diff --git a/bash/src/pman.sh b/bash/src/pman.sh index 30bf849..d9b799f 100644 --- a/bash/src/pman.sh +++ b/bash/src/pman.sh @@ -83,7 +83,7 @@ function _script_add() { function _push_branches() { local origin branch - _rscript_echo "* push branches" + _script_echo "* push branches" for branch in "${push_branches[@]}"; do origin="$Origin" [ -n "$origin" ] || setx origin=git_get_branch_remote "$branch" @@ -91,11 +91,11 @@ function _push_branches() { setx rbranch=git_get_branch_rbranch "$branch" "$origin" if [ -n "$rbranch" ]; then rbranch="${rbranch#refs/remotes/$origin/}" - _rscript_add <"$ConfigFile" 2>/dev/null + [ -s "$ConfigFile" ] || die "$ConfigBranch: aucune configuration trouvée sur cette branche" || return + source "$ConfigFile" + fi + elif [ -f .pman.conf ]; then + ConfigFile="$(pwd)/.pman.conf" + source "$ConfigFile" + elif [ -n "${MYNAME#prel}" ]; then + ConfigFile="$NULIBDIR/bash/src/pman${MYNAME#$1}.conf.sh" + source "$ConfigFile" + else + ConfigFile="$NULIBDIR/bash/src/pman.conf.sh" + fi +} + ################################################################################ # Merge diff --git a/bash/src/pman74.conf.sh b/bash/src/pman74.conf.sh index 30a97d0..f179165 100644 --- a/bash/src/pman74.conf.sh +++ b/bash/src/pman74.conf.sh @@ -9,6 +9,7 @@ DEVELOP=dev74 FEATURE=wip74/ RELEASE=rel74- MAIN=dist74 +TAG_PREFIX= TAG_SUFFIX=p74 HOTFIX=hotf74- DIST= diff --git a/bash/src/pman82.conf.sh b/bash/src/pman82.conf.sh index 51d58bd..85262bc 100644 --- a/bash/src/pman82.conf.sh +++ b/bash/src/pman82.conf.sh @@ -9,6 +9,7 @@ DEVELOP=dev82 FEATURE=wip82/ RELEASE=rel82- MAIN=dist82 +TAG_PREFIX= TAG_SUFFIX=p82 HOTFIX=hotf82- DIST= diff --git a/wip/pci b/wip/_pci similarity index 100% rename from wip/pci rename to wip/_pci diff --git a/wip/pp b/wip/_pp similarity index 100% rename from wip/pp rename to wip/_pp diff --git a/wip/pu b/wip/_pu similarity index 100% rename from wip/pu rename to wip/_pu diff --git a/wip/pman b/wip/pman new file mode 100755 index 0000000..c81e5a2 --- /dev/null +++ b/wip/pman @@ -0,0 +1,236 @@ +#!/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 + +################################################################################ +# Informations +################################################################################ + +SHOW_VARS=( + --Configuration + "${CONFIG_VARS[@]}" + --Paramètres + CurrentBranch + SrcType SrcBranch + DestBranch +) + +function show_action() { + echo_setv ConfigBranch="$ConfigBranch" + echo_setv ConfigFile="$(ppath "$ConfigFile")" + for var in "${SHOW_VARS[@]}"; do + if [ "${var#--}" != "$var" ]; then + estep "${var#--}" + else + echo_setv "$var=${!var}" + fi + done +} + +################################################################################ +# Initialisation +################################################################################ + +function _push_branches() { + [ -n "$Origin" ] || Origin=origin + git_have_remote "$Origin" || retun + if [ ${#push_branches[*]} -gt 0 ]; then + 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 + fi +} + +function init_repo_action() { + [ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé" + + local -a push_branches + + if [ ! -f .pman.conf ]; then + cp "$ConfigFile" .pman.conf + "${EDITOR:-nano}" .pman.conf + if testdiff .pman.conf "$ConfigFile"; then + ConfigFile="$(pwd)/.pman.conf" + load_config + load_branches current "$SrcBranch" + fi + git add .pman.conf + fi + if [ ! -f ".gitignore" ]; then + echo >.gitignore "\ +.~lock*# +.*.swp" + git add .gitignore + fi + + einfo "Création de la branche $MAIN" + git symbolic-ref HEAD "refs/heads/$MAIN" + git commit -m "commit initial" + push_branches+=("$MAIN") + + einfo "Création de la branche $DEVELOP" + git checkout -b "$DEVELOP" + push_branches+=("$DEVELOP") + + _push_branches +} + +function init_develop_action() { + if [ -z "$DevelopBranch" ]; then + local -a push_branches + + einfo "Création de la branche $DEVELOP" + git checkout -b "$DEVELOP" "$MAIN" + push_branches+=("$DEVELOP") + + _push_branches + fi + git checkout -q "$DEVELOP" +} + +function init_upstream_action() { + if [ -z "$UpstreamBranch" ]; then + [ -n "$UPSTREAM" ] || die "La branche UPSTREAM n'a pas été définie" + [ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas" + + local -a push_branches; local config + + # faire une copie de la configuration actuelle + ac_set_tmpfile config + cp "$ConfigFile" "$config" + + einfo "Création de la branche $UPSTREAM" + git checkout --orphan "$UPSTREAM" || die + git rm -rf . + cp "$config" .pman.conf + git add .pman.conf + git commit -m "commit initial" + push_branches+=("$UPSTREAM") + + einfo "Fusion dans $DEVELOP" + git checkout "$DEVELOP" + git merge \ + --no-ff -m "Intégration initiale de la branche $UPSTREAM" \ + -srecursive -Xours --allow-unrelated-histories \ + "$UPSTREAM" + push_branches+=("$DEVELOP") + + _push_branches + fi + git checkout -q "$UPSTREAM" +} + +function init_dist_action() { + if [ -z "$DistBranch" ]; then + [ -n "$DIST" ] || die "La branche DIST n'a pas été définie" + [ -n "$MainBranch" ] || die "$MAIN: cette branche n'existe pas" + + local -a push_branches + + einfo "Création de la branche $DIST" + git checkout -b "$DIST" "$MAIN" || die + push_branches+=("$DIST") + + _push_branches + fi + git checkout -q "$DIST" +} + +function init_feature_action() { + local branch="$FEATURE${1#$FEATURE}" + [ -n "$branch" ] || die "Vous devez définir la nom de la branche à créer" + if ! array_contains AllBranches "$branch"; then + [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" + + local -a push_branches + + einfo "Création de la branche $branch" + git checkout -b "$branch" "$DEVELOP" || die + push_branches+=("$branch") + + _push_branches + fi + git checkout -q "$branch" +} + +function init_action() { + local what="${1:-develop}"; shift + case "$what" in + init|repo|r) init_repo_action "$@";; + main|m) git checkout -q "$MAIN";; + develop|dev|d) init_develop_action "$@";; + upstream|up|u) init_upstream_action "$@";; + dist|x) init_dist_action "$@";; + *) init_feature_action "$what" "$@";; + esac +} + +################################################################################ +# Programme principal +################################################################################ + +chdir= +ConfigBranch= +ConfigFile= +action=init +Origin= +Push=1 +args=( + "gérer un projet git" + "repo|develop|upstream|dist" + -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations" + -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" + -s,--show-config action=show "++\ +afficher la configuration chargée" + -o:,--origin Origin= "++\ +origine vers laquelle pousser les branches" + -n,--no-push Push= "\ +ne pas pousser les branches vers leur origine après leur création" + -p,--push Push=1 "++\ +pousser les branches vers leur origine après leur création. +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 + +# puis faire l'action que l'on nous demande +case "$action" in +show) + show_action "$@" + ;; +init) + git_ensure_cleancheckout + init_action "$@" + ;; +esac diff --git a/wip/pmerge b/wip/pmerge new file mode 100755 index 0000000..f8d6ad7 --- /dev/null +++ b/wip/pmerge @@ -0,0 +1,280 @@ +#!/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 </dev/null)" - [ -n "$config" ] || die "$ConfigBranch: aucune configuration trouvée sur cette branche" - eval "$config" - fi - elif [ -f .pman.conf ]; then - ConfigFile=.pman.conf - source "$ConfigFile" - elif [ -n "${MYNAME#prel}" ]; then - require: pman${MYNAME#prel}.conf - fi - - SrcBranch="$1" - [ -n "$SrcBranch" ] || SrcBranch="$CurrentBranch" - case "$SrcBranch" in - "$UPSTREAM") SrcType=upstream; DestBranch="$DEVELOP";; - "$FEATURE"*) SrcType=feature; DestBranch="$DEVELOP";; - "$DEVELOP") SrcType=develop; DestBranch="$MAIN";; - "$RELEASE"*) SrcType=release; DestBranch="$MAIN";; - "$HOTFIX"*) SrcType=hotfix; DestBranch="$MAIN";; - "$MAIN") SrcType=main; DestBranch="$DIST";; - "$DIST") SrcType=dist; DestBranch=;; - *) DestBranch=;; - esac -} - -function ensure_branches() { - [ -n "$SrcBranch" -a -n "$DestBranch" ] || - die "$SrcBranch: Aucune configuration de fusion trouvée pour cette branche" - - array_contains AllBranches "$SrcBranch" || die "$SrcBranch: branche source introuvable" - array_contains AllBranches "$DestBranch" || die "$DestBranch: branche destination introuvable" - - local branch - ReleaseBranch= - HotfixBranch= - for branch in "${AllBranches[@]}"; do - if [[ "$branch" == "$RELEASE"* ]]; then - ReleaseBranch="$branch" - elif [[ "$branch" == "$HOTFIX"* ]]; then - HotfixBranch="$branch" - fi - done -} - -################################################################################ -# Initialisation -################################################################################ - -function init_action() { - : -} - -################################################################################ -# 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 @@ -107,72 +16,14 @@ function show_action() { fi } -################################################################################ -# Fusion de branche -################################################################################ +function ensure_branches() { + [ -n "$SrcBranch" -a -n "$DestBranch" ] || + die "$SrcBranch: Aucune configuration de fusion trouvée pour cette 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 <