diff --git a/lib/profile.d/nutools.userconf b/lib/profile.d/nutools.userconf index 676a470..3c40faa 100644 --- a/lib/profile.d/nutools.userconf +++ b/lib/profile.d/nutools.userconf @@ -40,5 +40,8 @@ # Activer le mode offline pour git (pas de push automatique) #export UTOOLS_VCS_OFFLINE=1 +# Activer automatiquement l'option --clean pour 'uproject update' +#export UTOOLS_VCS_CLEANUPDATE=1 + # Faire un alias ssh pour ussh #export UTOOLS_USSH_ALIAS=1 diff --git a/lib/ulib/vcs b/lib/ulib/vcs index b7dcca9..43e59c5 100644 --- a/lib/ulib/vcs +++ b/lib/ulib/vcs @@ -441,16 +441,28 @@ function git_commit() { function git_status() { git status "$@" } +function __git_update_lbranches() { + git for-each-ref refs/heads/ --format='%(refname:short)' | + grep -vF master | + grep -vF develop | + grep -v '^release-' | + grep -v '^hotfix-' +} function git_update() { - local args autoff=1 + local args autoff=1 clean=auto parse_opts + "${PRETTYOPTS[@]}" \ -x '$_vcs_unsupported -x' \ + -c,--clean-before clean=1 \ + --no-clean-before clean= \ -n,--no-autoff autoff= \ @ args -- "$@" && set -- "${args[@]}" || { eerror "$args" return 1 } + if [ "$clean" == auto ]; then + [ -n "$UTOOLS_VCS_CLEANUPDATE" ] && clean=1 || clean= + fi if [ -z "$autoff" ]; then git pull "$@" return $? @@ -459,6 +471,18 @@ function git_update() { local branch orig_branch restore_branch remote rbranch pbranch local -a branches prbranches crbranches dbranches + if [ -n "$clean" ]; then + git_ensure_cleancheckout + array_from_lines prbranches "$(git_list_rbranches)" + if git_have_branch develop; then + git checkout -q develop + array_from_lines branches "$(__git_update_lbranches)" + for branch in "${branches[@]}"; do + #XXX pour chaque branche, vérifier l'origine + done + fi + fi + array_from_lines prbranches "$(git_list_rbranches)" git fetch -p "$@" || return array_from_lines crbranches "$(git_list_rbranches)" diff --git a/uproject b/uproject index 0010d14..9d5c7a8 100755 --- a/uproject +++ b/uproject @@ -44,6 +44,14 @@ COMMANDS update [-x] Mettre à jour la copie locale avec la copie sur le serveur. -x Ne pas mettre à jour les références externes (si appliquable) + -c, --clean-before + Avant de faire git pull, supprimer toutes les branches locales qui + sont à jour par rapport à l'origine. La copie de travail doit être + propre. Basculer sur la branche develop avant de supprimer les + branches. S'il n'y a pas de branche develop, c'est un NOP. + --no-clean-before + Neutraliser l'activation de l'option --clean-before par la variable + UTOOLS_VCS_CLEANUPDATE si elle est renseignée. -n, --no-autoff Ne pas faire de fast-forward automatique pour toutes les branches traquées. Par défaut, s'il n'y a pas de modifications locales,