modifs.mineures sans commentaires
This commit is contained in:
		
							parent
							
								
									c1c369f554
								
							
						
					
					
						commit
						95b0263969
					
				| @ -147,18 +147,23 @@ EOF | ||||
| ################################################################################ | ||||
| # Config | ||||
| 
 | ||||
| function ensure_gitdir() { | ||||
| function check_gitdir() { | ||||
|     # commencer dans le répertoire indiqué | ||||
|     local chdir="$1" | ||||
|     if [ -n "$chdir" ]; then | ||||
|         cd "$chdir" || die || return | ||||
|         cd "$chdir" || return 1 | ||||
|     fi | ||||
| 
 | ||||
|     # se mettre à la racine du dépôt git | ||||
|     local gitdir | ||||
|     git_ensure_gitvcs | ||||
|     setx gitdir=git_get_toplevel | ||||
|     cd "$gitdir" || die || return | ||||
|     cd "$gitdir" || return 1 | ||||
| } | ||||
| 
 | ||||
| function ensure_gitdir() { | ||||
|     # commencer dans le répertoire indiqué | ||||
|     check_gitdir "$@" || die || return | ||||
| } | ||||
| 
 | ||||
| function load_branches() { | ||||
| @ -245,6 +250,9 @@ function load_config() { | ||||
|         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 | ||||
|  | ||||
							
								
								
									
										10
									
								
								bash/src/pman.tool.pdev.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								bash/src/pman.tool.pdev.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| # -*- 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= | ||||
							
								
								
									
										10
									
								
								bash/src/pman.tool.pdist.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								bash/src/pman.tool.pdist.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| # -*- 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= | ||||
							
								
								
									
										10
									
								
								bash/src/pman.tool.pmain.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								bash/src/pman.tool.pmain.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| # -*- 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= | ||||
| @ -20,8 +20,8 @@ fi | ||||
| [ -f /etc/profile ] && source /etc/profile | ||||
| [ -f ~/.bash_profile ] && source ~/.bash_profile | ||||
| 
 | ||||
| # Modifier le PATH. Ajouter aussi le chemin vers les uapps python | ||||
| PATH=$(qval "$NULIBDIR/bin:$PATH") | ||||
| # Modifier le PATH | ||||
| PATH=$(qval "$NULIBDIR/wip:$NULIBDIR/bin:$PATH") | ||||
| 
 | ||||
| if [ -n '$DEFAULT_PS1' ]; then | ||||
|   DEFAULT_PS1=$(qval "[nlshell] $DEFAULT_PS1") | ||||
|  | ||||
							
								
								
									
										372
									
								
								wip/_pman.tool
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										372
									
								
								wip/_pman.tool
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,372 @@ | ||||
| #!/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" | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| CurrentBranch=$CurrentBranch | ||||
| LocalBranches=${LocalBranches[*]} | ||||
| RemoteBranches=${RemoteBranches[*]} | ||||
| AllBranches=${AllBranches[*]} | ||||
| 
 | ||||
| SrcType=$SrcType | ||||
| SrcBranch=$SrcBranch | ||||
| DestType=$DestType | ||||
| DestBranch=$DestBranch | ||||
| 
 | ||||
| UpstreamBranch=$UpstreamBranch | ||||
| FeatureBranches=${FeatureBranches[*]} | ||||
| DevelopBranch=$DevelopBranch | ||||
| ReleaseBranch=$ReleaseBranch | ||||
| HotfixBranch=$HotfixBranch | ||||
| MainBranch=$MainBranch | ||||
| 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é?)" | ||||
| } | ||||
| 
 | ||||
| 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 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 | ||||
| 
 | ||||
|         resolve_should_push | ||||
| 
 | ||||
|         enote "Vous allez créer la branche ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE} <-- ${COULEUR_ROUGE}$DestBranch${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") | ||||
| 
 | ||||
|         _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" | ||||
| 
 | ||||
|    array_contains LocalBranches "${!SRC_BRANCH}" || die "${!SRC_BRANCH}: branche source introuvable" | ||||
|    array_contains LocalBranches "${!DEST_BRANCH}" || die "${!DEST_BRANCH}: branche destination introuvable" | ||||
| } | ||||
| 
 | ||||
