327 lines
9.8 KiB
Bash
Executable File
327 lines
9.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
|
|
|
|
################################################################################
|
|
# 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 _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"
|
|
[ -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
|
|
|
|
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"
|
|
[ -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
|
|
|
|
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"
|
|
[ -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
|
|
|
|
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 "$@";;
|
|
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|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
|