nutools/pdev

168 lines
5.7 KiB
Plaintext
Raw Normal View History

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
2015-02-19 16:25:06 +04:00
urequire DEFAULTS ptools
function display_help() {
uecho "$scriptname: basculer sur une branche de développement
USAGE
$scriptname [FEATURE [SOURCE]]
$scriptname -m|-l|-d [FEATURE]
- Vérifier l'existence de la branche develop. La créer si nécessaire en la
basant sur [origin/]master.
- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
commit ou un stash.
- Si FEATURE est spécifié, et si on n'est pas déjà sur cette branche, basculer
vers cette nouvelle branche. S'il s'agit d'une nouvelle branche, la baser sur
la branche SOURCE, qui vaut par défaut develop
- Si FEATURE n'est pas spécifié, basculer sur develop s'il s'agit de la seule
solution, sinon afficher un menu pour choisir la branche de destination.
OPTIONS
-C, --projdir PROJDIR
2015-03-04 11:36:49 +04:00
Spécifier le répertoire de base du projet qui est dans git. Par défaut,
on travaille dans le répertoire courant et on laisse git trouver le
répertoire de base du projet. Avec cette option, le répertoire courant
est modifié avant de lancer les commandes git.
-O, --origin ORIGIN
Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
-m, --merge
Si la branche actuelle est une feature branch, la merger dans develop
puis la supprimer. Puis basculer sur la branche develop.
-l, --log
-d, --diff
Afficher les modifications entre deux branches. L'option --log affiche
les modifications dans l'ordre alors que --diff affiche toutes les
différences sous forme de diff.
La branche comparée, s'il elle n'est pas spécifiée, est par défaut la
branche courante. S'il s'agit d'une feature branch, elle est comparée à
develop. S'il s'agit de la branche develop, elle est comparée à master."
}
2015-03-04 11:36:49 +04:00
projdir=
origin=origin
action=branch
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-C:,--projdir: projdir= \
-O:,--origin: origin= \
-m,--merge action=merge \
-l,--log action=log \
-d,--diff action=diff \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
2015-02-19 16:25:06 +04:00
2015-03-04 11:36:49 +04:00
if [ -n "$projdir" ]; then
cd "$projdir" || die
fi
2015-02-19 17:04:59 +04:00
git_ensure_gitvcs
if ! git_have_branch develop; then
estepn "Configuration de la branche develop"
git_ensure_branch develop master "$origin"
[ $? -eq 2 ] && die "Impossible de créer la branche develop. Veuillez vérifier que la branche master existe"
2015-02-19 17:04:59 +04:00
fi
setx branch=git_get_branch
2015-02-19 16:25:06 +04:00
if [ "$action" == branch ]; then
feature="$1"
source="${2:-develop}"
if [ -z "$feature" ]; then
setx -a branches=list_feature_branches
if [ ${#branches[*]} -eq 0 ]; then
# En l'absence de feature branch, basculer sur develop
feature=develop
else
array_ins branches develop
2015-03-05 20:33:05 +04:00
default_branch="$branch"
array_contains branches "$default_branch" || default_branch=develop
simple_menu feature branches -d "$default_branch" \
-t "Basculer vers une feature branch" \
-m "Veuillez choisir la branche vers laquelle basculer"
fi
fi
# On est peut-être déjà sur la bonne branche
if git_is_branch "$feature"; then
git_track_branch "$feature" "$origin"
exit 0
fi
# Créer/basculer vers une feature branch
git_ensure_cleancheckout
if git_have_branch "$feature"; then
git checkout "$feature"
else
estepn "\
Vous allez créer la nouvelle feature branch ${COULEUR_VERTE}$feature${COULEUR_NORMALE}
à partir de la branche source ${COULEUR_BLEUE}$source${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
git_ensure_branch "$feature" "$source" "$origin"
[ $? -eq 2 ] && die "Impossible de créer la branche $feature. Veuillez vérifier que la branche $source existe"
git checkout "$feature"
fi
exit $?
fi
feature="$1"
if [ -n "$feature" ]; then
is_feature_branch "$feature" || die "$feature: ce n'est pas une feature branch"
git_have_branch "$feature" || die "$feature: branche invalide"
elif is_feature_branch "$branch"; then
feature="$branch"
fi
if [ "$action" == merge ]; then
if [ -z "$feature" ]; then
setx -a branches=list_feature_branches
if [ ${#branches[*]} -eq 0 ]; then
die "Aucune feature branch n'a été trouvée"
elif [ ${#branches[*]} -eq 1 ]; then
feature="${branches[0]}"
estepn "Autosélection de $feature"
else
2015-03-05 20:33:05 +04:00
default_feature="$branch"
array_contains branches "$default_feature" || default_feature="${branches[0]}"
simple_menu feature branches -d "$default_feature" \
-t "Choix de la feature branch" \
-m "Veuillez choisir la branche"
fi
fi
estepn "\
Intégration de la feature branch ${COULEUR_VERTE}$feature${COULEUR_NORMALE}
dans la branche de destination ${COULEUR_BLEUE}develop${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
git checkout develop
git merge "$feature" -m "Intégration de la feature branch $feature" --no-ff || die
estepi "Suppression de la branche locale"
git branch -d "$feature"
if git_have_remote origin; then
estepi "Suppression de la branche distante"
git push origin ":$feature"
fi
elif [ "$action" == log ]; then
if [ -n "$feature" ]; then
git log develop.."$feature"
else
git log master..develop
fi
elif [ "$action" == diff ]; then
if [ -n "$feature" ]; then
git diff develop.."$feature"
else
git diff master..develop
fi
fi