| function _show_action() { | ||||
|     local commits | ||||
|     setx commits=_list_commits | ||||
|     if [ -n "$commits" ]; then | ||||
|         if [ $ShowLevel -ge 2 ]; then | ||||
|             { | ||||
|                 echo "\ | ||||
| # Commits à fusionner ${!SRC_BRANCH} --> ${!DEST_BRANCH} | ||||
| 
 | ||||
| $commits | ||||
| " | ||||
|                 _sd_COLOR=always _show_diff | ||||
|             } | less -eRF | ||||
|         else | ||||
|             einfo "Commits à fusionner ${!SRC_BRANCH} --> ${!DEST_BRANCH}" | ||||
|             eecho "$commits" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
| function show_action() { | ||||
|     git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY" | ||||
|     ensure_branches | ||||
|     _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:+ | ||||
| - 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 <<EOF | ||||
| ################################################################################ | ||||
| # merge | ||||
| if [ -n "\$merge" ]; then | ||||
| esection "Fusionner la branche" | ||||
| EOF | ||||
|     hook="BEFORE_MERGE_$SRC_TYPE"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _mscript_merge_branch | ||||
|     hook="AFTER_MERGE_$SRC_TYPE"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     if [ -n "$ShouldDelete" ]; then | ||||
|         _scripta <<EOF | ||||
| ################################################################################ | ||||
| # delete | ||||
| if [ -n "\$delete" ]; then | ||||
| esection "Supprimer la branche" | ||||
| EOF | ||||
|         _mscript_delete_branch | ||||
|         hook="AFTER_DELETE_$SRC_TYPE"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|         _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
|     fi | ||||
| 
 | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # push | ||||
| if [ -n "\$push" ]; then | ||||
| esection "Pousser les branches" | ||||
| EOF | ||||
|     hook="BEFORE_PUSH_$DEST_TYPE"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| 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 | ||||
|     hook="AFTER_PUSH_$DEST_TYPE"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     [ -n "$Delete" -o -z "$ShouldDelete" ] && Deleted=1 || Deleted= | ||||
|     [ -n "$ShouldDelete" -a -n "$Delete" ] && ShouldDelete= | ||||
|     [ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush= | ||||
|     if [ -n "$_Fake" ]; then | ||||
|         cat "$script" | ||||
|     elif ! "$script" merge ${Delete:+delete} ${Push:+push}; then | ||||
|         eimportant "\ | ||||
| Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' | ||||
| 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}" | ||||
|         die | ||||
|     elif [ -n "$Deleted" -a -n "$Push" ]; then | ||||
|         [ -n "$_KeepScript" ] || rm "$script" | ||||
|         [ -n "$AfterMerge" ] && eval "$AfterMerge" | ||||
|     else | ||||
|         local msg="\ | ||||
| Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' | ||||
| Vous pouvez consulter le script et/ou le relancer | ||||
|     ./$script${ShouldDelete:+ delete}${ShouldPush:+ push}" | ||||
|         [ -n "$AfterMerge" ] && msg="$msg | ||||
| Il y a aussi les commandes supplémentaires suivantes: | ||||
|     ${AfterMerge// | ||||
| / | ||||
|     }" | ||||
|         einfo "$msg" | ||||
|     fi | ||||
| } | ||||
| function merge_action() { | ||||
|     if [ -n "$MERGE_PREL" ]; then | ||||
|         [ -n "$ForceMerge" ] || die "$SrcBranch: cette branche doit être fusionnée dans $DestBranch avec prel" | ||||
|     fi | ||||
|     [ -n "$AfterMerge" ] || setx AfterMerge=qvals git checkout -q "$SrcBranch" | ||||
|     [ -n "$ALLOW_DELETE" ] || Delete= | ||||
|     [ -z "$_Fake" ] && git_ensure_cleancheckout | ||||
|     if array_contains LocalBranches "$SrcBranch"; then | ||||
|         ensure_branches | ||||
|         resolve_should_push | ||||
|         _merge_action "$@" | ||||
|     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" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function rebase_action() { | ||||
|     die "non implémenté" | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Programme principal | ||||
| ################################################################################ | ||||
| 
 | ||||
| loaded_config= | ||||
| if check_gitdir; then | ||||
|     load_branches all | ||||
|     load_config "$PMAN_TOOL" | ||||
|     if [ -n "${!SRC_TYPE}" ]; then | ||||
|         load_branches current "${!SRC_TYPE}" | ||||
|         loaded_config=1 | ||||
|     fi | ||||
| fi | ||||
| [ -n "${!SRC_TYPE}" ] && SrcDesc="${!SRC_TYPE}" || SrcDesc="<$SRC_TYPE>" | ||||
| SrcDesc="${COULEUR_BLEUE}$SrcDesc${COULEUR_NORMALE}" | ||||
| DestDesc= | ||||
| 
 | ||||
| purpose="gérer la branche $SrcDesc" | ||||
| if [ -n "$DEST_TYPE" ]; then | ||||
|     [ -n "${!DEST_TYPE}" ] && DestDesc="${!DEST_TYPE}" || DestDesc="<$DEST_TYPE>" | ||||
|     DestDesc="${COULEUR_ROUGE}$DestDesc${COULEUR_NORMALE}" | ||||
|     purpose="${purpose} et sa fusion dans $DestDesc" | ||||
| fi | ||||
| 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. 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" | ||||
|     --fake _Fake=1 "++option non documentée" | ||||
|     --keep-script _KeepScript=1 "++option non documentée" | ||||
|     --dump action=dump "++afficher les noms des branches" | ||||
|     --checkout action=checkout "++\ | ||||
| basculer sur la branche $SrcDesc. c'est l'action par défaut" | ||||
| )     | ||||
| if [ -n "$ALLOW_MERGE" ]; then | ||||
|     usage="${usage}|--show|--merge" | ||||
|     variables="\ | ||||
| Les variables supplémentaires suivantes peuvent être définies: | ||||
|     BEFORE_MERGE_${SRC_TYPE} | ||||
|     AFTER_MERGE_${SRC_TYPE}" | ||||
|     args+=( | ||||
|         -w,--show '$action=show; inc@ ShowLevel' "\ | ||||
| lister les modifications qui seraient fusionnées dans la branche $DestDesc" | ||||
|         -b,--rebase action=rebase "\ | ||||
| lancer git rebase -i sur la branche $SrcDesc. cela permet de réordonner les | ||||
| commits pour nettoyer l'historique avant la fusion" | ||||
|         -m,--merge action=merge "++\ | ||||
| fusionner la branche $SrcDesc dans la branche $DestDesc" | ||||
|         --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 "$MERGE_PREL" ]; 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 "$ALLOW_DELETE" ]; then | ||||
|         variables="${variables} | ||||
|     AFTER_DELETE_${SRC_TYPE}}" | ||||
|         args+=( | ||||
|             -k,--no-delete Delete= "\ | ||||
| ne pas supprimer la branche $SrcDesc après la fusion dans la branche $DestDesc | ||||
| cette option ne devrait pas être utilisée avec --squash" | ||||
|             --delete Delete=1 "++\ | ||||
| supprimer la branche $SrcDesc après la fusion dans la branche $DestDesc | ||||
| c'est l'option par défaut" | ||||
|         ) | ||||
|     fi | ||||
|     if [ -n "$DEST_TYPE" ]; then | ||||
|         variables="${variables} | ||||
|     BEFORE_PUSH_${DEST_TYPE} | ||||
|     AFTER_PUSH_${DEST_TYPE}" | ||||
|     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= | ||||
| [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= | ||||
| [ -z "$PMAN_NO_DELETE" ] && Delete=1 || Delete= | ||||
| 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 "$PMAN_TOOL" | ||||
|     if [ -n "${!SRC_TYPE}" ]; then | ||||
|         load_branches current "${!SRC_TYPE}" | ||||
|     fi | ||||
| fi | ||||
| resolve_should_push quiet | ||||
| 
 | ||||
| [ -n "${!SRC_TYPE}" ] || | ||||
|     die "Aucune branche définie pour $SRC_TYPE. Veuillez éditer le fichier .pman.conf" | ||||
| 
 | ||||
| "${action}_action" "$@" | ||||
							
								
								
									
										372
									
								
								wip/pman
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										372
									
								
								wip/pman
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,372 @@ | ||||
| #!/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 | ||||
|     CurrentType=SrcType | ||||
| ) | ||||
| 
 | ||||
