nulib/wip/pman

248 lines
7.8 KiB
Plaintext
Raw Normal View History

2025-02-26 11:43:33 +04:00
#!/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
2025-02-26 17:31:59 +04:00
CurrentType=SrcType
2025-02-26 11:43:33 +04:00
)
function show_action() {
2025-02-26 17:31:59 +04:00
local var src
2025-02-26 11:43:33 +04:00
echo_setv ConfigBranch="$ConfigBranch"
echo_setv ConfigFile="$(ppath "$ConfigFile")"
for var in "${SHOW_VARS[@]}"; do
if [ "${var#--}" != "$var" ]; then
estep "${var#--}"
else
2025-02-26 17:31:59 +04:00
splitfsep "$var" = var src
[ -n "$src" ] || src="$var"
echo_setv "$var=${!src}"
2025-02-26 11:43:33 +04:00
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
2025-02-26 11:43:33 +04:00
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
2025-02-26 15:54:13 +04:00
[ -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
2025-02-26 17:31:59 +04:00
local -a push_branches
2025-02-26 11:43:33 +04:00
einfo "Création de la branche $DEVELOP"
2025-02-26 17:31:59 +04:00
git checkout -b "$DEVELOP" "$MAIN" || die
2025-02-26 11:43:33 +04:00
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"
2025-02-26 15:54:13 +04:00
[ -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é?)"
2025-02-26 11:43:33 +04:00
2025-02-26 15:54:13 +04:00
enote "Vous allez créer la branche ${COULEUR_VERTE}$UPSTREAM${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
2025-02-26 17:31:59 +04:00
local -a push_branches; local config
2025-02-26 11:43:33 +04:00
# 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"
2025-02-26 15:54:13 +04:00
[ -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é?)"
2025-02-26 11:43:33 +04:00
2025-02-26 15:54:13 +04:00
enote "Vous allez créer la branche ${COULEUR_VERTE}$DIST${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$MAIN${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
2025-02-26 17:31:59 +04:00
local -a push_branches
2025-02-26 11:43:33 +04:00
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() {
2025-02-26 11:46:25 +04:00
local branch="${1#$FEATURE}"
2025-02-26 11:43:33 +04:00
[ -n "$branch" ] || die "Vous devez définir la nom de la branche à créer"
2025-02-26 11:46:25 +04:00
branch="$FEATURE$branch"
2025-02-26 11:43:33 +04:00
if ! array_contains AllBranches "$branch"; then
[ -n "$DEVELOP" ] || die "La branche DEVELOP n'a pas été définie"
2025-02-26 15:54:13 +04:00
[ -n "$DevelopBranch" ] || die "$DEVELOP: cette branche n'existe pas (le dépôt a-t-il été initialisé?)"
2025-02-26 11:43:33 +04:00
2025-02-26 15:54:13 +04:00
enote "Vous allez créer la branche ${COULEUR_VERTE}$branch${COULEUR_NORMALE} <-- ${COULEUR_BLEUE}$DEVELOP${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
2025-02-26 17:31:59 +04:00
local -a push_branches
2025-02-26 11:43:33 +04:00
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"
2025-02-26 15:54:13 +04:00
"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"
2025-02-26 11:43:33 +04:00
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
2025-02-26 17:31:59 +04:00
-B:,--config-branch ConfigBranch= "++\
2025-02-26 11:43:33 +04:00
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"
2025-02-26 17:31:59 +04:00
-w,--show-config action=show "++\
2025-02-26 11:43:33 +04:00
afficher la configuration chargée"
2025-02-26 17:31:59 +04:00
-O:,--origin Origin= "++\
2025-02-26 11:43:33 +04:00
origine vers laquelle pousser les branches"
-n,--no-push Push= "\
ne pas pousser les branches vers leur origine après leur création"
2025-02-26 17:31:59 +04:00
--push Push=1 "++\
2025-02-26 11:43:33 +04:00
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 "$@"
;;
esac