#!/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_repo_action() { [ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé" local -a push_branches if [ ! -f .pman.conf ]; then ac_set_tmpfile config cp "$ConfigFile" "$config" "${EDITOR:-nano}" "$config" [ -s "$config" ] || exit_with ewarn "Initialisation du dépôt annulée" 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 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 [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" [ -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é?)" enote "Vous allez créer la branche ${COULEUR_VERTE}$DEVELOP${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" ask_yesno "Voulez-vous continuer?" O || die local -a push_branches einfo "Création de la branche $DEVELOP" git checkout -b "$DEVELOP" "$MAIN" || die 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 "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" [ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" enote "Vous allez créer la branche ${COULEUR_VERTE}$UPSTREAM${COULEUR_NORMALE}" ask_yesno "Voulez-vous continuer?" O || die 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 "$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é?)" enote "Vous allez créer la branche ${COULEUR_VERTE}$DIST${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}" ask_yesno "Voulez-vous continuer?" O || die 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="${1#$FEATURE}" [ -n "$branch" ] || die "Vous devez définir la nom de la branche à créer" branch="$FEATURE$branch" if ! array_contains AllBranches "$branch"; then [ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie" [ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)" enote "Vous allez créer la branche ${COULEUR_VERTE}$branch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$DEVELOP${COULEUR_NORMALE}" ask_yesno "Voulez-vous continuer?" O || die 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 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" -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" ) 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 "$@" ;; *) die "$action: action non implémentée" ;; esac