| function show_action() { | ||||
|     local var src | ||||
|     echo_setv ConfigBranch="$ConfigBranch" | ||||
|     echo_setv ConfigFile="$(ppath "$ConfigFile")" | ||||
|     for var in "${SHOW_VARS[@]}"; do | ||||
|         if [ "${var#--}" != "$var" ]; then | ||||
|             estep "${var#--}" | ||||
|         else | ||||
|             splitfsep "$var" = var src | ||||
|             [ -n "$src" ] || src="$var" | ||||
|             echo_setv "$var=${!src}" | ||||
|         fi | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Initialisation | ||||
| ################################################################################ | ||||
| 
 | ||||
| function _init_config() { | ||||
|     if [ ! -f .pman.conf -o -n "$ForceCreate" ]; then | ||||
|         ac_set_tmpfile config | ||||
|         cp "$ConfigFile" "$config" | ||||
|         "${EDITOR:-nano}" "$config" | ||||
|         [ -s "$config" ] || return 1 | ||||
| 
 | ||||
|         cp "$config" .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 | ||||
|     return 0 | ||||
| } | ||||
| 
 | ||||
| function init_repo_action() { | ||||
|     local -a push_branches; local config | ||||
| 
 | ||||
|     [ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé" | ||||
| 
 | ||||
|     _init_config || exit_with ewarn "Initialisation du dépôt annulée" | ||||
| 
 | ||||
|     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_config_action() { | ||||
|     local -a push_branches; local config | ||||
| 
 | ||||
|     [ -f .pman.conf -a -z "$ForceCreate" ] && die "La configuration pman a déjà été initialisée" | ||||
| 
 | ||||
|     resolve_should_push | ||||
| 
 | ||||
|     _init_config || exit_with ewarn "Initialisation de la configuration annulée" | ||||
|     git commit -m "configuration pman" | ||||
|     push_branches+=("$CurrentBranch") | ||||
| 
 | ||||
|     _push_branches | ||||
| } | ||||
| 
 | ||||
| function _init_composer() { | ||||
|     if [ ! -f .composer.pman.yml -o -n "$ForceCreate" ]; then | ||||
|         ac_set_tmpfile config | ||||
|         cat >"$config" <<EOF | ||||
| # -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8 | ||||
| 
 | ||||
| composer: | ||||
|   match_prefix: | ||||
|   match_prefix-dev: | ||||
|   profiles: [ dev, dist ] | ||||
|   dev: | ||||
|     link: true | ||||
|     require: | ||||
|     reqire-dev: | ||||
|   dist: | ||||
|     link: false | ||||
|     require: | ||||
|     reqire-dev: | ||||
| EOF | ||||
|         "${EDITOR:-nano}" "$config" | ||||
|         [ -s "$config" ] || return 1 | ||||
| 
 | ||||
|         cp "$config" .composer.pman.yml | ||||
|         git add .composer.pman.yml | ||||
|     fi | ||||
|     return 0 | ||||
| } | ||||
| 
 | ||||
| function init_composer_action() { | ||||
|     local -a push_branches; local config | ||||
| 
 | ||||
|     [ -f .composer.pman.yml -a -z "$ForceCreate" ] && die "La configuration pman composer a déjà été initialisée" | ||||
| 
 | ||||
|     resolve_should_push | ||||
| 
 | ||||
|     _init_composer || exit_with ewarn "Initialisation de la configuration annulée" | ||||
|     git commit -m "configuration pman composer" | ||||
|     push_branches+=("$CurrentBranch") | ||||
| 
 | ||||
|     _push_branches | ||||
| } | ||||
| 
 | ||||
| function _ensure_main_branch() { | ||||
|     [ -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é?)" | ||||
| } | ||||
| 
 | ||||
| function checkout_main_action() { | ||||
|     if [ -z "$MainBranch" ]; then | ||||
|         array_contains AllBranches "$MAIN" && exit_with enote "\ | ||||
| $MAIN: une branche du même nom existe dans l'origine | ||||
|     git checkout $MAIN" | ||||
|         _ensure_main_branch | ||||
|     fi | ||||
|     git checkout -q "$MAIN" | ||||
| } | ||||
| 
 | ||||
| function _ensure_develop_branch() { | ||||
|     [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" | ||||
|     [ "$1" == init -o -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" | ||||
| } | ||||
| 
 | ||||
| function init_develop_action() { | ||||
|     local -a push_branches | ||||
| 
 | ||||
|     if [ -z "$DevelopBranch" ]; then | ||||
|         array_contains AllBranches "$DEVELOP" && exit_with enote "\ | ||||
| $DEVELOP: une branche du même nom existe dans l'origine | ||||
|     git checkout $DEVELOP" | ||||
|         _ensure_main_branch | ||||
|         _ensure_develop_branch init | ||||
| 
 | ||||
|         resolve_should_push | ||||
| 
 | ||||
|         enote "Vous allez créer la branche ${COULEUR_VERTE}$DEVELOP${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" | ||||
|         ask_yesno "Voulez-vous continuer?" O || die | ||||
| 
 | ||||
|         einfo "Création de la branche $DEVELOP" | ||||
|         git checkout -b "$DEVELOP" "$MAIN" || die | ||||
|         push_branches+=("$DEVELOP") | ||||
| 
 | ||||
|         _push_branches | ||||
|     fi | ||||
|     git checkout -q "$DEVELOP" | ||||
| } | ||||
| 
 | ||||
| function _ensure_upstream_branch() { | ||||
|     [ -n "$UPSTREAM" ] || die "La branche UPSTREAM n'a pas été définie" | ||||
|     [ "$1" == init -o -n "$UpstreamBranch" ] || die "$UPSTREAM: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" | ||||
| } | ||||
| 
 | ||||
| function init_upstream_action() { | ||||
|     local -a push_branches; local config | ||||
| 
 | ||||
|     if [ -z "$UpstreamBranch" ]; then | ||||
|         array_contains AllBranches "$UPSTREAM" && exit_with enote "\ | ||||
| $UPSTREAM: une branche du même nom existe dans l'origine | ||||
|     git checkout $UPSTREAM" | ||||
|         _ensure_develop_branch | ||||
|         _ensure_upstream_branch init | ||||
| 
 | ||||
|         resolve_should_push | ||||
| 
 | ||||
|         enote "Vous allez créer la branche ${COULEUR_VERTE}$UPSTREAM${COULEUR_NORMALE}" | ||||
|         ask_yesno "Voulez-vous continuer?" O || die | ||||
| 
 | ||||
|         # 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 "<pman>Intégration initiale de la branche $UPSTREAM" \ | ||||
|             -srecursive -Xours --allow-unrelated-histories \ | ||||
|             "$UPSTREAM" | ||||
|         push_branches+=("$DEVELOP") | ||||
| 
 | ||||
|         _push_branches | ||||
|     fi | ||||
|     git checkout -q "$UPSTREAM" | ||||
| } | ||||
| 
 | ||||
| function _ensure_dist_branch() { | ||||
|     [ -n "$DIST" ] || die "La branche DIST n'a pas été définie" | ||||
|     [ "$1" == init -o -n "$DistBranch" ] || die "$DIST: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" | ||||
| } | ||||
| 
 | ||||
| function init_dist_action() { | ||||
|     local -a push_branches | ||||
| 
 | ||||
|     if [ -z "$DistBranch" ]; then | ||||
|         array_contains AllBranches "$DIST" && exit_with enote "\ | ||||
| $DIST: une branche du même nom existe dans l'origine | ||||
|     git checkout $DIST" | ||||
|         _ensure_main_branch | ||||
|         _ensure_dist_branch init | ||||
| 
 | ||||
|         resolve_should_push | ||||
| 
 | ||||
|         enote "Vous allez créer la branche ${COULEUR_VERTE}$DIST${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" | ||||
|         ask_yesno "Voulez-vous continuer?" O || die | ||||
| 
 | ||||
|         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 -a push_branches; local branch | ||||
| 
 | ||||
|     [ -n "$FEATURE" ] || die "La branche FEATURE n'a pas été définie" | ||||
|     branch="${1#$FEATURE}" | ||||
|     [ -n "$branch" ] || die "Vous devez spécifier le nom de la branche" | ||||
|     branch="$FEATURE$branch" | ||||
| 
 | ||||
|     if ! array_contains LocalBranches "$branch"; then | ||||
|         array_contains AllBranches "$branch" && exit_with enote "\ | ||||
| $branch: une branche du même nom existe dans l'origine | ||||
|     git checkout $branch" | ||||
|         _ensure_develop_branch | ||||
| 
 | ||||
|         resolve_should_push | ||||
| 
 | ||||
|         enote "Vous allez créer la branche ${COULEUR_VERTE}$branch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$DEVELOP${COULEUR_NORMALE}" | ||||
|         ask_yesno "Voulez-vous continuer?" O || die | ||||
| 
 | ||||
|         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 "$@";; | ||||
|     config) init_config_action "$@";; | ||||
|     composer) init_composer_action "$@";; | ||||
|     main|m) checkout_main_action;; | ||||
|     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= | ||||
| [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= | ||||
| ForceCreate= | ||||
| args=( | ||||
|     "gérer un projet git" | ||||
|     "\ | ||||
| repo|config|composer | ||||
| develop|upstream|dist | ||||
| 
 | ||||
| INITIALISATION | ||||
| 
 | ||||
| Par défaut, le script agit en mode initialisation qui permet de créer et/ou | ||||
| configurer certaines branches du dépôt si elles n'existent pas déjà | ||||
| 
 | ||||
|     repo | ||||
|         initialiser un dépôt vide et créer les branches $MAIN et $DEVELOP | ||||
| 
 | ||||
|     develop | ||||
|         créer la branche $DEVELOP | ||||
|     upstream | ||||
|         créer la branche ${UPSTREAM:-UPSTREAM} en tant que source de la branche $DEVELOP | ||||
|     dist | ||||
|         créer la branche ${DIST:-DIST} en tant que destination de la branche $MAIN | ||||
|     anything | ||||
|         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" | ||||
|     -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-config action=show "++\ | ||||
| afficher la configuration chargée" | ||||
|     --composer-select-profile action=composer_select_profile "\ | ||||
| sélectionner le profil composer spécifié en argument" | ||||
|     -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" | ||||
|     --push Push=1 "++\ | ||||
| pousser les branches vers leur origine après leur création. | ||||
| c'est l'option par défaut" | ||||
|     -f,--force-create ForceCreate=1 "\ | ||||
| Avec config, forcer la (re)création du fichier .pman.conf" | ||||
| ) | ||||
| 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 "$@" | ||||
|     ;; | ||||
| composer_select_profile) | ||||
|     exec "$MYDIR/_pman-$action.php" "$@" | ||||
|     ;; | ||||
| *) | ||||
|     die "$action: action non implémentée" | ||||
|     ;; | ||||
| esac | ||||
							
								
								
									
										262
									
								
								wip/pmer
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										262
									
								
								wip/pmer
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,262 @@ | ||||
| #!/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 | ||||
|         if [ $ShowLevel -ge 2 ]; then | ||||
|             { | ||||
|                 echo "\ | ||||
| # Commits à fusionner $SrcBranch --> $DestBranch | ||||
| 
 | ||||
| $commits | ||||
| " | ||||
|                 _sd_COLOR=always _show_diff | ||||
|             } | less -eRF | ||||
|         else | ||||
|             einfo "Commits à fusionner $SrcBranch --> $DestBranch" | ||||
|             eecho "$commits" | ||||
|         fi | ||||
|     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() { | ||||
|     [ -z "$ShouldPush" ] && enote "\ | ||||
| L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine" | ||||
| 
 | ||||
|     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 script=".git/pman-merge.sh" | ||||
|     local -a push_branches delete_branches | ||||
|     local hook | ||||
|     local comment= | ||||
|     local or_die=" || exit 1" | ||||
| 
 | ||||
|     _mscript_start | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # merge | ||||
| if [ -n "\$merge" ]; then | ||||
| esection "Fusionner la branche" | ||||
| EOF | ||||
|     hook="BEFORE_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _mscript_merge_branch | ||||
|     hook="AFTER_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     if [ -n "$ShouldDelete" ]; then | ||||
|         _scripta <<EOF | ||||
| ################################################################################ | ||||
| # delete | ||||
| if [ -n "\$delete" ]; then | ||||
| esection "Supprimer la branche" | ||||
| EOF | ||||
|         _mscript_delete_branch | ||||
|         hook="AFTER_DELETE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|         _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
|     fi | ||||
| 
 | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # push | ||||
| if [ -n "\$push" ]; then | ||||
| esection "Pousser les branches" | ||||
| EOF | ||||
|     hook="BEFORE_PUSH_${DestType^^}"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| 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 | ||||
|     hook="AFTER_PUSH_${DestType^^}"; [ -n "${!hook}" ] && _scripta <<EOF | ||||
| ( | ||||
| ${!hook} | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     [ -n "$Delete" -o -z "$ShouldDelete" ] && Deleted=1 || Deleted= | ||||
|     [ -n "$ShouldDelete" -a -n "$Delete" ] && ShouldDelete= | ||||
|     [ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush= | ||||
|     if [ -n "$_Fake" ]; then | ||||
|         cat "$script" | ||||
|     elif ! "$script" merge ${Delete:+delete} ${Push:+push}; then | ||||
|         eimportant "\ | ||||
| Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' | ||||
| 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}" | ||||
|         die | ||||
|     elif [ -n "$Deleted" -a -n "$Push" ]; then | ||||
|         [ -n "$_KeepScript" ] || rm "$script" | ||||
|         [ -n "$AfterMerge" ] && eval "$AfterMerge" | ||||
|     else | ||||
|         local msg="\ | ||||
| Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}' | ||||
| Vous pouvez consulter le script et/ou le relancer | ||||
|     ./$script${ShouldDelete:+ delete}${ShouldPush:+ push}" | ||||
|         [ -n "$AfterMerge" ] && msg="$msg | ||||
| Il y a aussi les commandes supplémentaires suivantes: | ||||
|     ${AfterMerge// | ||||
| / | ||||
|     }" | ||||
|         einfo "$msg" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| ################################################################################ | ||||
| # Programme principal | ||||
| ################################################################################ | ||||
| 
 | ||||
| chdir= | ||||
| Origin= | ||||
| ConfigBranch= | ||||
| ConfigFile= | ||||
| _Fake= | ||||
| _KeepScript= | ||||
| action=merge | ||||
| ShowLevel=0 | ||||
| TechMerge= | ||||
| SquashMsg= | ||||
| [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= | ||||
| [ -z "$PMAN_NO_DELETE" ] && Delete=1 || Delete= | ||||
| AfterMerge= | ||||
| args=( | ||||
|     "fusionner la branche source dans la branche destination correspondante" | ||||
|     " [source] | ||||
| 
 | ||||
| CONFIGURATION | ||||
| 
 | ||||
| Le fichier .pman.conf contient la configuration des branches. Les variables | ||||
| supplémentaires suivantes peuvent être définies: | ||||
|     BEFORE_MERGE_<srcType> | ||||
|     AFTER_MERGE_<srcType> | ||||
|     AFTER_DELETE_<srcType> | ||||
|     BEFORE_PUSH_<destType> | ||||
|     AFTER_PUSH_<destType> | ||||
| srcType et destType pouvant valoir UPSTREAM, DEVELOP, FEATURE, RELEASE, MAIN, HOTFIX, DIST" | ||||
|     -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" | ||||
|     --fake _Fake=1 "++option non documentée" | ||||
|     --keep-script _KeepScript=1 "++option non documentée" | ||||
|     -w,--show '$action=show; inc@ ShowLevel' "\ | ||||
| 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" | ||||
|     -f,--force-merge ForceMerge=1 "++\ | ||||
| forcer la fusion pour une branche qui devrait être traitée par prel" | ||||
|     -a:,--after-merge AfterMerge= "\ | ||||
| évaluer le script spécifié après une fusion *réussie*" | ||||
| ) | ||||
| parse_args "$@"; set -- "${args[@]}" | ||||
| 
 | ||||
| # charger la configuration | ||||
| ensure_gitdir "$chdir" | ||||
| load_branches all | ||||
| load_config "$MYNAME" | ||||
| load_branches current "$1" | ||||
| 
 | ||||
| resolve_should_push quiet | ||||
| 
 | ||||
| # 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) | ||||
|     ShouldDelete=1 | ||||
|     no_merge_msg="$SrcBranch: cette branche doit être fusionnée dans $DestBranch avec prel" | ||||
|     if [ "$SrcType" == develop ]; then | ||||
|         [ -z "$ForceMerge" ] && die "$no_merge_msg" | ||||
|         [ -n "$AfterMerge" ] || setx AfterMerge=qvals git checkout -q "$SrcBranch" | ||||
|     elif [ "$SrcType" == release -o "$SrcType" == hotfix ]; then | ||||
|         die "$no_merge_msg" | ||||
|     fi | ||||
|     # n'autoriser la suppression que pour feature | ||||
|     [ "$SrcType" == feature ] || ShouldDelete= | ||||
|     [ -z "$ShouldDelete" ] && Delete= | ||||
|     [ -z "$_Fake" ] && git_ensure_cleancheckout | ||||
|     if array_contains LocalBranches "$SrcBranch"; then | ||||
|         ensure_branches | ||||
|         merge_action "$@" | ||||
|     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" | ||||
|     fi | ||||
|     ;; | ||||
| *) | ||||
|     die "$action: action non implémentée" | ||||
|     ;; | ||||
| esac | ||||
							
								
								
									
										292
									
								
								wip/prel
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										292
									
								
								wip/prel
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,292 @@ | ||||
| #!/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" | ||||
| 
 | ||||
| function show_action() { | ||||
|     local commits | ||||
|     setx commits=_list_commits | ||||
|     if [ -n "$commits" ]; then | ||||
|         if [ $ShowLevel -ge 2 ]; then | ||||
|             { | ||||
|                 echo "\ | ||||
| # Commits à fusionner $SrcBranch --> $DestBranch | ||||
| 
 | ||||
| $commits | ||||
| " | ||||
|                 _sd_COLOR=always _show_diff | ||||
|             } | less -eRF | ||||
|         else | ||||
|             einfo "Commits à fusionner $SrcBranch --> $DestBranch" | ||||
|             eecho "$commits" | ||||
|         fi | ||||
|     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" | ||||
| 
 | ||||
|    Tag="$TAG_PREFIX$Version$TAG_SUFFIX" | ||||
|    local -a tags | ||||
|    setx -a tags=git tag -l "${TAG_PREFIX}*${TAG_SUFFIX}" | ||||
|    if [ -z "$ForceCreate" ]; then | ||||
|        array_contains tags "$Tag" && die "$Tag: le tag correspondant à la version existe déjà" | ||||
|    fi | ||||
| } | ||||
| 
 | ||||
| function create_release_action() { | ||||
|     if [ -n "$ReleaseBranch" ]; then | ||||
|         Version="${ReleaseBranch#$RELEASE}" | ||||
|         Tag="$TAG_PREFIX$Version$TAG_SUFFIX" | ||||
|         merge_release_action "$@"; return $? | ||||
|     elif [ -n "$HotfixBranch" ]; then | ||||
|         Version="${HotfixBranch#$HOTFIX}" | ||||
|         Tag="$TAG_PREFIX$Version$TAG_SUFFIX" | ||||
|         merge_hotfix_action "$@"; return $? | ||||
|     fi | ||||
| 
 | ||||
|     [ -n "$ManualRelease" ] && ewarn "\ | ||||
| L'option --no-merge a été forcée puisque ce dépôt ne supporte pas les releases automatiques" | ||||
|     [ -z "$ShouldPush" ] && enote "\ | ||||
| L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine" | ||||
| 
 | ||||
|     if [ -z "$Version" -a -n "$CurrentVersion" -a -f VERSION.txt ]; then | ||||
|         Version="$(<VERSION.txt)" | ||||
|         Tag="$TAG_PREFIX$Version$TAG_SUFFIX" | ||||
|     fi | ||||
|     if [ -z "$Version" ]; then | ||||
|         [ -f VERSION.txt ] && einfo "La version actuelle est $(<VERSION.txt)" | ||||
|         die "Vous devez spécifier la version de la nouvelle release avec l'une des options -v ou -C" | ||||
|     fi | ||||
| 
 | ||||
|     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 script=".git/pman-release.sh" | ||||
|     local -a push_branches push_tags | ||||
|     local comment= | ||||
|     local or_die=" || exit 1" | ||||
| 
 | ||||
|     _rscript_start | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # create | ||||
| if [ -n "\$create" ]; then | ||||
| esection "Création de la release" | ||||
| EOF | ||||
|     [ -n "$BEFORE_CREATE_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $BEFORE_CREATE_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _rscript_create_release_branch | ||||
|     [ -n "$AFTER_CREATE_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $AFTER_CREATE_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # merge | ||||
| if [ -n "\$merge" ]; then | ||||
| esection "Fusionner la release" | ||||
| EOF | ||||
|     [ -n "$BEFORE_MERGE_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $BEFORE_MERGE_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _rscript_merge_release_branch "$DestBranch" "$Tag" | ||||
|     _rscript_merge_release_branch "$SrcBranch" | ||||
|     _rscript_delete_release_branch | ||||
|     [ -n "$AFTER_MERGE_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $AFTER_MERGE_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     _scripta <<EOF | ||||
| ################################################################################ | ||||
| # push | ||||
| if [ -n "\$push" ]; then | ||||
| esection "Pousser branches et tags" | ||||
| EOF | ||||
|     [ -n "$BEFORE_PUSH_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $BEFORE_PUSH_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _script_push_branches | ||||
|     _script_push_tags | ||||
|     [ -n "$AFTER_PUSH_RELEASE" ] && _scripta <<EOF | ||||
| ( | ||||
| $AFTER_PUSH_RELEASE | ||||
| )$or_die | ||||
| EOF | ||||
|     _scripta <<EOF | ||||
| fi | ||||
| EOF | ||||
| 
 | ||||
|     [ -z "$ManualRelease" -a -n "$Merge" ] && ShouldMerge= || ShouldMerge=1 | ||||
|     [ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush= | ||||
|     if [ -n "$_Fake" ]; then | ||||
|         cat "$script" | ||||
|     elif ! "$script" create ${Merge:+merge} ${Push:+push}; then | ||||
|         eimportant "\ | ||||
| Le script $script a été lancé avec les arguments 'create${Merge:+ merge}${Push:+ push}' | ||||
| En cas d'erreur de merge, veuillez corriger les erreurs puis continuer avec | ||||
|     git merge --continue | ||||
| Veuillez aussi consulter le script et/ou le relancer | ||||
|     ./$script${Push:+ push}" | ||||
|         die | ||||
|     elif [ -n "$Merge" -a -n "$Push" ]; then | ||||
|         [ -n "$_KeepScript" ] || rm "$script" | ||||
|     else | ||||
|         einfo "\ | ||||
| Le script $script a été lancé avec les arguments 'create${Merge:+ merge}${Push:+ push}' | ||||
| Vous pouvez consulter le script et/ou le relancer | ||||
|     ./$script${ShouldMerge:+ merge}${ShouldPush:+ push}" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function merge_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 merge_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= | ||||
| _Fake= | ||||
| _KeepScript= | ||||
| action=release | ||||
| ShowLevel=0 | ||||
| [ -z "$PMAN_NO_MERGE" ] && Merge=1 || Merge= | ||||
| [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= | ||||
| Version= | ||||
| CurrentVersion= | ||||
| ForceCreate= | ||||
| args=( | ||||
|     "faire une nouvelle release à partir de la branche source" | ||||
|     " -v VERSION [source] | ||||
| 
 | ||||
| CONFIGURATION | ||||
| Le fichier .pman.conf contient la configuration des branches. Les variables | ||||
| supplémentaires suivantes peuvent être définies: | ||||
|     BEFORE_CREATE_RELEASE | ||||
|     AFTER_CREATE_RELEASE | ||||
|     BEFORE_MERGE_RELEASE | ||||
|     AFTER_MERGE_RELEASE | ||||
|     BEFORE_PUSH_RELEASE | ||||
|     AFTER_PUSH_RELEASE" | ||||
|     -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" | ||||
|     --fake _Fake=1 "++option non documentée" | ||||
|     --keep-script _KeepScript=1 "++option non documentée" | ||||
|     -w,--show '$action=show; inc@ ShowLevel' "\ | ||||
| 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" | ||||
|     --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" | ||||
|     --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 Version= "\ | ||||
| spécifier la version de la release à créer" | ||||
|     -C,--current-version CurrentVersion=1 "++\ | ||||
| si aucune version n'est spécifiée, prendre la version présente dans le fichier VERSION.txt" | ||||
|     -f,--force-create ForceCreate=1 "\ | ||||
| forcer la création de la release même si le tag correspond à la version existe déjà" | ||||
| ) | ||||
| parse_args "$@"; set -- "${args[@]}" | ||||
| 
 | ||||
| # charger la configuration | ||||
| ensure_gitdir "$chdir" | ||||
| load_branches all | ||||
| load_config "$MYNAME" | ||||
| load_branches current "$1"; shift | ||||
| 
 | ||||
| [ -n "$Merge" -a -n "$NOAUTO" ] && ManualRelease=1 || ManualRelease= | ||||
| [ -n "$ManualRelease" ] && Merge= | ||||
| [ -z "$Merge" ] && Push= | ||||
| 
 | ||||
| resolve_should_push quiet | ||||
| 
 | ||||
| # puis faire l'action que l'on nous demande | ||||
| case "$action" in | ||||
| show) | ||||
|     git_check_cleancheckout || ewarn "$git_cleancheckout_DIRTY" | ||||
|     ensure_branches | ||||
|     show_action "$@" | ||||
|     ;; | ||||
| release) | ||||
|     [ -z "$_Fake" ] && git_ensure_cleancheckout | ||||
|     ensure_branches | ||||
|     case "$SrcType" in | ||||
|     release) merge_release_action "$@";; | ||||
|     hotfix) merge_hotfix_action "$@";; | ||||
|     *) create_release_action "$@";; | ||||
|     esac | ||||
|     ;; | ||||
| *) | ||||
|     die "$action: action non implémentée" | ||||
|     ;; | ||||
| esac | ||||
							
								
								
									
										60
									
								
								wip/pwip
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										60
									
								
								wip/pwip
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,60 @@ | ||||
| #!/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 nouvelle branche" | ||||
| 
 | ||||
| chdir= | ||||
| Origin= | ||||
| ConfigBranch= | ||||
| ConfigFile= | ||||
| [ -z "$PMAN_NO_PUSH" ] && Push=1 || Push= | ||||
| args=( | ||||
|     "créer une branche de feature" | ||||
|     "<feature>" | ||||
|     -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 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user