diff --git a/pdev b/pdev index 9d95918..ab18040 100755 --- a/pdev +++ b/pdev @@ -54,15 +54,33 @@ OPTIONS qui la traque, et pour chaque feature branche locale, vérifier qu'il existe une branche distante associée. Cette option nécessite --online + -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 - Ajouter un résumé des modifications sur la feature branch dans le - message du merge + 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 - fusionnée dans develop. + 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 @@ -84,6 +102,8 @@ OPTIONS projdir= origin=origin action=branch +squash_msg= +rebase_int= merge_log= merge_delete=1 force_delete= @@ -96,6 +116,8 @@ parse_opts "${PRETTYOPTS[@]}" \ -o,--offline UTOOLS_VCS_OFFLINE=1 \ --online UTOOLS_VCS_OFFLINE= \ --sync action=sync \ + -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= \ @@ -192,7 +214,17 @@ elif is_feature_branch "$branch"; then feature="$branch" fi -if [ "$action" == merge ]; then +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 @@ -213,16 +245,27 @@ if [ "$action" == merge ]; then ask_yesno "Voulez-vous continuer?" O || die # calculer la suite des modifications - mergemsg="Intégration de la branche $feature" + 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" - [ -n "$modifs" ] && mergemsg="$mergemsg + [ -n "$modifs" ] && merge_msg="$merge_msg $modifs" fi git checkout develop || die - git merge "$feature" -m "$mergemsg" --no-ff || die + 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 # mettre à jour la branche sur laquelle on se trouve setx branch=git_get_branch