372 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			372 lines
		
	
	
		
			11 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
 | |
| 
 | |
| ################################################################################
 | |
| # 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; 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
 |