nutools/pdev

336 lines
12 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
if [ $# -eq 1 -a "$1" == --nutools-completion ]; then
echo '
function __pdev_completion() {
local cur
_get_comp_words_by_ref cur
COMPREPLY=($(compgen -W "$(__pdev_branches)" "$cur"))
}
complete -F __pdev_completion pdev
'
2015-03-18 17:45:36 +04:00
exit 0
fi
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire 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'
2015-03-09 16:06:05 +04:00
-o, --offline
En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
tenter le cas échéant de traquer la branche dans l'origine; ne pas
supprimer une branche dans l'origine. Cette option est automatiquement
activée si la variable UTOOLS_VCS_OFFLINE est définie.
2015-03-09 16:06:05 +04:00
--online
Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
2015-06-07 13:59:58 +04:00
--sync
Faire un certain nombre d'opération pour 'corriger' le dépôt local: pour
chacune des branches distantes, vérifier qu'il existe une branche locale
qui la traque, et pour chaque feature branche locale, vérifier qu'il
existe une branche distante associée. Cette option nécessite --online
2022-01-25 09:54:48 +04:00
--check
Vérifier uniquement l'existence d'une branche develop
2015-07-01 03:08:23 +04:00
-s, --squash COMMIT_MSG
Si la branche actuelle est une feature branch, la merger comme un seul
commit avec le message COMMIT_MSG dans develop puis la supprimer. Puis
basculer sur la branche develop.
Cette option ne devrait pas être utilisée avec -k, puisque bien que les
modifications soient mergées, la branche elle-même n'est pas considérée
comme mergée. Les résultats sont donc indéfinis si la branche est mergée
à plusieurs reprises.
-b, --rebase
Si la branche actuelle est une feature branch, lancer 'git rebase -i'
sur la feature branch. Cela permet de réordonner les commits pour
nettoyer l'historique avant de fusionner la branche avec -m
Cette option devrait le cas échéant être utilisée immédiatement avant -m
ou alors il faut forcer le push et communiquer avec l'équipe sur le fait
que la branche de feature a été rebasée.
-m, --merge
Si la branche actuelle est une feature branch, la merger dans develop
puis la supprimer. Puis basculer sur la branche develop.
--merge-log
2015-07-01 03:08:23 +04:00
Ajouter un résumé des modifications sur la feature branch en ajoutant le
log en une ligne de chaque commit dans le message du merge. Cette option
n'est en principe pas nécessaire puisque 'prel -um' intègre la liste des
commits dans CHANGES.txt
-k, --keep
Avec l'option -m, ne pas supprimer une feature branch après l'avoir
2015-07-01 03:08:23 +04:00
fusionnée dans develop. Cela permet d'intégrer les modifications petit à
petit.
--delete
Supprimer une feature branch, à condition qu'elle aie déjà été
entièrement fusionnée dans la branch develop
--force-delete
2015-03-26 20:08:35 +04:00
Supprimer une feature branch, même si elle n'a pas encore été fusionnée
dans la branche develop
-l, --log
-d, --diff
2017-06-27 11:03:25 +04:00
-n, --name-only
Afficher les modifications entre deux branches. L'option --log affiche
les modifications dans l'ordre alors que --diff affiche les différences
sous forme de diff. Les deux options peuvent être combinées et ont
2017-06-27 11:03:25 +04:00
l'effet de 'git log -p'. L'option -n implique -d et permet de n'afficher
que les noms des fichiers qui ont été modifiés.
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
2015-07-01 03:08:23 +04:00
squash_msg=
rebase_int=
merge_log=
merge_delete=1
2015-03-31 17:44:21 +04:00
force_delete=
log=
diff=
2017-06-27 11:03:25 +04:00
name_only=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-C:,--projdir: projdir= \
-O:,--origin: origin= \
2015-03-09 16:06:05 +04:00
-o,--offline UTOOLS_VCS_OFFLINE=1 \
--online UTOOLS_VCS_OFFLINE= \
2015-06-07 13:59:58 +04:00
--sync action=sync \
2022-01-25 09:54:48 +04:00
--check action=check \
2015-07-01 03:08:23 +04:00
-s:,--squash: '$action=squash; set@ squash_msg' \
-b,--rebase '$action=none; rebase_int=1' \
-m,--merge action=merge \
--merge-log merge_log=1 \
-k,--keep merge_delete= \
--delete action=delete \
--force-delete '$action=delete; force_delete=1' \
-l,--log '$action=diff; log=1' \
-d,--diff '$action=diff; diff=1' \
2017-06-27 11:03:25 +04:00
-n,--name-only '$action=diff; diff=1; name_only=1' \
@ 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
2015-06-07 13:59:58 +04:00
if [ "$action" == sync ]; then
[ -z "$UTOOLS_VCS_OFFLINE" ] || die "L'option --sync nécessite le mode --online"
version="$(LANG=C git version)"
version="${version#git version }"
eval "version=(${version//./ })"
2015-06-07 13:59:58 +04:00
setx -a branches=list_feature_branches "$origin"
for branch in "${branches[@]}"; do
git_track_branch "$branch" "$origin"
2015-06-07 13:59:58 +04:00
done
exit $?
2022-01-25 09:54:48 +04:00
elif [ "$action" == check ]; then
if git_have_branch develop; then
einfo "La branche develop existe"
exit 0
else
die "La branche develop n'existe pas"
fi
2015-06-07 13:59:58 +04:00
fi
2015-02-19 17:04:59 +04:00
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
if [ "$action" == branch ]; then
feature="$1"
source="${2:-develop}"
2015-08-20 07:58:17 +04:00
if [ -z "$feature" ]; then
2015-03-28 01:11:24 +04:00
setx -a branches=list_feature_branches "$origin"
2015-08-20 07:58:17 +04:00
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
2015-08-20 07:58:17 +04:00
# On est peut-être déjà sur la bonne branche
if git_is_branch "$feature"; then
[ -z "$UTOOLS_VCS_OFFLINE" ] && git_track_branch "$feature" "$origin"
git_fast_forward "$feature" "" "$origin"
exit 0
fi
2015-08-20 07:58:17 +04:00
# Créer/basculer vers une feature branch
git_ensure_cleancheckout
2015-03-28 01:30:47 +04:00
is_any_branch "$feature" develop feature || die "$release: ce n'est pas une feature branch"
r=0
if git_have_branch "$feature"; then
git checkout "$feature" || r=$?
elif git_have_rbranch "$feature" "$origin"; then
git checkout -b "$feature" "$origin/$feature" || r=$?
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" || r=$?
fi
[ -z "$UTOOLS_VCS_OFFLINE" ] && git_track_branch "$feature" "$origin"
if [ "$r" -eq 0 ]; then
# éventuellement fast-forwarder automatiquement
git_fast_forward "$feature" "" "$origin"
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 introuvable"
elif is_feature_branch "$branch"; then
feature="$branch"
fi
2015-07-01 03:08:23 +04:00
if [ -n "$rebase_int" ]; then
if [ "$branch" != "$feature" ]; then
# s'assurer qu'on est sur la bonne branche
git checkout "$feature" || die
branch=feature
fi
setx base=git merge-base "$feature" develop
git rebase -i "$base" || die
fi
if [ "$action" == squash -o "$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
2015-03-23 13:51:06 +04:00
estepn "Intégration ${COULEUR_VERTE}$feature${COULEUR_NORMALE} --> ${COULEUR_BLEUE}develop${COULEUR_NORMALE}"
ask_yesno "Voulez-vous continuer?" O || die
# calculer la suite des modifications
2015-07-01 03:08:23 +04:00
merge_msg="Intégration de la branche $feature"
if [ -n "$merge_log" ]; then
setx mergebase=git merge-base develop "$feature"
setx modifs=git log --oneline "$mergebase..$feature"
2015-07-01 03:08:23 +04:00
[ -n "$modifs" ] && merge_msg="$merge_msg
$modifs"
fi
2015-03-31 17:44:21 +04:00
git checkout develop || die
2015-07-01 03:08:23 +04:00
if [ "$action" == squash ]; then
[ -n "$squash_msg" ] || squash_msg="$merge_msg"
git merge "$feature" --squash || die
git commit -m "$squash_msg" || die
# il faut forcer la suppression de la branche, puisqu'elle n'est pas
# considérée comme mergée
force_delete=1
elif [ "$action" == merge ]; then
git merge "$feature" -m "$merge_msg" --no-ff || die
else
die "$action: action imprévue"
fi
2015-03-31 17:44:21 +04:00
# mettre à jour la branche sur laquelle on se trouve
setx branch=git_get_branch
[ -n "$merge_delete" ] && action=delete
fi
if [ "$action" == delete ]; then
if [ -z "$force_delete" ]; then
# vérifier que la branche a été fusionnée
git_is_merged "$feature" develop || die "Refus de supprimer la branche $feature: elle n'a pas été fusionnée dans develop"
fi
if [ "$branch" == "$feature" ]; then
# si on est sur la branche en question, en sortir pour pouvoir la
# supprimer
git checkout develop || die
fi
estepi "Suppression de la branche locale"
git branch -D "$feature"
if git_have_remote "$origin"; then
if [ -z "$UTOOLS_VCS_OFFLINE" ]; then
estepi "Suppression de la branche distante"
git push "$origin" ":$feature"
elif git_have_rbranch "$feature" "$origin"; then
eimportant "\
La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer.
2015-03-09 16:06:05 +04:00
Veuillez le faire manuellement avec la commande suivante:
$(qvals git push "$origin" ":$feature")"
2015-03-09 16:06:05 +04:00
fi
fi
2015-03-31 17:44:21 +04:00
fi
2015-03-31 17:44:21 +04:00
if [ "$action" == diff ]; then
if [ -n "$log" ]; then
if [ -n "$feature" ]; then
2017-06-27 11:03:25 +04:00
git log ${diff:+-p ${name_only:+--name-only}} develop.."$feature"
else
2017-06-27 11:03:25 +04:00
git log ${diff:+-p ${name_only:+--name-only}} master..develop
fi
elif [ -n "$diff" ]; then
if [ -n "$feature" ]; then
2017-06-27 11:03:25 +04:00
git diff ${name_only:+--name-only} develop.."$feature"
else
2017-06-27 11:03:25 +04:00
git diff ${name_only:+--name-only} master..develop
fi
fi
2015-06-07 13:59:58 +04:00
exit $?
fi