281 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 | |
|         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"
 | |
| 
 | |
|    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
 | |
| [ -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 "\
 | |
| 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
 |